From 44016ec0ca27eddd7bc98916cc3f7e1d7ae81522 Mon Sep 17 00:00:00 2001 From: Eugene Kosov Date: Sat, 4 Aug 2018 10:52:12 +0300 Subject: [PATCH] MDEV-16211 Contents of transaction_registry not replicated by Galera Patch fixes two bugs: 1) BEGIN_TIMESTAMP of MYSQL.TRANSACTION_REGISTY is '0-0-0' on replication record insertion 2) BEGIN_TIMESTAMP equals COMMMIT_TIMESTAMP in MYSQL.TRANSACTION_REGISTRY Fixed by calling THD::set_time() at appropriate places --- .../suite/galera/r/versioning_trx_id.result | 52 +++++++++++++++++++ .../suite/galera/t/versioning_trx_id.cnf | 1 + .../suite/galera/t/versioning_trx_id.test | 28 ++++++++++ mysql-test/suite/versioning/r/trx_id.result | 3 ++ mysql-test/suite/versioning/t/trx_id.test | 2 + sql/table.cc | 1 + sql/wsrep_applier.cc | 1 + 7 files changed, 88 insertions(+) create mode 100644 mysql-test/suite/galera/r/versioning_trx_id.result create mode 100644 mysql-test/suite/galera/t/versioning_trx_id.cnf create mode 100644 mysql-test/suite/galera/t/versioning_trx_id.test diff --git a/mysql-test/suite/galera/r/versioning_trx_id.result b/mysql-test/suite/galera/r/versioning_trx_id.result new file mode 100644 index 0000000000000..f15916e51a5cb --- /dev/null +++ b/mysql-test/suite/galera/r/versioning_trx_id.result @@ -0,0 +1,52 @@ +connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3; +connection node_1; +create table t1 (a int, s bigint unsigned as row start, e bigint unsigned as row end, period for system_time(s,e)) engine=InnoDB with system versioning; +insert into t1 (a) values (1),(2); +connection node_2; +insert into t1 (a) values (3),(4); +select a from t1; +a +1 +2 +3 +4 +select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; +count(*) +0 +select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +count(*) +0 +connection node_3; +insert into t1 (a) values (5),(6); +select a from t1; +a +1 +2 +3 +4 +5 +6 +select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; +count(*) +0 +select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +count(*) +0 +connection node_1; +select a from t1; +a +1 +2 +3 +4 +5 +6 +select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; +count(*) +0 +select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +count(*) +0 +drop table t1; +disconnect node_2; +disconnect node_1; diff --git a/mysql-test/suite/galera/t/versioning_trx_id.cnf b/mysql-test/suite/galera/t/versioning_trx_id.cnf new file mode 100644 index 0000000000000..f7aecd36bf8ea --- /dev/null +++ b/mysql-test/suite/galera/t/versioning_trx_id.cnf @@ -0,0 +1 @@ +!include ../galera_4nodes.cnf diff --git a/mysql-test/suite/galera/t/versioning_trx_id.test b/mysql-test/suite/galera/t/versioning_trx_id.test new file mode 100644 index 0000000000000..175ead265a5fb --- /dev/null +++ b/mysql-test/suite/galera/t/versioning_trx_id.test @@ -0,0 +1,28 @@ +--source include/galera_cluster.inc + +--connect node_3, 127.0.0.1, root, , test, $NODE_MYPORT_3 + +--connection node_1 +create table t1 (a int, s bigint unsigned as row start, e bigint unsigned as row end, period for system_time(s,e)) engine=InnoDB with system versioning; +insert into t1 (a) values (1),(2); + +--connection node_2 +insert into t1 (a) values (3),(4); +select a from t1; +select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; +select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; + +--connection node_3 +insert into t1 (a) values (5),(6); +select a from t1; +select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; +select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; + +--connection node_1 +select a from t1; +select count(*) from mysql.transaction_registry where begin_timestamp='0-0-0'; +select count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; + +drop table t1; + +--source include/galera_end.inc diff --git a/mysql-test/suite/versioning/r/trx_id.result b/mysql-test/suite/versioning/r/trx_id.result index 2e0db5f2cde43..7d5e908b85a2e 100644 --- a/mysql-test/suite/versioning/r/trx_id.result +++ b/mysql-test/suite/versioning/r/trx_id.result @@ -475,3 +475,6 @@ COUNT(*) 1 DROP TABLE t; SET @@SYSTEM_VERSIONING_ALTER_HISTORY=ERROR; +SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; +count(*) +0 diff --git a/mysql-test/suite/versioning/t/trx_id.test b/mysql-test/suite/versioning/t/trx_id.test index 35ba65954402c..885455a697713 100644 --- a/mysql-test/suite/versioning/t/trx_id.test +++ b/mysql-test/suite/versioning/t/trx_id.test @@ -492,3 +492,5 @@ SELECT COUNT(*) FROM t FOR SYSTEM_TIME ALL; DROP TABLE t; SET @@SYSTEM_VERSIONING_ALTER_HISTORY=ERROR; + +SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp; diff --git a/sql/table.cc b/sql/table.cc index 4b2c88cc0e9cf..54261c76ddcf0 100644 --- a/sql/table.cc +++ b/sql/table.cc @@ -8763,6 +8763,7 @@ bool TR_table::update(ulonglong start_id, ulonglong end_id) return true; store(FLD_BEGIN_TS, thd->transaction_time()); + thd->set_time(); timeval end_time= {thd->query_start(), long(thd->query_start_sec_part())}; store(FLD_TRX_ID, start_id); store(FLD_COMMIT_ID, end_id); diff --git a/sql/wsrep_applier.cc b/sql/wsrep_applier.cc index f2d90def5efa1..1f50ee5571129 100644 --- a/sql/wsrep_applier.cc +++ b/sql/wsrep_applier.cc @@ -146,6 +146,7 @@ static wsrep_cb_status_t wsrep_apply_events(THD* thd, /* Use the original server id for logging. */ thd->set_server_id(ev->server_id); thd->set_time(); // time the query + thd->transaction.start_time.reset(thd); wsrep_xid_init(&thd->transaction.xid_state.xid, thd->wsrep_trx_meta.gtid.uuid, thd->wsrep_trx_meta.gtid.seqno);