mirror of
https://github.com/MariaDB/server.git
synced 2025-07-30 16:24:05 +03:00
Bug #34305 show slave status handling segfaults when slave io is about
to leave The artifact was caused by a flaw in concurrent accessing the slave's io thd by the io itself and a handling show slave status thread. Namely, show_master_info did not acquire mi->run_lock mutex that is specified for mi->io_thd member. Fixed with deploying the mutex locking and unlocking. The mutex is kept short time and without interleaving with mi->data_lock mutex. Todo: to report and fix an issue with sys_var_slave_skip_counter::{methods} seem to acquire incorrectly active_mi->rli.run_lock instead of the specified active_mi->rli.data_lock A test case is difficult to compose, so rpl_packet should continue serving as the indicator.
This commit is contained in:
11
sql/slave.cc
11
sql/slave.cc
@ -2447,14 +2447,15 @@ bool show_master_info(THD* thd, MASTER_INFO* mi)
|
|||||||
protocol->prepare_for_resend();
|
protocol->prepare_for_resend();
|
||||||
|
|
||||||
/*
|
/*
|
||||||
TODO: we read slave_running without run_lock, whereas these variables
|
slave_running can be accessed without run_lock but not other
|
||||||
are updated under run_lock and not data_lock. In 5.0 we should lock
|
non-volotile members like mi->io_thd, which is guarded by the mutex.
|
||||||
run_lock on top of data_lock (with good order).
|
|
||||||
*/
|
*/
|
||||||
|
pthread_mutex_lock(&mi->run_lock);
|
||||||
|
protocol->store(mi->io_thd ? mi->io_thd->proc_info : "", &my_charset_bin);
|
||||||
|
pthread_mutex_unlock(&mi->run_lock);
|
||||||
|
|
||||||
pthread_mutex_lock(&mi->data_lock);
|
pthread_mutex_lock(&mi->data_lock);
|
||||||
pthread_mutex_lock(&mi->rli.data_lock);
|
pthread_mutex_lock(&mi->rli.data_lock);
|
||||||
|
|
||||||
protocol->store(mi->io_thd ? mi->io_thd->proc_info : "", &my_charset_bin);
|
|
||||||
protocol->store(mi->host, &my_charset_bin);
|
protocol->store(mi->host, &my_charset_bin);
|
||||||
protocol->store(mi->user, &my_charset_bin);
|
protocol->store(mi->user, &my_charset_bin);
|
||||||
protocol->store((uint32) mi->port);
|
protocol->store((uint32) mi->port);
|
||||||
|
@ -65,8 +65,8 @@
|
|||||||
mi->rli does not either.
|
mi->rli does not either.
|
||||||
|
|
||||||
In MASTER_INFO: run_lock, data_lock
|
In MASTER_INFO: run_lock, data_lock
|
||||||
run_lock protects all information about the run state: slave_running, and the
|
run_lock protects all information about the run state: slave_running, thd
|
||||||
existence of the I/O thread (to stop/start it, you need this mutex).
|
and the existence of the I/O thread to stop/start it, you need this mutex).
|
||||||
data_lock protects some moving members of the struct: counters (log name,
|
data_lock protects some moving members of the struct: counters (log name,
|
||||||
position) and relay log (MYSQL_LOG object).
|
position) and relay log (MYSQL_LOG object).
|
||||||
|
|
||||||
|
Reference in New Issue
Block a user