From: Teodor Sigaev Date: Thu, 3 May 2018 17:10:34 +0000 (+0300) Subject: Add HOLD_INTERRUPTS section into FinishPreparedTransaction. X-Git-Tag: REL9_3_23~10 X-Git-Url: https://granicus.if.org/sourcecode?a=commitdiff_plain;h=540e7a6e535ebdb12d83e6b639916f9df4420ae7;p=postgresql 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 --- diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index f3d239de6e..4e0756059e 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -1390,6 +1390,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 @@ -1477,6 +1480,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit) RemoveGXact(gxact); MyLockedGxact = NULL; + RESUME_INTERRUPTS(); + pfree(buf); }