Commit 44016ec0 authored by Eugene Kosov's avatar Eugene Kosov

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
parent 9556d56d
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;
--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
...@@ -475,3 +475,6 @@ COUNT(*) ...@@ -475,3 +475,6 @@ COUNT(*)
1 1
DROP TABLE t; DROP TABLE t;
SET @@SYSTEM_VERSIONING_ALTER_HISTORY=ERROR; SET @@SYSTEM_VERSIONING_ALTER_HISTORY=ERROR;
SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp;
count(*)
0
...@@ -492,3 +492,5 @@ SELECT COUNT(*) FROM t FOR SYSTEM_TIME ALL; ...@@ -492,3 +492,5 @@ SELECT COUNT(*) FROM t FOR SYSTEM_TIME ALL;
DROP TABLE t; DROP TABLE t;
SET @@SYSTEM_VERSIONING_ALTER_HISTORY=ERROR; SET @@SYSTEM_VERSIONING_ALTER_HISTORY=ERROR;
SELECT count(*) from mysql.transaction_registry where begin_timestamp>=commit_timestamp;
...@@ -8763,6 +8763,7 @@ bool TR_table::update(ulonglong start_id, ulonglong end_id) ...@@ -8763,6 +8763,7 @@ bool TR_table::update(ulonglong start_id, ulonglong end_id)
return true; return true;
store(FLD_BEGIN_TS, thd->transaction_time()); store(FLD_BEGIN_TS, thd->transaction_time());
thd->set_time();
timeval end_time= {thd->query_start(), long(thd->query_start_sec_part())}; timeval end_time= {thd->query_start(), long(thd->query_start_sec_part())};
store(FLD_TRX_ID, start_id); store(FLD_TRX_ID, start_id);
store(FLD_COMMIT_ID, end_id); store(FLD_COMMIT_ID, end_id);
......
...@@ -146,6 +146,7 @@ static wsrep_cb_status_t wsrep_apply_events(THD* thd, ...@@ -146,6 +146,7 @@ static wsrep_cb_status_t wsrep_apply_events(THD* thd,
/* Use the original server id for logging. */ /* Use the original server id for logging. */
thd->set_server_id(ev->server_id); thd->set_server_id(ev->server_id);
thd->set_time(); // time the query thd->set_time(); // time the query
thd->transaction.start_time.reset(thd);
wsrep_xid_init(&thd->transaction.xid_state.xid, wsrep_xid_init(&thd->transaction.xid_state.xid,
thd->wsrep_trx_meta.gtid.uuid, thd->wsrep_trx_meta.gtid.uuid,
thd->wsrep_trx_meta.gtid.seqno); thd->wsrep_trx_meta.gtid.seqno);
......
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