From 713d688231ca6d4c516c470379744b8a4553df62 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 | 92 +++++++++++++++++++ .../t/reset_slave_all_leaks_master_info.test | 48 ++++++++++ sql/rpl_mi.cc | 42 +++++++++ 3 files changed, 182 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..ee318e17edf35 --- /dev/null +++ b/mysql-test/suite/rpl/r/reset_slave_all_leaks_master_info.result @@ -0,0 +1,92 @@ +# +# MDEV-38497 RESET SLAVE ALL doesn't remove all slave related configurations +# +include/master-slave.inc +[connection master] +connection slave; +STOP SLAVE; +include/wait_for_slave_io_to_stop.inc +include/wait_for_slave_sql_to_stop.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 0 +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 1 +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 0 +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..1aa27d931ed87 --- /dev/null +++ b/mysql-test/suite/rpl/t/reset_slave_all_leaks_master_info.test @@ -0,0 +1,48 @@ +--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; + +STOP SLAVE; +--source include/wait_for_slave_io_to_stop.inc +--source include/wait_for_slave_sql_to_stop.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..abf467c226628 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,45 @@ 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= 0; + mi->retry_count= 0; + mi->connects_tried= 0; + DBUG_VOID_RETURN; +} + + void init_master_log_pos(Master_info* mi) { DBUG_ENTER("init_master_log_pos");