Commit e94de17f authored by Alfranio Correia's avatar Alfranio Correia

BUG#11809016 - NO WAY TO DISCOVER AN INSTANCE IS NO LONGER A SLAVE FOLLOWING MYSQL BUG#28796

Before BUG#28796, an empty host was used to identify that an instance was no
longer a slave. However, BUG#28796 changed this behavior and one cannot set
an empty host. Besides, a RESET SLAVE only cleans up information on the next
event to retrieve from the master, disables ssl and resets heartbeat period.
So a call to SHOW SLAVE STATUS after issuing a RESET SLAVE still returns some
valid information, such as host, port, user and password.

To fix this problem, we have introduced the command RESET SLAVE ALL that does
what a regular RESET SLAVE does and also clears host, port, user and password
information thus allowing users to identify when an instance is no longer a
slave.
parent 25df7550
...@@ -77,5 +77,31 @@ reset slave; ...@@ -77,5 +77,31 @@ reset slave;
source include/check_slave_no_error.inc; source include/check_slave_no_error.inc;
change master to master_user='root'; change master to master_user='root';
--let $rpl_only_running_threads= 1
#
# BUG#11809016 - NO WAY TO DISCOVER AN INSTANCE IS NO LONGER A SLAVE FOLLOWING MYSQL BUG#28796
#
reset slave;
--source include/start_slave.inc
--source include/stop_slave.inc
--let $_slave_master_host= query_get_value(SHOW SLAVE STATUS, Master_Host, 1)
--let $_slave_master_user= query_get_value(SHOW SLAVE STATUS, Master_User, 1)
--let $_slave_master_port= query_get_value(SHOW SLAVE STATUS, Master_Port, 1)
reset slave all;
--error ER_BAD_SLAVE
start slave;
--let $_show_master_host= query_get_value(SHOW SLAVE STATUS, Master_Host, 1)
if ($_show_master_host != No such row)
{
die;
}
--replace_result $_slave_master_host MASTER_HOST $_slave_master_user MASTER_USER $_slave_master_port MASTER_PORT
--eval CHANGE MASTER TO MASTER_HOST= '$_slave_master_host', MASTER_USER= '$_slave_master_user', MASTER_PORT= $_slave_master_port
--source include/start_slave.inc
--source include/rpl_end.inc --source include/rpl_end.inc
...@@ -41,4 +41,12 @@ include/stop_slave_sql.inc ...@@ -41,4 +41,12 @@ include/stop_slave_sql.inc
reset slave; reset slave;
include/check_slave_no_error.inc include/check_slave_no_error.inc
change master to master_user='root'; change master to master_user='root';
reset slave;
include/start_slave.inc
include/stop_slave.inc
reset slave all;
start slave;
ERROR HY000: The server is not configured as slave; fix in config file or with CHANGE MASTER TO
CHANGE MASTER TO MASTER_HOST= 'MASTER_HOST', MASTER_USER= 'MASTER_USER', MASTER_PORT= MASTER_PORT;
include/start_slave.inc
include/rpl_end.inc include/rpl_end.inc
...@@ -41,4 +41,12 @@ include/stop_slave_sql.inc ...@@ -41,4 +41,12 @@ include/stop_slave_sql.inc
reset slave; reset slave;
include/check_slave_no_error.inc include/check_slave_no_error.inc
change master to master_user='root'; change master to master_user='root';
reset slave;
include/start_slave.inc
include/stop_slave.inc
reset slave all;
start slave;
ERROR HY000: The server is not configured as slave; fix in config file or with CHANGE MASTER TO
CHANGE MASTER TO MASTER_HOST= 'MASTER_HOST', MASTER_USER= 'MASTER_USER', MASTER_PORT= MASTER_PORT;
include/start_slave.inc
include/rpl_end.inc include/rpl_end.inc
...@@ -31,6 +31,8 @@ int init_strvar_from_file(char *var, int max_size, IO_CACHE *f, ...@@ -31,6 +31,8 @@ int init_strvar_from_file(char *var, int max_size, IO_CACHE *f,
int init_floatvar_from_file(float* var, IO_CACHE* f, float default_val); int init_floatvar_from_file(float* var, IO_CACHE* f, float default_val);
int init_dynarray_intvar_from_file(DYNAMIC_ARRAY* arr, IO_CACHE* f); int init_dynarray_intvar_from_file(DYNAMIC_ARRAY* arr, IO_CACHE* f);
static void init_master_log_pos(Master_info* mi);
Master_info::Master_info(bool is_slave_recovery) Master_info::Master_info(bool is_slave_recovery)
:Slave_reporting_capability("I/O"), :Slave_reporting_capability("I/O"),
ssl(0), ssl_verify_server_cert(0), fd(-1), io_thd(0), ssl(0), ssl_verify_server_cert(0), fd(-1), io_thd(0),
...@@ -100,6 +102,16 @@ bool Master_info::shall_ignore_server_id(ulong s_id) ...@@ -100,6 +102,16 @@ bool Master_info::shall_ignore_server_id(ulong s_id)
!= NULL; != NULL;
} }
void Master_info::clear_in_memory_info(bool all)
{
init_master_log_pos(this);
if (all)
{
port= MYSQL_PORT;
host[0] = 0; user[0] = 0; password[0] = 0;
}
}
void init_master_log_pos(Master_info* mi) void init_master_log_pos(Master_info* mi)
{ {
DBUG_ENTER("init_master_log_pos"); DBUG_ENTER("init_master_log_pos");
...@@ -234,7 +246,7 @@ file '%s')", fname); ...@@ -234,7 +246,7 @@ file '%s')", fname);
} }
mi->fd = fd; mi->fd = fd;
init_master_log_pos(mi); mi->clear_in_memory_info(false);
} }
else // file exists else // file exists
......
...@@ -62,6 +62,7 @@ class Master_info : public Slave_reporting_capability ...@@ -62,6 +62,7 @@ class Master_info : public Slave_reporting_capability
Master_info(bool is_slave_recovery); Master_info(bool is_slave_recovery);
~Master_info(); ~Master_info();
bool shall_ignore_server_id(ulong s_id); bool shall_ignore_server_id(ulong s_id);
void clear_in_memory_info(bool all);
/* the variables below are needed because we can change masters on the fly */ /* the variables below are needed because we can change masters on the fly */
char master_log_name[FN_REFLEN]; char master_log_name[FN_REFLEN];
...@@ -113,7 +114,6 @@ class Master_info : public Slave_reporting_capability ...@@ -113,7 +114,6 @@ class Master_info : public Slave_reporting_capability
DYNAMIC_ARRAY ignore_server_ids; DYNAMIC_ARRAY ignore_server_ids;
ulong master_id; ulong master_id;
}; };
void init_master_log_pos(Master_info* mi);
int init_master_info(Master_info* mi, const char* master_info_fname, int init_master_info(Master_info* mi, const char* master_info_fname,
const char* slave_info_fname, const char* slave_info_fname,
bool abort_if_no_master_info_file, bool abort_if_no_master_info_file,
......
...@@ -294,6 +294,10 @@ typedef struct st_lex_master_info ...@@ -294,6 +294,10 @@ typedef struct st_lex_master_info
DYNAMIC_ARRAY repl_ignore_server_ids; DYNAMIC_ARRAY repl_ignore_server_ids;
} LEX_MASTER_INFO; } LEX_MASTER_INFO;
typedef struct st_lex_reset_slave
{
bool all;
} LEX_RESET_SLAVE;
enum sub_select_type enum sub_select_type
{ {
...@@ -2232,6 +2236,7 @@ struct LEX: public Query_tables_list ...@@ -2232,6 +2236,7 @@ struct LEX: public Query_tables_list
LEX_MASTER_INFO mi; // used by CHANGE MASTER LEX_MASTER_INFO mi; // used by CHANGE MASTER
LEX_SERVER_OPTIONS server_options; LEX_SERVER_OPTIONS server_options;
USER_RESOURCES mqh; USER_RESOURCES mqh;
LEX_RESET_SLAVE reset_slave_info;
ulong type; ulong type;
/* /*
This variable is used in post-parse stage to declare that sum-functions, This variable is used in post-parse stage to declare that sum-functions,
......
...@@ -1285,8 +1285,9 @@ int reset_slave(THD *thd, Master_info* mi) ...@@ -1285,8 +1285,9 @@ int reset_slave(THD *thd, Master_info* mi)
goto err; goto err;
} }
/* Clear master's log coordinates */ /* Clear master's log coordinates and associated information */
init_master_log_pos(mi); mi->clear_in_memory_info(thd->lex->reset_slave_info.all);
/* /*
Reset errors (the idea is that we forget about the Reset errors (the idea is that we forget about the
old master). old master).
......
...@@ -11337,10 +11337,16 @@ reset_options: ...@@ -11337,10 +11337,16 @@ reset_options:
reset_option: reset_option:
SLAVE { Lex->type|= REFRESH_SLAVE; } SLAVE { Lex->type|= REFRESH_SLAVE; }
slave_reset_options { }
| MASTER_SYM { Lex->type|= REFRESH_MASTER; } | MASTER_SYM { Lex->type|= REFRESH_MASTER; }
| QUERY_SYM CACHE_SYM { Lex->type|= REFRESH_QUERY_CACHE;} | QUERY_SYM CACHE_SYM { Lex->type|= REFRESH_QUERY_CACHE;}
; ;
slave_reset_options:
/* empty */ { Lex->reset_slave_info.all= false; }
| ALL { Lex->reset_slave_info.all= true; }
;
purge: purge:
PURGE PURGE
{ {
......
Markdown is supported
0%
or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment