Location via proxy:   [ UP ]  
[Report a bug]   [Manage cookies]                
Add HOLD_INTERRUPTS section into FinishPreparedTransaction.
authorTeodor Sigaev <teodor@sigaev.ru>
Thu, 3 May 2018 17:09:28 +0000 (20:09 +0300)
committerTeodor Sigaev <teodor@sigaev.ru>
Thu, 3 May 2018 17:09:28 +0000 (20:09 +0300)
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

index 88fa270fe3c69cd4a4968dbc5f41e1f4ee50c008..cdd0091a5f0e3685dc8218d21435e9848674d670 100644 (file)
@@ -1377,6 +1377,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
@@ -1465,6 +1468,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
    RemoveGXact(gxact);
    MyLockedGxact = NULL;
 
+   RESUME_INTERRUPTS();
+
    pfree(buf);
 }