From bf28dd0cff8b629a3038ed9074c68d87f99ad4d6 Mon Sep 17 00:00:00 2001 From: Onder Kalaci Date: Thu, 6 Sep 2018 14:30:09 +0300 Subject: [PATCH] Do not recover wrong distributed transactions in MX --- .../distributed/transaction/transaction_recovery.c | 2 +- .../expected/multi_mx_transaction_recovery.out | 14 ++++++++++++++ .../regress/sql/multi_mx_transaction_recovery.sql | 12 ++++++++++++ 3 files changed, 27 insertions(+), 1 deletion(-) diff --git a/src/backend/distributed/transaction/transaction_recovery.c b/src/backend/distributed/transaction/transaction_recovery.c index 452250015..fde13608e 100644 --- a/src/backend/distributed/transaction/transaction_recovery.c +++ b/src/backend/distributed/transaction/transaction_recovery.c @@ -420,7 +420,7 @@ PendingWorkerTransactionList(MultiConnection *connection) int coordinatorId = GetLocalGroupId(); appendStringInfo(command, "SELECT gid FROM pg_prepared_xacts " - "WHERE gid LIKE 'citus_%d_%%'", + "WHERE gid LIKE 'citus\\_%d\\_%%'", coordinatorId); querySent = SendRemoteCommand(connection, command->data); diff --git a/src/test/regress/expected/multi_mx_transaction_recovery.out b/src/test/regress/expected/multi_mx_transaction_recovery.out index c5477df41..9b257681b 100644 --- a/src/test/regress/expected/multi_mx_transaction_recovery.out +++ b/src/test/regress/expected/multi_mx_transaction_recovery.out @@ -50,15 +50,29 @@ PREPARE TRANSACTION 'citus_12_should_commit'; BEGIN; CREATE TABLE should_be_sorted_into_middle (value int); PREPARE TRANSACTION 'citus_12_should_be_sorted_into_middle'; +-- this node (e.g., node id 12) should not touch +-- transactions with different nodeIds in the gid +BEGIN; +CREATE TABLE table_should_do_nothing (value int); +PREPARE TRANSACTION 'citus_122_should_do_nothing'; -- Add "fake" pg_dist_transaction records and run recovery INSERT INTO pg_dist_transaction VALUES (12, 'citus_12_should_commit'); INSERT INTO pg_dist_transaction VALUES (12, 'citus_12_should_be_forgotten'); +INSERT INTO pg_dist_transaction VALUES (122, 'citus_122_should_do_nothing'); SELECT recover_prepared_transactions(); recover_prepared_transactions ------------------------------- 3 (1 row) +-- delete the citus_122_should_do_nothing transaction +DELETE FROM pg_dist_transaction WHERE gid = 'citus_122_should_do_nothing' RETURNING *; + groupid | gid +---------+----------------------------- + 122 | citus_122_should_do_nothing +(1 row) + +ROLLBACK PREPARED 'citus_122_should_do_nothing'; SELECT count(*) FROM pg_dist_transaction; count ------- diff --git a/src/test/regress/sql/multi_mx_transaction_recovery.sql b/src/test/regress/sql/multi_mx_transaction_recovery.sql index 250cc029b..ea12e40dd 100644 --- a/src/test/regress/sql/multi_mx_transaction_recovery.sql +++ b/src/test/regress/sql/multi_mx_transaction_recovery.sql @@ -36,11 +36,23 @@ BEGIN; CREATE TABLE should_be_sorted_into_middle (value int); PREPARE TRANSACTION 'citus_12_should_be_sorted_into_middle'; +-- this node (e.g., node id 12) should not touch +-- transactions with different nodeIds in the gid +BEGIN; +CREATE TABLE table_should_do_nothing (value int); +PREPARE TRANSACTION 'citus_122_should_do_nothing'; + -- Add "fake" pg_dist_transaction records and run recovery INSERT INTO pg_dist_transaction VALUES (12, 'citus_12_should_commit'); INSERT INTO pg_dist_transaction VALUES (12, 'citus_12_should_be_forgotten'); +INSERT INTO pg_dist_transaction VALUES (122, 'citus_122_should_do_nothing'); SELECT recover_prepared_transactions(); + +-- delete the citus_122_should_do_nothing transaction +DELETE FROM pg_dist_transaction WHERE gid = 'citus_122_should_do_nothing' RETURNING *; +ROLLBACK PREPARED 'citus_122_should_do_nothing'; + SELECT count(*) FROM pg_dist_transaction; SELECT count(*) FROM pg_tables WHERE tablename = 'table_should_abort';