From 40b9f91b1ec68a4f9bfd096e841288663315746b Mon Sep 17 00:00:00 2001 From: Dearsh Oberoi Date: Wed, 11 Feb 2026 23:37:45 +0530 Subject: [PATCH] MDEV-38497 Remove all slave related configurations on RESET SLAVE ALL Fix RESET SLAVE ALL to fully clear replica configuration of the default unnamed slave, including SSL options, so subsequent CHANGE MASTER starts from a clean state. Signed-off-by: Dearsh Oberoi --- .../reset_slave_all_leaks_master_info.result | 90 +++++++++++++++++++ .../t/reset_slave_all_leaks_master_info.test | 46 ++++++++++ sql/rpl_mi.cc | 50 +++++++++++ 3 files changed, 186 insertions(+) create mode 100644 mysql-test/suite/rpl/r/reset_slave_all_leaks_master_info.result create mode 100644 mysql-test/suite/rpl/t/reset_slave_all_leaks_master_info.test diff --git a/mysql-test/suite/rpl/r/reset_slave_all_leaks_master_info.result b/mysql-test/suite/rpl/r/reset_slave_all_leaks_master_info.result new file mode 100644 index 0000000000000..1a6c5d2c52d2e --- /dev/null +++ b/mysql-test/suite/rpl/r/reset_slave_all_leaks_master_info.result @@ -0,0 +1,90 @@ +# +# MDEV-38497 RESET SLAVE ALL doesn't remove all slave related configurations +# +include/master-slave.inc +[connection master] +connection slave; +include/stop_slave.inc +CHANGE MASTER TO +MASTER_HOST='localhost', +MASTER_USER='replssl', +MASTER_PASSWORD='password', +MASTER_PORT=3001, +MASTER_CONNECT_RETRY=7, +MASTER_HEARTBEAT_PERIOD=9, +MASTER_SSL=1, +MASTER_SSL_CA='MYSQL_TEST_DIR/std_data/cacert.pem', +MASTER_SSL_CAPATH='MYSQL_TEST_DIR/std_data', +MASTER_SSL_CERT='MYSQL_TEST_DIR/std_data/client-cert.pem', +MASTER_SSL_KEY='MYSQL_TEST_DIR/std_data/client-key.pem', +MASTER_SSL_CRL='MYSQL_TEST_DIR/std_data/crl.pem', +MASTER_SSL_CRLPATH='MYSQL_TEST_DIR/std_data', +MASTER_SSL_CIPHER='AES256-SHA', +MASTER_SSL_VERIFY_SERVER_CERT=1, +MASTER_RETRY_COUNT=17, +MASTER_USE_GTID=slave_pos, +IGNORE_SERVER_IDS=(123), +DO_DOMAIN_IDS=(19); +RESET SLAVE ALL; +CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root'; +SHOW SLAVE STATUS; +Slave_IO_State +Master_Host 127.0.0.1 +Master_User root +Master_Port 3306 +Connect_Retry 60 +Master_Log_File +Read_Master_Log_Pos 4 +Relay_Log_File slave-relay-bin.000001 +Relay_Log_Pos 4 +Relay_Master_Log_File +Slave_IO_Running No +Slave_SQL_Running No +Replicate_Do_DB +Replicate_Ignore_DB +Replicate_Do_Table +Replicate_Ignore_Table +Replicate_Wild_Do_Table +Replicate_Wild_Ignore_Table +Last_Errno 0 +Last_Error +Skip_Counter 0 +Exec_Master_Log_Pos 0 +Relay_Log_Space 257 +Until_Condition None +Until_Log_File +Until_Log_Pos 0 +Master_SSL_Allowed Yes +Master_SSL_CA_File +Master_SSL_CA_Path +Master_SSL_Cert +Master_SSL_Cipher +Master_SSL_Key +Seconds_Behind_Master NULL +Master_SSL_Verify_Server_Cert No +Last_IO_Errno 0 +Last_IO_Error +Last_SQL_Errno 0 +Last_SQL_Error +Replicate_Ignore_Server_Ids +Master_Server_Id 0 +Master_SSL_Crl +Master_SSL_Crlpath +Using_Gtid Slave_Pos +Gtid_IO_Pos +Replicate_Do_Domain_Ids +Replicate_Ignore_Domain_Ids +Parallel_Mode optimistic +SQL_Delay 0 +SQL_Remaining_Delay NULL +Slave_SQL_Running_State +Slave_DDL_Groups 0 +Slave_Non_Transactional_Groups 0 +Slave_Transactional_Groups 0 +Replicate_Rewrite_DB +Connects_Tried 0 +Master_Retry_Count 30 +include/rpl_end.inc +Warnings: +Note 1255 Slave already has been stopped +# End of reset_slave_all_leaks_master_info.test diff --git a/mysql-test/suite/rpl/t/reset_slave_all_leaks_master_info.test b/mysql-test/suite/rpl/t/reset_slave_all_leaks_master_info.test new file mode 100644 index 0000000000000..8318e3b92f4b9 --- /dev/null +++ b/mysql-test/suite/rpl/t/reset_slave_all_leaks_master_info.test @@ -0,0 +1,46 @@ +--echo # +--echo # MDEV-38497 RESET SLAVE ALL doesn't remove all slave related configurations +--echo # + +# Test replica should clear ALL master connection info + +--source include/master-slave.inc + +connection slave; + +source include/stop_slave.inc; + +--replace_result $MYSQL_TEST_DIR MYSQL_TEST_DIR +eval CHANGE MASTER TO + MASTER_HOST='localhost', + MASTER_USER='replssl', + MASTER_PASSWORD='password', + MASTER_PORT=3001, + MASTER_CONNECT_RETRY=7, + MASTER_HEARTBEAT_PERIOD=9, + MASTER_SSL=1, + MASTER_SSL_CA='$MYSQL_TEST_DIR/std_data/cacert.pem', + MASTER_SSL_CAPATH='$MYSQL_TEST_DIR/std_data', + MASTER_SSL_CERT='$MYSQL_TEST_DIR/std_data/client-cert.pem', + MASTER_SSL_KEY='$MYSQL_TEST_DIR/std_data/client-key.pem', + MASTER_SSL_CRL='$MYSQL_TEST_DIR/std_data/crl.pem', + MASTER_SSL_CRLPATH='$MYSQL_TEST_DIR/std_data', + MASTER_SSL_CIPHER='AES256-SHA', + MASTER_SSL_VERIFY_SERVER_CERT=1, + MASTER_RETRY_COUNT=17, + MASTER_USE_GTID=slave_pos, + IGNORE_SERVER_IDS=(123), + DO_DOMAIN_IDS=(19); + +# +# Everything must be cleared / set to default values +# +RESET SLAVE ALL; + +CHANGE MASTER TO MASTER_HOST='127.0.0.1', MASTER_USER='root'; + +--query_vertical SHOW SLAVE STATUS + +--source include/rpl_end.inc + +--echo # End of reset_slave_all_leaks_master_info.test diff --git a/sql/rpl_mi.cc b/sql/rpl_mi.cc index 35895b5292eff..aa625e53a12e6 100644 --- a/sql/rpl_mi.cc +++ b/sql/rpl_mi.cc @@ -28,6 +28,12 @@ static void init_master_log_pos(Master_info* mi); +static void init_ssl_config(Master_info* mi); + +static void init_connection_config(Master_info* mi); + +static void init_group_counters_config(Master_info* mi); + Master_info::Master_info(LEX_CSTRING *connection_name_arg, bool is_slave_recovery): Master_info_file(ignore_server_ids, domain_id_filter.m_domain_ids[0], @@ -177,9 +183,48 @@ void Master_info::clear_in_memory_info(bool all) host[0] = 0; user[0] = 0; password[0] = 0; domain_id_filter.clear_ids(); reset_dynamic(&ignore_server_ids); + init_ssl_config(this); + init_connection_config(this); + init_group_counters_config(this); } } + +void init_ssl_config(Master_info* mi) +{ + DBUG_ENTER("init_ssl_config"); + mi->master_ssl= 1; + mi->master_ssl_verify_server_cert= 0; + mi->master_ssl_ca= nullptr; mi->master_ssl_capath= nullptr; mi->master_ssl_cert= nullptr; + mi->master_ssl_cipher= nullptr; mi->master_ssl_key= nullptr; mi->master_ssl_crl= nullptr; + mi->master_ssl_crlpath= nullptr; + DBUG_VOID_RETURN; +} + + +void init_group_counters_config(Master_info* mi) +{ + DBUG_ENTER("init_group_counters_config"); + mi->total_ddl_groups= 0; + mi->total_non_trans_groups= 0; + mi->total_trans_groups= 0; + DBUG_VOID_RETURN; +} + + +void init_connection_config(Master_info* mi) +{ + DBUG_ENTER("init_connection_config"); + mi->connect_retry.set_default(); + mi->retry_count.set_default(); + mi->connects_tried= 0; + mi->master_id= 0; + mi->prev_master_id= 0; + mi->received_heartbeats= 0; + DBUG_VOID_RETURN; +} + + void init_master_log_pos(Master_info* mi) { DBUG_ENTER("init_master_log_pos"); @@ -191,6 +236,11 @@ void init_master_log_pos(Master_info* mi) mi->events_queued_since_last_gtid= 0; mi->gtid_reconnect_event_skip_count= 0; mi->gtid_event_seen= false; + mi->last_queued_gtid= {}; + mi->last_queued_gtid_standalone= false; + mi->do_accept_own_server_id= false; + mi->is_demotion= false; + mi->rows_event_tracker.reset(); DBUG_VOID_RETURN; }