diff options
author | Jan Lindström <jan.lindstrom@mariadb.com> | 2020-08-24 14:09:40 +0300 |
---|---|---|
committer | Jan Lindström <jan.lindstrom@mariadb.com> | 2020-08-25 06:53:52 +0300 |
commit | a16f4927dbde19c546b1ba3726529914f8c91730 (patch) | |
tree | e12058e1ec8455b36df2d04085177437b7ef9174 | |
parent | 2000d05c2ed85563e35c4548d9518249ddf403df (diff) | |
download | mariadb-git-a16f4927dbde19c546b1ba3726529914f8c91730.tar.gz |
MDEV-22055: Assertion `active() == false' failed in wsrep::transaction::start_transaction upon ROLLBACK AND CHAIN
The optional AND CHAIN clause is a convenience for initiating a new
transaction as soon as the old transaction terminates. Therefore,
do not start new transaction if it is already started
at wsrep_start_transaction.
-rw-r--r-- | mysql-test/suite/galera/r/MDEV-22055.result | 18 | ||||
-rw-r--r-- | mysql-test/suite/galera/t/MDEV-22055.test | 19 | ||||
-rw-r--r-- | sql/wsrep_trans_observer.h | 8 |
3 files changed, 42 insertions, 3 deletions
diff --git a/mysql-test/suite/galera/r/MDEV-22055.result b/mysql-test/suite/galera/r/MDEV-22055.result new file mode 100644 index 00000000000..651f8501a0a --- /dev/null +++ b/mysql-test/suite/galera/r/MDEV-22055.result @@ -0,0 +1,18 @@ +connection node_2; +connection node_1; +ROLLBACK AND CHAIN; +CREATE TABLE t1(a int not null primary key) engine=innodb; +INSERT INTO t1 values (1); +BEGIN; +INSERT INTO t1 values (2); +ROLLBACK AND CHAIN; +SELECT * FROM t1; +a +1 +connection node_2; +SET SESSION wsrep_sync_wait=15; +SELECT * FROM t1; +a +1 +connection node_1; +DROP TABLE t1; diff --git a/mysql-test/suite/galera/t/MDEV-22055.test b/mysql-test/suite/galera/t/MDEV-22055.test new file mode 100644 index 00000000000..ae29c456bf0 --- /dev/null +++ b/mysql-test/suite/galera/t/MDEV-22055.test @@ -0,0 +1,19 @@ +--source include/galera_cluster.inc + +ROLLBACK AND CHAIN; + +CREATE TABLE t1(a int not null primary key) engine=innodb; +INSERT INTO t1 values (1); + +BEGIN; +INSERT INTO t1 values (2); +ROLLBACK AND CHAIN; + +SELECT * FROM t1; + +--connection node_2 +SET SESSION wsrep_sync_wait=15; +SELECT * FROM t1; + +--connection node_1 +DROP TABLE t1; diff --git a/sql/wsrep_trans_observer.h b/sql/wsrep_trans_observer.h index 1044cab76ad..05970e8b12f 100644 --- a/sql/wsrep_trans_observer.h +++ b/sql/wsrep_trans_observer.h @@ -133,9 +133,11 @@ static inline size_t wsrep_fragments_certified_for_stmt(THD* thd) static inline int wsrep_start_transaction(THD* thd, wsrep_trx_id_t trx_id) { - return (thd->wsrep_cs().state() != wsrep::client_state::s_none ? - thd->wsrep_cs().start_transaction(wsrep::transaction_id(trx_id)) : - 0); + if (thd->wsrep_cs().state() != wsrep::client_state::s_none) { + if (wsrep_is_active(thd) == false) + return thd->wsrep_cs().start_transaction(wsrep::transaction_id(trx_id)); + } + return 0; } /**/ |