diff --git a/mysql-test/suite/binlog/r/binlog_consistent_debug.result b/mysql-test/suite/binlog/r/binlog_consistent_debug.result new file mode 100644 index 0000000..6dc05bf --- /dev/null +++ b/mysql-test/suite/binlog/r/binlog_consistent_debug.result @@ -0,0 +1,29 @@ +# +# Bug 92108: Deadlock by concurrent SHOW BINLOGS, +# performance_schema.global_status query, and binlog purge +# +FLUSH LOGS; +# connection con1 +SET DEBUG_SYNC="purge_logs_after_lock_index_before_thread_count SIGNAL purge_ready WAIT_FOR finish_purge"; +PURGE BINARY LOGS BEFORE '2038-01-19'; +# connection con2 +SET DEBUG_SYNC="materialize_session_variable_array_THD_locked SIGNAL pfs_ready WAIT_FOR finish_pfs"; +SELECT * FROM performance_schema.session_variables WHERE VARIABLE_NAME LIKE 'binlog_transaction_dependency_tracking';; +# connection con3 +SET DEBUG_SYNC="show_binlogs_after_lock_log_before_lock_index SIGNAL show_ready WAIT_FOR finish_show"; +SHOW BINARY LOGS; +# connection default +SET DEBUG_SYNC="now WAIT_FOR purge_ready"; +SET DEBUG_SYNC="now WAIT_FOR pfs_ready"; +SET DEBUG_SYNC="now WAIT_FOR show_ready"; +SET DEBUG_SYNC="now SIGNAL finish_purge"; +SET DEBUG_SYNC="now SIGNAL finish_pfs"; +SET DEBUG_SYNC="now SIGNAL finish_show"; +# connection con1 +Warnings: +Warning 1868 file ./master-bin.000002 was not purged because it is the active log file. +# connection con2 +VARIABLE_NAME VARIABLE_VALUE +binlog_transaction_dependency_tracking COMMIT_ORDER +# connection con3 +# connection default diff --git a/mysql-test/suite/binlog/t/binlog_consistent_debug.test b/mysql-test/suite/binlog/t/binlog_consistent_debug.test new file mode 100644 index 0000000..2ad400d --- /dev/null +++ b/mysql-test/suite/binlog/t/binlog_consistent_debug.test @@ -0,0 +1,64 @@ +--source include/have_debug_sync.inc +--source include/have_log_bin.inc +--source include/have_perfschema.inc + +--echo # +--echo # Bug 92108: Deadlock by concurrent SHOW BINLOGS, +--echo # performance_schema.session_variables query, and binlog purge +--echo # + +FLUSH LOGS; + +--connect(con1,localhost,root,,) +--echo # connection con1 + +SET DEBUG_SYNC="purge_logs_after_lock_index_before_thread_count SIGNAL purge_ready WAIT_FOR finish_purge"; + +--send PURGE BINARY LOGS BEFORE '2038-01-19' + +--connect(con2,localhost,root,,) +--echo # connection con2 + +SET DEBUG_SYNC="materialize_session_variable_array_THD_locked SIGNAL pfs_ready WAIT_FOR finish_pfs"; + +--send SELECT * FROM performance_schema.session_variables WHERE VARIABLE_NAME LIKE 'binlog_transaction_dependency_tracking'; + +--connect(con3,localhost,root,,) +--echo # connection con3 + +SET DEBUG_SYNC="show_binlogs_after_lock_log_before_lock_index SIGNAL show_ready WAIT_FOR finish_show"; + +--send SHOW BINARY LOGS + +--connection default +--echo # connection default + +SET DEBUG_SYNC="now WAIT_FOR purge_ready"; +SET DEBUG_SYNC="now WAIT_FOR pfs_ready"; +SET DEBUG_SYNC="now WAIT_FOR show_ready"; + +SET DEBUG_SYNC="now SIGNAL finish_purge"; +SET DEBUG_SYNC="now SIGNAL finish_pfs"; +SET DEBUG_SYNC="now SIGNAL finish_show"; + +--connection con1 +--echo # connection con1 +reap; +--disconnect con1 + +--connection con2 +--echo # connection con2 +reap; +--disconnect con2 + +--connection con3 +--echo # connection con3 +--disable_result_log +reap; +--enable_result_log +--disconnect con3 + +--connection default +--echo # connection default + +--source include/wait_until_count_sessions.inc diff --git a/storage/perfschema/pfs_variable.cc b/storage/perfschema/pfs_variable.cc index 397377b..7fdf0e3 100644 --- a/storage/perfschema/pfs_variable.cc +++ b/storage/perfschema/pfs_variable.cc @@ -195,6 +195,7 @@ int PFS_system_variable_cache::do_materialize_all(THD *unsafe_thd) /* Get and lock a validated THD from the thread manager. */ if ((m_safe_thd= get_THD(unsafe_thd)) != NULL) { + DEBUG_SYNC(m_current_thd, "materialize_session_variable_array_THD_locked"); for (Show_var_array::iterator show_var= m_show_var_array.begin(); show_var->value && (show_var != m_show_var_array.end()); show_var++) {