postgres.git / summary / log / commit / refs

commit    6bd659f19cac6bcf7235ac4f7dd4e36c8d2cc755
Author:   Teodor Sigaev <teodor@sigaev.ru>
Date:     Thu May 03 17:10:11 2018 +0000
First released in: 11.0, 9.3.23, 9.4.18, 9.5.13, 9.6.9, 10.4

    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


src/backend/access/transam/twophase.c | 5 +++++ 1 file changed, 5 insertions(+) diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 3d2f04e81db..a7a9fc5d059 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -1391,6 +1391,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 @@ -1478,6 +1481,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit) RemoveGXact(gxact); MyLockedGxact = NULL; + RESUME_INTERRUPTS(); + pfree(buf); } [parent: 70211459a507]