Skip to content

Commit

Permalink
Bug#29915479 RUNNING COM_REGISTER_SLAVE WITHOUT COM_BINLOG_DUMP CAN R…
Browse files Browse the repository at this point in the history
…ESULTS IN SERVER EXIT

in fact, in MariaDB it cannot, but it can show spurious slaves
in SHOW SLAVE HOSTS.

slave was registered in COM_REGISTER_SLAVE and un-registered after
COM_BINLOG_DUMP. If there was no COM_BINLOG_DUMP, it would never
unregister.
  • Loading branch information
vuvova committed Apr 30, 2020
1 parent 8c534bd commit 6bb28e0
Show file tree
Hide file tree
Showing 5 changed files with 52 additions and 1 deletion.
16 changes: 16 additions & 0 deletions mysql-test/suite/rpl/r/rpl_fail_register.result
Original file line number Diff line number Diff line change
@@ -0,0 +1,16 @@
include/master-slave.inc
[connection master]
set @old_dbug=@@global.debug_dbug;
set global debug_dbug='d,fail_com_register_slave';
stop slave;
reset slave;
include/wait_for_slave_to_stop.inc
start slave;
stop slave;
include/wait_for_slave_to_stop.inc
set global debug_dbug=@old_dbug;
kill DUMP_THREAD;
show slave hosts;
Server_id Host Port Master_id
start slave;
include/rpl_end.inc
33 changes: 33 additions & 0 deletions mysql-test/suite/rpl/t/rpl_fail_register.test
Original file line number Diff line number Diff line change
@@ -0,0 +1,33 @@
source include/have_debug.inc;
source include/have_binlog_format_mixed.inc;
source include/master-slave.inc;

connection slave;

set @old_dbug=@@global.debug_dbug;
set global debug_dbug='d,fail_com_register_slave';

stop slave;
reset slave;
source include/wait_for_slave_to_stop.inc;
start slave;
stop slave;
source include/wait_for_slave_to_stop.inc;
set global debug_dbug=@old_dbug;

connection master;

### why is that needed?
let $id=`SELECT id from information_schema.processlist where command='Binlog Dump'`;
if ($id) {
replace_result $id DUMP_THREAD;
eval kill $id;
let $wait_condition= SELECT count(*)=0 from information_schema.processlist where command='Binlog Dump';
source include/wait_condition.inc;
}

show slave hosts;

connection slave;
start slave;
source include/rpl_end.inc;
1 change: 1 addition & 0 deletions sql/slave.cc
Original file line number Diff line number Diff line change
Expand Up @@ -3179,6 +3179,7 @@ pthread_handler_t handle_slave_io(void *arg)
goto err;
goto connected;
}
DBUG_EXECUTE_IF("fail_com_register_slave", goto err;);
}

DBUG_PRINT("info",("Starting reading binary log from master"));
Expand Down
2 changes: 2 additions & 0 deletions sql/sql_class.cc
Original file line number Diff line number Diff line change
Expand Up @@ -63,6 +63,7 @@
#include "sql_parse.h" // is_update_query
#include "sql_callback.h"
#include "sql_connect.h"
#include "repl_failsafe.h"

/*
The following is used to initialise Table_ident with a internal
Expand Down Expand Up @@ -1496,6 +1497,7 @@ THD::~THD()
if (rli_slave)
rli_slave->cleanup_after_session();
my_free(semisync_info);
unregister_slave(this, true, true);
#endif

free_root(&main_mem_root, MYF(0));
Expand Down
1 change: 0 additions & 1 deletion sql/sql_parse.cc
Original file line number Diff line number Diff line change
Expand Up @@ -1269,7 +1269,6 @@ bool dispatch_command(enum enum_server_command command, THD *thd,
general_log_print(thd, command, "Log: '%s' Pos: %lu", name, pos);
if (nlen < FN_REFLEN)
mysql_binlog_send(thd, thd->strmake(name, nlen), (my_off_t)pos, flags);
unregister_slave(thd,1,1);
/* fake COM_QUIT -- if we get here, the thread needs to terminate */
error = TRUE;
break;
Expand Down

0 comments on commit 6bb28e0

Please sign in to comment.