diff --git a/mysql-test/include/show_slave_hosts.inc b/mysql-test/include/show_slave_hosts.inc index e27c1bfb09cc..5d48317f51c6 100644 --- a/mysql-test/include/show_slave_hosts.inc +++ b/mysql-test/include/show_slave_hosts.inc @@ -1,3 +1,12 @@ ---replace_result $SLAVE_MYPORT SLAVE_PORT $DEFAULT_MASTER_PORT DEFAULT_PORT +let $repl_status_semisync=`SELECT info FROM information_schema.processlist WHERE info like 'Semisync%' limit 1`; +if (!$repl_status_semisync) { + let $repl_status_semisync=CANNOTFIND; +} +let $repl_status_async=`SELECT info FROM information_schema.processlist WHERE info like 'Async%' limit 1`; +if (!$repl_status_async) { + let $repl_status_async=CANNOTFIND; +} + +--replace_result $SLAVE_MYPORT SLAVE_PORT $DEFAULT_MASTER_PORT DEFAULT_PORT $repl_status_semisync REPL_STATUS_SEMISYNC $repl_status_async REPL_STATUS_ASYNC --replace_regex /[0-9, a-f]{8}-[0-9, a-f]{4}-[0-9, a-f]{4}-[0-9, a-f]{4}-[0-9, a-f]{12}/SLAVE_UUID/ SHOW SLAVE HOSTS; diff --git a/mysql-test/r/disabled_replication.result b/mysql-test/r/disabled_replication.result index 72cd785765bc..7260dd5f6b9e 100644 --- a/mysql-test/r/disabled_replication.result +++ b/mysql-test/r/disabled_replication.result @@ -44,7 +44,7 @@ ERROR HY000: You are not using binary logging SHOW MASTER STATUS; File Position Binlog_Do_DB Binlog_Ignore_DB Executed_Gtid_Set SHOW SLAVE HOSTS; -Server_id Host Port Master_id Slave_UUID +Server_id Host Port Master_id Slave_UUID Is_semi_sync_slave Replication_status RESET MASTER; SHOW BINLOG EVENTS; Log_name Pos Event_type Server_id End_log_pos Info diff --git a/mysql-test/suite/rpl/r/rpl_show_slave_hosts.result b/mysql-test/suite/rpl/r/rpl_show_slave_hosts.result index 5467ae79a4ef..f19fcf17b2ad 100644 --- a/mysql-test/suite/rpl/r/rpl_show_slave_hosts.result +++ b/mysql-test/suite/rpl/r/rpl_show_slave_hosts.result @@ -3,6 +3,8 @@ Warnings: Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. [connection master] +call mtr.add_suppression("A message intended for a client cannot be sent there as no client-session is attached"); +[connection slave2] RESET SLAVE; CHANGE MASTER TO master_host='127.0.0.1',master_port=MASTER_PORT,master_user='root'; Warnings: @@ -10,14 +12,20 @@ Note #### Sending passwords in plain text without SSL/TLS is extremely insecure. Note #### Storing MySQL user name or password information in the master info repository is not secure and is therefore not recommended. Please consider using the USER and PASSWORD connection options for START SLAVE; see the 'START SLAVE Syntax' in the MySQL Manual for more information. START SLAVE IO_THREAD; include/wait_for_slave_io_to_start.inc +[connection master] +CREATE TABLE t1 (data LONGBLOB); +INSERT INTO t1 (data) VALUES (repeat('a',1024*1024)); +DROP TABLE t1; SHOW SLAVE HOSTS; -Server_id Host Port Master_id Slave_UUID -2 SLAVE_PORT 1 SLAVE_UUID -3 slave2 SLAVE_PORT 1 SLAVE_UUID +Server_id Host Port Master_id Slave_UUID Is_semi_sync_slave Replication_status +2 SLAVE_PORT 1 SLAVE_UUID 0 REPL_STATUS_SEMISYNC +3 slave2 SLAVE_PORT 1 SLAVE_UUID 0 REPL_STATUS_ASYNC +[connection slave2] include/stop_slave_io.inc +[connection master] CREATE TABLE t1(a int); DROP TABLE t1; SHOW SLAVE HOSTS; -Server_id Host Port Master_id Slave_UUID -2 SLAVE_PORT 1 SLAVE_UUID +Server_id Host Port Master_id Slave_UUID Is_semi_sync_slave Replication_status +2 SLAVE_PORT 1 SLAVE_UUID 0 REPL_STATUS_SEMISYNC include/rpl_end.inc diff --git a/mysql-test/suite/rpl/t/rpl_show_slave_hosts-master.opt b/mysql-test/suite/rpl/t/rpl_show_slave_hosts-master.opt new file mode 100644 index 000000000000..8c9e13fe2c4a --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_show_slave_hosts-master.opt @@ -0,0 +1 @@ +$SEMISYNC_MASTER_PLUGIN_OPT $SEMISYNC_MASTER_PLUGIN_LOAD diff --git a/mysql-test/suite/rpl/t/rpl_show_slave_hosts-slave.opt b/mysql-test/suite/rpl/t/rpl_show_slave_hosts-slave.opt new file mode 100644 index 000000000000..7585c48909a2 --- /dev/null +++ b/mysql-test/suite/rpl/t/rpl_show_slave_hosts-slave.opt @@ -0,0 +1 @@ +$SEMISYNC_SLAVE_PLUGIN_OPT $SEMISYNC_SLAVE_PLUGIN_LOAD diff --git a/mysql-test/suite/rpl/t/rpl_show_slave_hosts.cnf b/mysql-test/suite/rpl/t/rpl_show_slave_hosts.cnf index 825e012ed134..5b8398fb0e2b 100644 --- a/mysql-test/suite/rpl/t/rpl_show_slave_hosts.cnf +++ b/mysql-test/suite/rpl/t/rpl_show_slave_hosts.cnf @@ -6,9 +6,11 @@ # instances when MTR runs rpl tests with parallel 4 or more. [mysqld.1] +rpl_semi_sync_master_enabled=1 server_id=1 [mysqld.2] +rpl_semi_sync_slave_enabled=1 server_id=2 report-host= report-user= diff --git a/mysql-test/suite/rpl/t/rpl_show_slave_hosts.test b/mysql-test/suite/rpl/t/rpl_show_slave_hosts.test index 81e20327740d..6dced742c962 100644 --- a/mysql-test/suite/rpl/t/rpl_show_slave_hosts.test +++ b/mysql-test/suite/rpl/t/rpl_show_slave_hosts.test @@ -10,10 +10,14 @@ # implemented. ####################################################################### --source include/not_group_replication_plugin.inc -source include/master-slave.inc; -connect (slave2,127.0.0.1,root,,test,$SLAVE_MYPORT2,); +--source include/have_debug_sync.inc +--source include/master-slave.inc -connection slave2; +call mtr.add_suppression("A message intended for a client cannot be sent there as no client-session is attached"); + +--connect (slave2,127.0.0.1,root,,test,$SLAVE_MYPORT2,) + +--source include/rpl_connection_slave2.inc RESET SLAVE; --replace_result $MASTER_MYPORT MASTER_PORT --replace_column 2 #### @@ -21,34 +25,39 @@ RESET SLAVE; START SLAVE IO_THREAD; source include/wait_for_slave_io_to_start.inc; -connection master; -let $show_statement= SHOW SLAVE HOSTS; -let $field= Server_id; +--source include/rpl_connection_master.inc + +CREATE TABLE t1 (data LONGBLOB); +INSERT INTO t1 (data) VALUES (repeat('a',1024*1024)); +DROP TABLE t1; + +--let $show_statement= SHOW SLAVE HOSTS +--let $field= Server_id # 3 is server_id of slave2. -let $condition= ='3'; -source include/wait_show_condition.inc; +--let $condition= ='3' +--source include/wait_show_condition.inc --replace_column 3 'SLAVE_PORT' ---replace_result $SLAVE_MYPORT SLAVE_PORT $DEFAULT_MASTER_PORT DEFAULT_PORT --sorted_result -source include/show_slave_hosts.inc; +--source include/show_slave_hosts.inc -connection slave2; +--source include/rpl_connection_slave2.inc --source include/stop_slave_io.inc -connection master; +--source include/rpl_connection_master.inc # Run dummy DDL to wake up dump thread and detect the disconnected slave CREATE TABLE t1(a int); DROP TABLE t1; -let $show_statement= SHOW SLAVE HOSTS; -let $field= Server_id; +--let $show_statement= SHOW SLAVE HOSTS +--let $field= Server_id # 3 is server_id of slave2. -let $condition= <> '3'; +--let $condition= <> '3' # All rows of 'SHOW SLAVE HOSTS' are not equal to 3. It mean that master has # knew the leave of slave2 and has unregistered it. -let $wait_for_all= 1; -source include/wait_show_condition.inc; -source include/show_slave_hosts.inc; +--let $wait_for_all= 1 +--source include/wait_show_condition.inc +--source include/show_slave_hosts.inc +--disconnect slave2 --source include/rpl_end.inc diff --git a/mysql-test/suite/rpl_nogtid/r/rpl_mixed_ddl_dml.result b/mysql-test/suite/rpl_nogtid/r/rpl_mixed_ddl_dml.result index 83fc3b0557c3..3c20e7b8bbb8 100644 --- a/mysql-test/suite/rpl_nogtid/r/rpl_mixed_ddl_dml.result +++ b/mysql-test/suite/rpl_nogtid/r/rpl_mixed_ddl_dml.result @@ -13,8 +13,8 @@ n 2001 2002 SHOW SLAVE HOSTS; -Server_id Host Port Master_id Slave_UUID -2 127.0.0.1 SLAVE_PORT 1 SLAVE_UUID +Server_id Host Port Master_id Slave_UUID Is_semi_sync_slave Replication_status +2 127.0.0.1 SLAVE_PORT 1 SLAVE_UUID 0 REPL_STATUS_ASYNC drop table t1; include/sync_slave_sql_with_master.inc stop slave; diff --git a/sql/rpl_binlog_sender.cc b/sql/rpl_binlog_sender.cc index 1d6bf19a3cd7..52e5300e1ffe 100644 --- a/sql/rpl_binlog_sender.cc +++ b/sql/rpl_binlog_sender.cc @@ -286,7 +286,7 @@ void Binlog_sender::cleanup() { my_eof(thd); } -static bool is_semi_sync_slave() { +bool is_semi_sync_slave() { long long val = 0; get_user_var_int("rpl_semi_sync_slave", &val, nullptr); return val; diff --git a/sql/rpl_binlog_sender.h b/sql/rpl_binlog_sender.h index b77603ebe91e..af7e7ec5def5 100644 --- a/sql/rpl_binlog_sender.h +++ b/sql/rpl_binlog_sender.h @@ -41,6 +41,7 @@ class String; class THD; extern uint rpl_send_buffer_size; +bool is_semi_sync_slave(); /** The major logic of dump thread is implemented in this class. It sends diff --git a/sql/rpl_master.cc b/sql/rpl_master.cc index 5d6350f4d197..0c8c8fa5adea 100644 --- a/sql/rpl_master.cc +++ b/sql/rpl_master.cc @@ -230,6 +230,9 @@ bool show_slave_hosts(THD *thd) { field_list.push_back(new Item_return_int("Port", 7, MYSQL_TYPE_LONG)); field_list.push_back(new Item_return_int("Master_id", 10, MYSQL_TYPE_LONG)); field_list.push_back(new Item_empty_string("Slave_UUID", UUID_LENGTH)); + field_list.push_back( + new Item_return_int("Is_semi_sync_slave", 7, MYSQL_TYPE_LONG)); + field_list.push_back(new Item_empty_string("Replication_status", 20)); if (thd->send_result_metadata(&field_list, Protocol::SEND_NUM_ROWS | Protocol::SEND_EOF)) @@ -253,6 +256,14 @@ bool show_slave_hosts(THD *thd) { String slave_uuid; if (get_slave_uuid(si->thd, &slave_uuid)) protocol->store(slave_uuid.c_ptr_safe(), &my_charset_bin); + protocol->store(is_semi_sync_slave()); + mysql_mutex_lock(&si->thd->LOCK_thd_query); + LEX_CSTRING replication_status = si->thd->query(); + if (replication_status.length) + protocol->store(replication_status.str, &my_charset_bin); + else + protocol->store("", &my_charset_bin); + mysql_mutex_unlock(&si->thd->LOCK_thd_query); if (protocol->end_row()) { mysql_mutex_unlock(&LOCK_slave_list); return true;