summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorTeodor Sigaev <teodor@sigaev.ru>2018-05-03 20:10:11 +0300
committerTeodor Sigaev <teodor@sigaev.ru>2018-05-03 20:10:11 +0300
commit6bd659f19cac6bcf7235ac4f7dd4e36c8d2cc755 (patch)
treebda865b86f526e1ba2c3dbbb01cf435d43facac1
parent70211459a507b080d15b6a82d8a466323edc356d (diff)
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
-rw-r--r--src/backend/access/transam/twophase.c5
1 files changed, 5 insertions, 0 deletions
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);
}