diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 88fa270fe3c69cd4a4968dbc5f41e1f4ee50c008..cdd0091a5f0e3685dc8218d21435e9848674d670 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -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); }