summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorNikita Malyavin <nikitamalyavin@gmail.com>2022-07-19 01:19:11 +0300
committerNikita Malyavin <nikitamalyavin@gmail.com>2023-04-18 00:29:51 +0300
commitd885da75303c2cf847507024a205e7a3a14a93a5 (patch)
treeaaaee5780e062f3971ad4da112c70e0d41b2a049
parent1223b4e43a21a837db3771ae06cc16fc09683b62 (diff)
downloadmariadb-git-d885da75303c2cf847507024a205e7a3a14a93a5.tar.gz
MDEV-29038 XA assertions failing in binlog_rollback and binlog_commit
ONLINE ALTER TABLE adds binlog handlerton into ha_list, so any rollback command can end up calling binlog_rollback having no cache_mngr, if binlog is not enabled. The assertion should be fixed in the same manner as DBUG_ASSERT(WSREP(thd))
-rw-r--r--mysql-test/main/alter_table_online_debug.result27
-rw-r--r--mysql-test/main/alter_table_online_debug.test39
-rw-r--r--sql/log.cc6
3 files changed, 70 insertions, 2 deletions
diff --git a/mysql-test/main/alter_table_online_debug.result b/mysql-test/main/alter_table_online_debug.result
index 6d293b208b4..506f201ab92 100644
--- a/mysql-test/main/alter_table_online_debug.result
+++ b/mysql-test/main/alter_table_online_debug.result
@@ -952,5 +952,32 @@ alter table t1 force;
drop table t1, t2;
set debug_sync= reset;
#
+# MDEV-29038 XA assertions failing in binlog_rollback and binlog_commit
+#
+create table t (a int) engine=innodb;
+insert into t values (1);
+xa begin 'xid';
+set debug_sync= 'now wait_for downgraded';
+connect con1,localhost,root,,test;
+set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit';
+alter table t force, algorithm=copy, lock=none;
+connection default;
+insert into t values (2);
+set debug_sync= 'now signal goforit';
+xa end 'xid';
+xa rollback 'xid';
+xa begin 'xid';
+connection con1;
+set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit';
+alter table t force, algorithm=copy, lock=none;
+connection default;
+set debug_sync= 'now wait_for downgraded';
+insert into t values (3);
+set debug_sync= 'now signal goforit';
+xa end 'xid';
+xa commit 'xid' one phase;
+drop table t;
+set debug_sync= reset;
+#
# End of 10.10 tests
#
diff --git a/mysql-test/main/alter_table_online_debug.test b/mysql-test/main/alter_table_online_debug.test
index 0a6c7cccf60..8f2126cafa0 100644
--- a/mysql-test/main/alter_table_online_debug.test
+++ b/mysql-test/main/alter_table_online_debug.test
@@ -1114,5 +1114,44 @@ drop table t1, t2;
set debug_sync= reset;
--echo #
+--echo # MDEV-29038 XA assertions failing in binlog_rollback and binlog_commit
+--echo #
+create table t (a int) engine=innodb;
+insert into t values (1);
+xa begin 'xid';
+--send
+set debug_sync= 'now wait_for downgraded';
+
+--connect (con1,localhost,root,,test)
+set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit';
+--send
+alter table t force, algorithm=copy, lock=none;
+
+--connection default
+--reap
+insert into t values (2);
+set debug_sync= 'now signal goforit';
+xa end 'xid';
+xa rollback 'xid';
+
+xa begin 'xid';
+--connection con1
+--reap
+set debug_sync= 'alter_table_online_downgraded signal downgraded wait_for goforit';
+--send
+alter table t force, algorithm=copy, lock=none;
+
+--connection default
+set debug_sync= 'now wait_for downgraded';
+insert into t values (3);
+set debug_sync= 'now signal goforit';
+xa end 'xid';
+xa commit 'xid' one phase;
+
+# Cleanup
+drop table t;
+set debug_sync= reset;
+
+--echo #
--echo # End of 10.10 tests
--echo #
diff --git a/sql/log.cc b/sql/log.cc
index 8c37f989255..5fda1563ec6 100644
--- a/sql/log.cc
+++ b/sql/log.cc
@@ -2329,6 +2329,8 @@ int binlog_commit(THD *thd, bool all, bool ro_1pc)
PSI_stage_info org_stage;
DBUG_ENTER("binlog_commit");
+ IF_DBUG(bool commit_online= !thd->online_alter_cache_list.empty(),);
+
bool is_ending_transaction= ending_trans(thd, all);
error= binlog_online_alter_end_trans(thd, all, true);
if (error)
@@ -2340,7 +2342,7 @@ int binlog_commit(THD *thd, bool all, bool ro_1pc)
*/
if (!cache_mngr)
{
- DBUG_ASSERT(WSREP(thd) ||
+ DBUG_ASSERT(WSREP(thd) || commit_online ||
(thd->lex->sql_command != SQLCOM_XA_PREPARE &&
!(thd->lex->sql_command == SQLCOM_XA_COMMIT &&
thd->lex->xa_opt == XA_ONE_PHASE)));
@@ -2448,7 +2450,7 @@ static int binlog_rollback(handlerton *hton, THD *thd, bool all)
if (!cache_mngr)
{
DBUG_ASSERT(WSREP(thd) || rollback_online);
- DBUG_ASSERT(thd->lex->sql_command != SQLCOM_XA_ROLLBACK);
+ DBUG_ASSERT(thd->lex->sql_command != SQLCOM_XA_ROLLBACK || rollback_online);
DBUG_RETURN(0);
}