Commit af31e2c5 authored by Monty's avatar Monty

MDEV-23843 Assertions in Diagnostics_area upon table operations under FTWRL

2 different problems:
- MYSQL_BIN_LOG::write() did not check if mdl_context.acquire_lock() failed
- Sql_cmd_optimize_table::execute() and Sql_cmd_repair_table::execute()
  called write_bin_log(), which could fail if sql_admin() had already
  called my_eof()

Fixed by adding check for aquire_lock() return status and protect
write_bin_log() in the above two functions with set_overwrite_status().
parent 3cd32a9b
#
# MDEV-23843 Assertions in Diagnostics_area upon table operations under
# FTWRL
#
CREATE TABLE t1 (a INT);
FLUSH TABLES WITH READ LOCK;
connect con1,localhost,root,,;
SET lock_wait_timeout= 1;
OPTIMIZE TABLE t1;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
disconnect con1;
connection default;
UNLOCK TABLES;
DROP TABLE t1;
FLUSH TABLES WITH READ LOCK;
connect con1,localhost,root,,test;
SET lock_wait_timeout= 1;
FLUSH TABLES;
ERROR HY000: Lock wait timeout exceeded; try restarting transaction
connection default;
disconnect con1;
unlock tables;
--source include/have_log_bin.inc
--echo #
--echo # MDEV-23843 Assertions in Diagnostics_area upon table operations under
--echo # FTWRL
--echo #
CREATE TABLE t1 (a INT);
FLUSH TABLES WITH READ LOCK;
--connect (con1,localhost,root,,)
SET lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
OPTIMIZE TABLE t1;
# Cleanup
--disconnect con1
--connection default
UNLOCK TABLES;
DROP TABLE t1;
#
# Second test case from MDEV_23843
#
FLUSH TABLES WITH READ LOCK;
--connect (con1,localhost,root,,test)
SET lock_wait_timeout= 1;
--error ER_LOCK_WAIT_TIMEOUT
FLUSH TABLES;
--connection default
--disconnect con1
unlock tables;
...@@ -6390,8 +6390,9 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info, my_bool *with_annotate) ...@@ -6390,8 +6390,9 @@ bool MYSQL_BIN_LOG::write(Log_event *event_info, my_bool *with_annotate)
DBUG_ASSERT(!thd->backup_commit_lock); DBUG_ASSERT(!thd->backup_commit_lock);
mdl_request.init(MDL_key::BACKUP, "", "", MDL_BACKUP_COMMIT, MDL_EXPLICIT); mdl_request.init(MDL_key::BACKUP, "", "", MDL_BACKUP_COMMIT, MDL_EXPLICIT);
thd->mdl_context.acquire_lock(&mdl_request, if (thd->mdl_context.acquire_lock(&mdl_request,
thd->variables.lock_wait_timeout); thd->variables.lock_wait_timeout))
DBUG_RETURN(1);
thd->backup_commit_lock= &mdl_request; thd->backup_commit_lock= &mdl_request;
if ((res= thd->wait_for_prior_commit())) if ((res= thd->wait_for_prior_commit()))
......
...@@ -1455,7 +1455,9 @@ bool Sql_cmd_optimize_table::execute(THD *thd) ...@@ -1455,7 +1455,9 @@ bool Sql_cmd_optimize_table::execute(THD *thd)
/* /*
Presumably, OPTIMIZE and binlog writing doesn't require synchronization Presumably, OPTIMIZE and binlog writing doesn't require synchronization
*/ */
thd->get_stmt_da()->set_overwrite_status(true);
res= write_bin_log(thd, TRUE, thd->query(), thd->query_length()); res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
thd->get_stmt_da()->set_overwrite_status(false);
} }
m_lex->first_select_lex()->table_list.first= first_table; m_lex->first_select_lex()->table_list.first= first_table;
m_lex->query_tables= first_table; m_lex->query_tables= first_table;
...@@ -1487,7 +1489,9 @@ bool Sql_cmd_repair_table::execute(THD *thd) ...@@ -1487,7 +1489,9 @@ bool Sql_cmd_repair_table::execute(THD *thd)
/* /*
Presumably, REPAIR and binlog writing doesn't require synchronization Presumably, REPAIR and binlog writing doesn't require synchronization
*/ */
thd->get_stmt_da()->set_overwrite_status(true);
res= write_bin_log(thd, TRUE, thd->query(), thd->query_length()); res= write_bin_log(thd, TRUE, thd->query(), thd->query_length());
thd->get_stmt_da()->set_overwrite_status(false);
} }
m_lex->first_select_lex()->table_list.first= first_table; m_lex->first_select_lex()->table_list.first= first_table;
m_lex->query_tables= first_table; m_lex->query_tables= first_table;
......
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