Skip to content
Permalink
Browse files
MDEV-22055: Assertion `active() == false' failed in wsrep::transactio…
…n::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.
  • Loading branch information
Jan Lindström committed Aug 25, 2020
1 parent 2000d05 commit a16f492
Show file tree
Hide file tree
Showing 3 changed files with 42 additions and 3 deletions.
@@ -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;
@@ -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;
@@ -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;
}

/**/

0 comments on commit a16f492

Please sign in to comment.