mirror of
https://github.com/postgres/postgres.git
synced 2025-05-01 01:04:50 +03:00
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
This commit is contained in:
parent
cddc4dc6c6
commit
8f9be261f4
@ -1487,6 +1487,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
|
||||
@ -1578,6 +1581,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
|
||||
LWLockRelease(TwoPhaseStateLock);
|
||||
MyLockedGxact = NULL;
|
||||
|
||||
RESUME_INTERRUPTS();
|
||||
|
||||
pfree(buf);
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user