Bug#29915479 RUNNING COM_REGISTER_SLAVE WITHOUT COM_BINLOG_DUMP CAN RESULTS 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.
This commit is contained in:
parent
8c534bdeb8
commit
6bb28e0bc5
16
mysql-test/suite/rpl/r/rpl_fail_register.result
Normal file
16
mysql-test/suite/rpl/r/rpl_fail_register.result
Normal file
@ -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
mysql-test/suite/rpl/t/rpl_fail_register.test
Normal file
33
mysql-test/suite/rpl/t/rpl_fail_register.test
Normal file
@ -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;
|
@ -3179,6 +3179,7 @@ connected:
|
|||||||
goto err;
|
goto err;
|
||||||
goto connected;
|
goto connected;
|
||||||
}
|
}
|
||||||
|
DBUG_EXECUTE_IF("fail_com_register_slave", goto err;);
|
||||||
}
|
}
|
||||||
|
|
||||||
DBUG_PRINT("info",("Starting reading binary log from master"));
|
DBUG_PRINT("info",("Starting reading binary log from master"));
|
||||||
|
@ -63,6 +63,7 @@
|
|||||||
#include "sql_parse.h" // is_update_query
|
#include "sql_parse.h" // is_update_query
|
||||||
#include "sql_callback.h"
|
#include "sql_callback.h"
|
||||||
#include "sql_connect.h"
|
#include "sql_connect.h"
|
||||||
|
#include "repl_failsafe.h"
|
||||||
|
|
||||||
/*
|
/*
|
||||||
The following is used to initialise Table_ident with a internal
|
The following is used to initialise Table_ident with a internal
|
||||||
@ -1496,6 +1497,7 @@ THD::~THD()
|
|||||||
if (rli_slave)
|
if (rli_slave)
|
||||||
rli_slave->cleanup_after_session();
|
rli_slave->cleanup_after_session();
|
||||||
my_free(semisync_info);
|
my_free(semisync_info);
|
||||||
|
unregister_slave(this, true, true);
|
||||||
#endif
|
#endif
|
||||||
|
|
||||||
free_root(&main_mem_root, MYF(0));
|
free_root(&main_mem_root, MYF(0));
|
||||||
|
@ -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);
|
general_log_print(thd, command, "Log: '%s' Pos: %lu", name, pos);
|
||||||
if (nlen < FN_REFLEN)
|
if (nlen < FN_REFLEN)
|
||||||
mysql_binlog_send(thd, thd->strmake(name, nlen), (my_off_t)pos, flags);
|
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 */
|
/* fake COM_QUIT -- if we get here, the thread needs to terminate */
|
||||||
error = TRUE;
|
error = TRUE;
|
||||||
break;
|
break;
|
||||||
|
Loading…
x
Reference in New Issue
Block a user