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 */
|
/* compute latestXid among all children */
|
||||||
latestXid = TransactionIdLatest(xid, hdr->nsubxacts, 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
|
* The order of operations here is critical: make the XLOG entry for
|
||||||
* commit or abort, then mark the transaction committed or aborted in
|
* commit or abort, then mark the transaction committed or aborted in
|
||||||
@ -1578,6 +1581,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
|
|||||||
LWLockRelease(TwoPhaseStateLock);
|
LWLockRelease(TwoPhaseStateLock);
|
||||||
MyLockedGxact = NULL;
|
MyLockedGxact = NULL;
|
||||||
|
|
||||||
|
RESUME_INTERRUPTS();
|
||||||
|
|
||||||
pfree(buf);
|
pfree(buf);
|
||||||
}
|
}
|
||||||
|
|
||||||
|
Loading…
x
Reference in New Issue
Block a user