Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Skip to content

Commit 8f9be26

Browse files
committed
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
1 parent cddc4dc commit 8f9be26

File tree

1 file changed

+5
-0
lines changed

1 file changed

+5
-0
lines changed

src/backend/access/transam/twophase.c

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -1487,6 +1487,9 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
14871487
/* compute latestXid among all children */
14881488
latestXid = TransactionIdLatest(xid, hdr->nsubxacts, children);
14891489

1490+
/* Prevent cancel/die interrupt while cleaning up */
1491+
HOLD_INTERRUPTS();
1492+
14901493
/*
14911494
* The order of operations here is critical: make the XLOG entry for
14921495
* commit or abort, then mark the transaction committed or aborted in
@@ -1578,6 +1581,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
15781581
LWLockRelease(TwoPhaseStateLock);
15791582
MyLockedGxact = NULL;
15801583

1584+
RESUME_INTERRUPTS();
1585+
15811586
pfree(buf);
15821587
}
15831588

0 commit comments

Comments
 (0)