Commit 3f515a09 authored by Nirbhay Choubey's avatar Nirbhay Choubey

MDEV-9290 : InnoDB: Assertion failure in file trx0sys.cc line 353

As a fix for MDEV-8208, for initial wsrep threads, the
invocation of init_for_queries() was moved after plugins
were initialized. Due to which, OPTION_BEGIN bit of wsrep
applier THD (originally set in wsrep_replication_process)
got reset due to implicit commit within init_for_queries().
As a result, events from a multi-statement transaction from
another node were committed separately by the applier thread,
which leads to an assertion as they all carry same seqno.

Fixed by making sure that variable.option_bits are restored
post init_for_queries(). Also restored server_status.
Added a test case.
parent ca07ee85
#
# MDEV-9290 : InnoDB: Assertion failure in file trx0sys.cc line 353
# InnoDB: Failing assertion: xid_seqno > trx_sys_cur_xid_seqno
#
CREATE TABLE t1 (i INT) ENGINE=InnoDB;
START TRANSACTION;
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
COMMIT;
SELECT * FROM t1;
i
1
2
DROP TABLE t1;
--source include/galera_cluster.inc
--source include/have_innodb.inc
--echo #
--echo # MDEV-9290 : InnoDB: Assertion failure in file trx0sys.cc line 353
--echo # InnoDB: Failing assertion: xid_seqno > trx_sys_cur_xid_seqno
--echo #
--connection node_1
CREATE TABLE t1 (i INT) ENGINE=InnoDB;
--connection node_2
# Note: a multi-statement transaction should always be the "first" one to execute
# on this node.
START TRANSACTION;
INSERT INTO t1 VALUES (1);
INSERT INTO t1 VALUES (2);
COMMIT;
--connection node_1
SELECT * FROM t1;
DROP TABLE t1;
--source include/galera_end.inc
...@@ -4617,10 +4617,20 @@ a file name for --log-bin-index option", opt_binlog_index_name); ...@@ -4617,10 +4617,20 @@ a file name for --log-bin-index option", opt_binlog_index_name);
THD *current_thd_saved= current_thd; THD *current_thd_saved= current_thd;
my_pthread_setspecific_ptr(THR_THD, tmp); my_pthread_setspecific_ptr(THR_THD, tmp);
/*
Also save/restore server_status and variables.option_bits and they
get altered during init_for_queries().
*/
unsigned int server_status_saved= tmp->server_status;
ulonglong option_bits_saved= tmp->variables.option_bits;
tmp->init_for_queries(); tmp->init_for_queries();
/* Restore current_thd. */ /* Restore current_thd. */
my_pthread_setspecific_ptr(THR_THD, current_thd_saved); my_pthread_setspecific_ptr(THR_THD, current_thd_saved);
tmp->server_status= server_status_saved;
tmp->variables.option_bits= option_bits_saved;
} }
} }
mysql_mutex_unlock(&LOCK_thread_count); mysql_mutex_unlock(&LOCK_thread_count);
...@@ -4984,7 +4994,7 @@ error: ...@@ -4984,7 +4994,7 @@ error:
WSREP_ERROR("Failed to create/initialize system thread"); WSREP_ERROR("Failed to create/initialize system thread");
/* Abort if its the first applier/rollbacker thread. */ /* Abort if its the first applier/rollbacker thread. */
if (wsrep_creating_startup_threads < 2) if (wsrep_creating_startup_threads == 1)
unireg_abort(1); unireg_abort(1);
else else
return NULL; return NULL;
......
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