From 868074dc754a5887b1a1da34fa4ed18cccb24f7b Mon Sep 17 00:00:00 2001 From: gentle_hu Date: Fri, 28 Aug 2020 11:45:23 +0800 Subject: [PATCH] fix core when commit prepared xact --- .../storage/access/transam/twophase.cpp | 8 +++ src/test/regress/expected/transactions.out | 52 +++++++++++++++++++ src/test/regress/sql/transactions.sql | 22 ++++++++ 3 files changed, 82 insertions(+) diff --git a/src/gausskernel/storage/access/transam/twophase.cpp b/src/gausskernel/storage/access/transam/twophase.cpp index b02705887b..4cfebab549 100755 --- a/src/gausskernel/storage/access/transam/twophase.cpp +++ b/src/gausskernel/storage/access/transam/twophase.cpp @@ -2079,6 +2079,14 @@ void FinishPreparedTransaction(const char* gid, bool isCommit) * callbacks will release the locks the transaction held. */ if (isCommit) { + CommitSeqNo csn = SetXact2CommitInProgress(xid, 0); + if (XLogStandbyInfoActive()) { + XLogBeginInsert(); + XLogRegisterData((char*)(&xid), sizeof(TransactionId)); + XLogRegisterData((char*)(&csn), sizeof(CommitSeqNo)); + XLogInsert(RM_STANDBY_ID, XLOG_STANDBY_CSN_COMMITTING); + } + setCommitCsn(getNextCSN()); pgxact->needToSyncXid = true; RecordTransactionCommitPrepared(xid, hdr->nsubxacts, diff --git a/src/test/regress/expected/transactions.out b/src/test/regress/expected/transactions.out index 8c4c9860fa..bc648cef6b 100644 --- a/src/test/regress/expected/transactions.out +++ b/src/test/regress/expected/transactions.out @@ -614,6 +614,58 @@ fetch from foo; (1 row) abort; +-- Test for prepared xacts +create table prepared_xact_test(a int); +start transaction; +insert into prepared_xact_test values (1); +prepare transaction 'pxact1'; +commit; +WARNING: there is no transaction in progress +select * from prepared_xact_test; + a +--- +(0 rows) + +select gid from pg_prepared_xacts; + gid +-------- + pxact1 +(1 row) + +commit prepared 'pxact1'; +select * from prepared_xact_test; + a +--- + 1 +(1 row) + +select * from pg_prepared_xacts; + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) + +begin; +insert into prepared_xact_test values (2); +prepare transaction 'pxact2'; +select gid from pg_prepared_xacts; + gid +-------- + pxact2 +(1 row) + +rollback prepared 'pxact2'; +select * from prepared_xact_test; + a +--- + 1 +(1 row) + +select * from pg_prepared_xacts; + transaction | gid | prepared | owner | database +-------------+-----+----------+-------+---------- +(0 rows) + +drop table prepared_xact_test; -- Test for proper cleanup after a failure in a cursor portal -- that was created in an outer subtransaction CREATE FUNCTION invert(x float8) RETURNS float8 LANGUAGE plpgsql AS diff --git a/src/test/regress/sql/transactions.sql b/src/test/regress/sql/transactions.sql index 80c661635e..52fe48db53 100644 --- a/src/test/regress/sql/transactions.sql +++ b/src/test/regress/sql/transactions.sql @@ -368,6 +368,28 @@ fetch from foo; abort; +-- Test for prepared xacts +create table prepared_xact_test(a int); +start transaction; +insert into prepared_xact_test values (1); +prepare transaction 'pxact1'; +commit; +select * from prepared_xact_test; +select gid from pg_prepared_xacts; +commit prepared 'pxact1'; +select * from prepared_xact_test; +select * from pg_prepared_xacts; + +begin; +insert into prepared_xact_test values (2); +prepare transaction 'pxact2'; +select gid from pg_prepared_xacts; +rollback prepared 'pxact2'; +select * from prepared_xact_test; +select * from pg_prepared_xacts; + +drop table prepared_xact_test; + -- Test for proper cleanup after a failure in a cursor portal -- that was created in an outer subtransaction CREATE FUNCTION invert(x float8) RETURNS float8 LANGUAGE plpgsql AS -- Gitee