From e783f96164c04c983fb11d4917668644cdca3ba5 Mon Sep 17 00:00:00 2001 From: dcthxdhuang Date: Thu, 14 Apr 2022 16:34:17 +0800 Subject: [PATCH] Reproduce the shutdown hang problem --- ...n_hang_due_to_dump_thread_stick-master.opt | 2 + ...wn_hang_due_to_dump_thread_stick-slave.opt | 2 + ...hutdown_hang_due_to_dump_thread_stick.test | 49 +++++++++++++++++++ sql/mysqld.cc | 9 ++++ sql/rpl_binlog_sender.cc | 9 ++++ 5 files changed, 71 insertions(+) create mode 100644 mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick-master.opt create mode 100644 mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick-slave.opt create mode 100644 mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick.test diff --git a/mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick-master.opt b/mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick-master.opt new file mode 100644 index 00000000000..3b71a6eace3 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick-master.opt @@ -0,0 +1,2 @@ +--enforce-gtid-consistency=ON +--gtid-mode=ON diff --git a/mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick-slave.opt b/mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick-slave.opt new file mode 100644 index 00000000000..3b71a6eace3 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick-slave.opt @@ -0,0 +1,2 @@ +--enforce-gtid-consistency=ON +--gtid-mode=ON diff --git a/mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick.test b/mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick.test new file mode 100644 index 00000000000..e4bad3a544d --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_shutdown_hang_due_to_dump_thread_stick.test @@ -0,0 +1,49 @@ + +--source include/have_binlog_format_row.inc +--source include/have_gtid.inc +--source include/master-slave.inc +--source include/have_debug.inc +--source include/have_debug_sync.inc + + +--echo # +--echo # Prepare +--echo # +--source include/rpl_connection_master.inc +--let $MYSQL_SOCKET= `SELECT @@socket` +--let $MYSQL_PORT= `SELECT @@port` + +create table t1 (a varchar(2048)); +--source include/sync_slave_sql_with_master.inc +show tables; + +--echo # +--echo # Run +--echo # +--source include/rpl_connection_master.inc +set global debug="d,get_binlog_end_pos_before_flush_net"; +set global debug="+d,close_connections_before_kill_binlog_dump"; +show variables like "debug"; +begin; +insert into t1 values(repeat("a", 1024)),(repeat("b", 1024)),(repeat("c", 1024)); +commit; +--sleep 1 + +--echo # Shutdown Server +--exec echo "wait" > $MYSQLTEST_VARDIR/tmp/mysqld.1.expect +--shutdown_server 30 +--source include/wait_until_disconnected.inc + +--echo +--echo # restart server 1. +--let $rpl_server_number=1 +--source include/rpl_start_server.inc + +--echo # +--echo # Cleanup +--echo # + +--source include/rpl_connection_master.inc +DROP TABLE t1; +--source include/rpl_end.inc + diff --git a/sql/mysqld.cc b/sql/mysqld.cc index 61b328541a9..e60b725ccd8 100644 --- a/sql/mysqld.cc +++ b/sql/mysqld.cc @@ -966,6 +966,15 @@ public: killing_thd->get_command() != COM_BINLOG_DUMP_GTID); };); } + DBUG_EXECUTE_IF("close_connections_before_kill_binlog_dump", + { + if (killing_thd->get_command() == COM_BINLOG_DUMP || + killing_thd->get_command() == COM_BINLOG_DUMP_GTID) + { + extern uint kill_binlog_dump; + kill_binlog_dump = 1; + } + };); mysql_mutex_lock(&killing_thd->LOCK_thd_data); killing_thd->killed= THD::KILL_CONNECTION; MYSQL_CALLBACK(Connection_handler_manager::event_functions, diff --git a/sql/rpl_binlog_sender.cc b/sql/rpl_binlog_sender.cc index ea7db604da1..a84f14ec697 100644 --- a/sql/rpl_binlog_sender.cc +++ b/sql/rpl_binlog_sender.cc @@ -37,6 +37,7 @@ #ifndef NDEBUG static uint binlog_dump_count= 0; + volatile uint kill_binlog_dump= 0; #endif using binary_log::checksum_crc32; @@ -523,6 +524,14 @@ inline my_off_t Binlog_sender::get_binlog_end_pos(IO_CACHE *log_cache) if (log_pos < end_pos) DBUG_RETURN(end_pos); + DBUG_EXECUTE_IF("get_binlog_end_pos_before_flush_net", + { + while (!kill_binlog_dump) { + my_sleep(1*1000*1000); + } + my_sleep(1*1000*1000); + };); + /* Some data may be in net buffer, it should be flushed before waiting */ if (!m_wait_new_events || flush_net()) DBUG_RETURN(1); -- 2.34.1.182.ge773545c7f