commit 68f33c86038832c5501ba660b5d1a0cfc4e93e5b Author: wenfeng.zhang Date: Thu Jul 23 10:40:24 2020 +0800 gr test relay log diff --git a/mysql-test/suite/group_replication/t/gr_create_db_shutdown.cnf b/mysql-test/suite/group_replication/t/gr_create_db_shutdown.cnf new file mode 100644 index 00000000000..d39e67fb5a8 --- /dev/null +++ b/mysql-test/suite/group_replication/t/gr_create_db_shutdown.cnf @@ -0,0 +1,33 @@ +!include ../my.cnf + +[mysqld.1] +local-infile= true +loose-group_replication_start_on_boot= OFF +loose-group_replication_single_primary_mode= True +loose-group_replication_enforce_update_everywhere_checks= False +loose-group_replication_recovery_get_public_key= TRUE +loose-group_replication_exit_state_action= READ_ONLY +loose-group_replication_consistency= BEFORE_AND_AFTER +loose-group_replication_group_name=aabbccdd-aaaa-aaaa-aaaa-aabbccddeeff + +[mysqld.2] +loose-group_replication_start_on_boot= OFF +loose-group_replication_single_primary_mode= True +loose-group_replication_enforce_update_everywhere_checks= False +loose-group_replication_recovery_get_public_key= TRUE +loose-group_replication_exit_state_action= READ_ONLY +loose-group_replication_consistency= BEFORE_AND_AFTER +loose-group_replication_group_name=aabbccdd-aaaa-aaaa-aaaa-aabbccddeeff + +[mysqld.3] +loose-group_replication_start_on_boot= OFF +loose-group_replication_single_primary_mode= True +loose-group_replication_enforce_update_everywhere_checks= False +loose-group_replication_recovery_get_public_key= TRUE +loose-group_replication_exit_state_action= READ_ONLY +loose-group_replication_consistency= BEFORE_AND_AFTER +loose-group_replication_group_name=aabbccdd-aaaa-aaaa-aaaa-aabbccddeeff + +[ENV] +SERVER_MYPORT_3= @mysqld.3.port +SERVER_MYSOCK_3= @mysqld.3.socket diff --git a/mysql-test/suite/group_replication/t/gr_create_db_shutdown.test b/mysql-test/suite/group_replication/t/gr_create_db_shutdown.test new file mode 100644 index 00000000000..032e4296196 --- /dev/null +++ b/mysql-test/suite/group_replication/t/gr_create_db_shutdown.test @@ -0,0 +1,139 @@ +--source include/big_test.inc +--source include/force_restart.inc +--source include/have_group_replication_plugin.inc +--let $rpl_server_count= 3 + +connect (conn1,127.0.0.1,root,,test,$SERVER_MYPORT_1,); +connect (conn1_2,127.0.0.1,root,,test,$SERVER_MYPORT_1,); +connect (conn2,127.0.0.1,root,,test,$SERVER_MYPORT_2,); +connect (conn3,127.0.0.1,root,,test,$SERVER_MYPORT_3,); +--disable_query_log +connection conn1; +--let $_server_id= `SELECT @@server_id` +--let $expect_file_name_1= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect +--let $mysqld_pid_file_1=`SELECT @@GLOBAL.pid_file` +set sql_log_bin=off; +call mtr.add_suppression("Plugin group_replication reported"); +set sql_log_bin=on; +connection conn2; +--let $_server_id= `SELECT @@server_id` +--let $expect_file_name_2= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect +--let $mysqld_pid_file_2=`SELECT @@GLOBAL.pid_file` +set sql_log_bin=off; +call mtr.add_suppression("Plugin group_replication reported"); +set sql_log_bin=on; +connection conn3; +--let $_server_id= `SELECT @@server_id` +--let $expect_file_name_3= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect +--let $mysqld_pid_file_3=`SELECT @@GLOBAL.pid_file` +set sql_log_bin=off; +call mtr.add_suppression("Plugin group_replication reported"); +set sql_log_bin=on; +--enable_query_log + +--source include/group_replication.inc +connection conn1; +--echo connect conn1 +SET PERSIST group_replication_local_address=@@group_replication_local_address, PERSIST group_replication_group_seeds=@@group_replication_group_seeds; +SELECT group_replication_set_as_primary(@@server_uuid); +SELECT * FROM performance_schema.replication_group_members; +CREATE TABLE t1 (c1 INT PRIMARY KEY, c2 INT) ENGINE=InnoDB; +SHOW TABLES; +connection conn2; +--echo connect conn2 +SET PERSIST group_replication_local_address=@@group_replication_local_address, PERSIST group_replication_group_seeds=@@group_replication_group_seeds; +SHOW TABLES; +connection conn3; +--echo connect conn3 +SET PERSIST group_replication_local_address=@@group_replication_local_address, PERSIST group_replication_group_seeds=@@group_replication_group_seeds; +SHOW TABLES; + +--echo ## n2 will not write relaylog +connection conn2; +--echo connect conn2 +SET GLOBAL DEBUG='+d,wait_write_realylog_until_server_down'; +--echo ## n3 will write relaylog, while not finish transaction +connection conn3; +--echo connect conn3 +SET GLOBAL DEBUG='+d,wait_until_server_down'; +connection conn1_2; +--echo connect conn1_2 +--send INSERT INTO t1 VALUES (1,1),(2,2); + +--echo ## sleep 10 to ensure n3 already write relaylog +--echo ## then shutdown n3 first +sleep 10; +connection conn3; +--echo connect conn3 +--echo [shutdown n3] +--let $mysqld_pid_file=$mysqld_pid_file_3 +--source include/expect_crash.inc +exec kill -9 `cat $mysqld_pid_file`; +--echo ## wait n3 leave the group_replication +--echo ## then shutdown n2 later +connection conn2; +--echo connection conn2 +--let $wait_condition= SELECT COUNT(*)=2 FROM performance_schema.replication_group_members WHERE member_state='ONLINE'; +--source include/wait_condition.inc +SELECT * FROM performance_schema.replication_group_members; +--echo [shutdown n2] +--let $mysqld_pid_file=$mysqld_pid_file_2 +--source include/expect_crash.inc +exec kill -9 `cat $mysqld_pid_file`; +connection conn1; +--echo connection conn1 +--echo ## and then shutdown n1 +--echo [shutdown n1] +--let $mysqld_pid_file=$mysqld_pid_file_1 +--source include/expect_crash.inc +exec kill -9 `cat $mysqld_pid_file`; + + +--echo [start n3] +--connection conn3 +--echo connect conn3 +--let $_expect_file_name= $expect_file_name_3 +--enable_reconnect +--source include/start_mysqld.inc +SELECT * FROM t1; +SELECT @@gtid_executed; +--echo [start n2] +--connection conn2 +--echo connect conn2 +--let $_expect_file_name= $expect_file_name_2 +--enable_reconnect +--source include/start_mysqld.inc +SELECT * FROM t1; +SELECT @@gtid_executed; +--echo [start n1] +--connection conn1 +--echo connect conn1 +--let $_expect_file_name= $expect_file_name_1 +--enable_reconnect +--source include/start_mysqld.inc +SELECT * FROM t1; +SELECT @@gtid_executed; + +connection conn1; +--echo connect conn1 +set global group_replication_bootstrap_group=on; +start group_replication; +--let $wait_condition= SELECT COUNT(*)=1 FROM performance_schema.replication_group_members WHERE member_state='ONLINE'; +--source include/wait_condition.inc +set global group_replication_bootstrap_group=oFF; +SELECT * FROM t1; +INSERT INTO t1 VALUES (11,11),(22,22); +connection conn2; +--echo connect conn2 +start group_replication; +--let $wait_condition= SELECT COUNT(*)=2 FROM performance_schema.replication_group_members WHERE member_state='ONLINE'; +--source include/wait_condition.inc +SELECT * FROM performance_schema.replication_group_members; +SELECT * FROM t1; +connection conn3; +--echo connect conn3 +SELECT * FROM t1; +--error 3092 +start group_replication; +SELECT * FROM performance_schema.replication_group_members; +SELECT * FROM t1; diff --git a/sql/binlog.cc b/sql/binlog.cc index cbadf8da97e..0fe26abda4e 100644 --- a/sql/binlog.cc +++ b/sql/binlog.cc @@ -6977,6 +6977,10 @@ bool MYSQL_BIN_LOG::write_event(Log_event *ev, Master_info *mi) { bool MYSQL_BIN_LOG::write_buffer(uchar *buf, uint len, Master_info *mi) { DBUG_TRACE; + while ( + DBUG_EVALUATE_IF("wait_write_realylog_until_server_down", true, false)) { + sleep(1); + } // check preconditions DBUG_ASSERT(is_relay_log); mysql_mutex_assert_owner(&LOCK_log); diff --git a/sql/sql_parse.cc b/sql/sql_parse.cc index 251d740ed36..4efec4bdc30 100644 --- a/sql/sql_parse.cc +++ b/sql/sql_parse.cc @@ -3603,6 +3603,11 @@ int mysql_execute_command(THD *thd, bool first_level) { case SQLCOM_ASSIGN_TO_KEYCACHE: case SQLCOM_PRELOAD_KEYS: case SQLCOM_LOAD: { + if (thd->rli_slave) { + while (DBUG_EVALUATE_IF("wait_until_server_down", true, false)) { + sleep(1); + } + } DBUG_ASSERT(first_table == all_tables && first_table != 0); DBUG_ASSERT(lex->m_sql_cmd != NULL); res = lex->m_sql_cmd->execute(thd);