mirror of
https://github.com/MariaDB/server.git
synced 2025-01-29 02:05:57 +01:00
MDEV-4712 : Fix "shutdown" test.
There is a race condition during shutdown, that happens when "show status" runs during shutdown. Functions show_slave_running(), show_slave_received_heartbeats(), show_heartbeat_period() would dereference NULL pointer master_info_index, after this variable is set to NULL in slave_end() during shutdown. Fix introduces check for master_info_index == NULL in the affected functions.
This commit is contained in:
parent
159866b6d3
commit
a06a844d9a
2 changed files with 30 additions and 20 deletions
|
@ -11,13 +11,14 @@ shutdown;
|
|||
|
||||
connection default;
|
||||
disconnect c1;
|
||||
--connect (c1,localhost,root,,)
|
||||
|
||||
--let $_server_id= `SELECT @@server_id`
|
||||
--let $_expect_file_name= $MYSQLTEST_VARDIR/tmp/mysqld.$_server_id.expect
|
||||
--exec echo "wait" > $_expect_file_name
|
||||
|
||||
shutdown;
|
||||
|
||||
--send shutdown
|
||||
--connection default
|
||||
--source include/wait_until_disconnected.inc
|
||||
|
||||
--exec echo "restart" > $_expect_file_name
|
||||
|
|
|
@ -6993,7 +6993,7 @@ static int show_rpl_status(THD *thd, SHOW_VAR *var, char *buff)
|
|||
|
||||
static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff)
|
||||
{
|
||||
Master_info *mi;
|
||||
Master_info *mi= NULL;
|
||||
bool tmp;
|
||||
LINT_INIT(tmp);
|
||||
|
||||
|
@ -7001,12 +7001,15 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff)
|
|||
var->value= buff;
|
||||
mysql_mutex_unlock(&LOCK_status);
|
||||
mysql_mutex_lock(&LOCK_active_mi);
|
||||
mi= master_info_index->
|
||||
get_master_info(&thd->variables.default_master_connection,
|
||||
Sql_condition::WARN_LEVEL_NOTE);
|
||||
if (mi)
|
||||
tmp= (my_bool) (mi->slave_running == MYSQL_SLAVE_RUN_CONNECT &&
|
||||
mi->rli.slave_running);
|
||||
if (master_info_index)
|
||||
{
|
||||
mi= master_info_index->
|
||||
get_master_info(&thd->variables.default_master_connection,
|
||||
Sql_condition::WARN_LEVEL_NOTE);
|
||||
if (mi)
|
||||
tmp= (my_bool) (mi->slave_running == MYSQL_SLAVE_RUN_CONNECT &&
|
||||
mi->rli.slave_running);
|
||||
}
|
||||
mysql_mutex_unlock(&LOCK_active_mi);
|
||||
mysql_mutex_lock(&LOCK_status);
|
||||
if (mi)
|
||||
|
@ -7019,7 +7022,7 @@ static int show_slave_running(THD *thd, SHOW_VAR *var, char *buff)
|
|||
|
||||
static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff)
|
||||
{
|
||||
Master_info *mi;
|
||||
Master_info *mi= NULL;
|
||||
longlong tmp;
|
||||
LINT_INIT(tmp);
|
||||
|
||||
|
@ -7027,11 +7030,14 @@ static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff)
|
|||
var->value= buff;
|
||||
mysql_mutex_unlock(&LOCK_status);
|
||||
mysql_mutex_lock(&LOCK_active_mi);
|
||||
mi= master_info_index->
|
||||
get_master_info(&thd->variables.default_master_connection,
|
||||
Sql_condition::WARN_LEVEL_NOTE);
|
||||
if (mi)
|
||||
tmp= mi->received_heartbeats;
|
||||
if (master_info_index)
|
||||
{
|
||||
mi= master_info_index->
|
||||
get_master_info(&thd->variables.default_master_connection,
|
||||
Sql_condition::WARN_LEVEL_NOTE);
|
||||
if (mi)
|
||||
tmp= mi->received_heartbeats;
|
||||
}
|
||||
mysql_mutex_unlock(&LOCK_active_mi);
|
||||
mysql_mutex_lock(&LOCK_status);
|
||||
if (mi)
|
||||
|
@ -7044,7 +7050,7 @@ static int show_slave_received_heartbeats(THD *thd, SHOW_VAR *var, char *buff)
|
|||
|
||||
static int show_heartbeat_period(THD *thd, SHOW_VAR *var, char *buff)
|
||||
{
|
||||
Master_info *mi;
|
||||
Master_info *mi= NULL;
|
||||
float tmp;
|
||||
LINT_INIT(tmp);
|
||||
|
||||
|
@ -7052,11 +7058,14 @@ static int show_heartbeat_period(THD *thd, SHOW_VAR *var, char *buff)
|
|||
var->value= buff;
|
||||
mysql_mutex_unlock(&LOCK_status);
|
||||
mysql_mutex_lock(&LOCK_active_mi);
|
||||
mi= master_info_index->
|
||||
get_master_info(&thd->variables.default_master_connection,
|
||||
if (master_info_index)
|
||||
{
|
||||
mi= master_info_index->
|
||||
get_master_info(&thd->variables.default_master_connection,
|
||||
Sql_condition::WARN_LEVEL_NOTE);
|
||||
if (mi)
|
||||
tmp= mi->heartbeat_period;
|
||||
if (mi)
|
||||
tmp= mi->heartbeat_period;
|
||||
}
|
||||
mysql_mutex_unlock(&LOCK_active_mi);
|
||||
mysql_mutex_lock(&LOCK_status);
|
||||
if (mi)
|
||||
|
|
Loading…
Add table
Reference in a new issue