postgres.git / summary / log / commit / refs
commit d3fc427f478f09153ea5995b460410614c2267ce
Author: Teodor Sigaev <teodor@sigaev.ru>
Date: Thu May 03 17:09:47 2018 +0000
First released in: 11.0, 9.3.23, 9.4.18, 9.5.13, 9.6.9, 10.4
Add HOLD_INTERRUPTS section into FinishPreparedTransaction.
If an interrupt arrives in the middle of FinishPreparedTransaction
and any callback decide to call CHECK_FOR_INTERRUPTS (e.g.
RemoveTwoPhaseFile can write a warning with ereport, which checks for
interrupts) then it's possible to leave current GXact undeleted.
Backpatch to all supported branches
Stas Kelvich
Discussion: ihttps://www.postgresql.org/message-id/3AD85097-A3F3-4EBA-99BD-C38EDF8D2949@postgrespro.ru
src/backend/access/transam/twophase.c | 5 +++++
1 file changed, 5 insertions(+)
diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c
index a2804c8f033..161282b0794 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -1402,6 +1402,9 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
/* compute latestXid among all children */
latestXid = TransactionIdLatest(xid, hdr->nsubxacts, children);
+ /* Prevent cancel/die interrupt while cleaning up */
+ HOLD_INTERRUPTS();
+
/*
* The order of operations here is critical: make the XLOG entry for
* commit or abort, then mark the transaction committed or aborted in
@@ -1489,6 +1492,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
RemoveGXact(gxact);
MyLockedGxact = NULL;
+ RESUME_INTERRUPTS();
+
pfree(buf);
}
[parent: 8fbdd63a52df]