Commit c44cac91 authored by Sergei Golubchik's avatar Sergei Golubchik

MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled

need to protect access to thread-local cache_mngr with LOCK_thd_data

technically only access from different threads has to be protected,
but this is the SHOW STATUS code path, so the difference is neglectable
parent 022ae421
......@@ -58,4 +58,10 @@ select NAME, TYPE, PROCESSLIST_COMMAND, PROCESSLIST_STATE
from performance_schema.threads
where PROCESSLIST_ID = @slave_sql_pid;
NAME TYPE PROCESSLIST_COMMAND PROCESSLIST_STATE
#
# MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled
#
select variable_name, variable_value from performance_schema.status_by_thread
where variable_name like '%impossible%';
variable_name variable_value
include/rpl_end.inc
......@@ -81,5 +81,11 @@ select NAME, TYPE, PROCESSLIST_COMMAND, PROCESSLIST_STATE
from performance_schema.threads
where PROCESSLIST_ID = @slave_sql_pid;
--echo #
--echo # MDEV-33031 Assertion failure upon reading from performance schema with binlog enabled
--echo #
select variable_name, variable_value from performance_schema.status_by_thread
where variable_name like '%impossible%'; # should not crash
--source include/rpl_end.inc
......@@ -11826,14 +11826,21 @@ set_binlog_snapshot_file(const char *src)
void
TC_LOG_BINLOG::set_status_variables(THD *thd)
{
binlog_cache_mngr *cache_mngr;
bool have_snapshot= false;
if (thd && opt_bin_log)
cache_mngr= (binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton);
else
cache_mngr= 0;
{
mysql_mutex_lock(&thd->LOCK_thd_data);
auto cache_mngr= (binlog_cache_mngr*) thd_get_ha_data(thd, binlog_hton);
have_snapshot= cache_mngr && cache_mngr->last_commit_pos_file[0];
if (have_snapshot)
{
set_binlog_snapshot_file(cache_mngr->last_commit_pos_file);
binlog_snapshot_position= cache_mngr->last_commit_pos_offset;
}
mysql_mutex_unlock(&thd->LOCK_thd_data);
}
bool have_snapshot= (cache_mngr && cache_mngr->last_commit_pos_file[0] != 0);
mysql_mutex_lock(&LOCK_commit_ordered);
binlog_status_var_num_commits= this->num_commits;
binlog_status_var_num_group_commits= this->num_group_commits;
......@@ -11848,12 +11855,6 @@ TC_LOG_BINLOG::set_status_variables(THD *thd)
binlog_status_group_commit_trigger_timeout= this->group_commit_trigger_timeout;
binlog_status_group_commit_trigger_lock_wait= this->group_commit_trigger_lock_wait;
mysql_mutex_unlock(&LOCK_prepare_ordered);
if (have_snapshot)
{
set_binlog_snapshot_file(cache_mngr->last_commit_pos_file);
binlog_snapshot_position= cache_mngr->last_commit_pos_offset;
}
}
......
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