diff options
author | Teodor Sigaev <teodor@sigaev.ru> | 2018-05-03 20:09:02 +0300 |
---|---|---|
committer | Teodor Sigaev <teodor@sigaev.ru> | 2018-05-03 20:09:02 +0300 |
commit | ee492e3dedbdfa6da9303f35b1a85f3b9f1af7a7 (patch) | |
tree | b0bc3814b6b147dbfc1c9aec3b784849de4d045f /src | |
parent | f74d83b3034f830bd68489b4aba99a4dee29c565 (diff) | |
download | postgresql-ee492e3dedbdfa6da9303f35b1a85f3b9f1af7a7.tar.gz postgresql-ee492e3dedbdfa6da9303f35b1a85f3b9f1af7a7.zip |
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
Diffstat (limited to 'src')
-rw-r--r-- | src/backend/access/transam/twophase.c | 5 |
1 files changed, 5 insertions, 0 deletions
diff --git a/src/backend/access/transam/twophase.c b/src/backend/access/transam/twophase.c index 2b3032bde98..6d82566adb5 100644 --- a/src/backend/access/transam/twophase.c +++ b/src/backend/access/transam/twophase.c @@ -1421,6 +1421,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 @@ -1511,6 +1514,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit) LWLockRelease(TwoPhaseStateLock); MyLockedGxact = NULL; + RESUME_INTERRUPTS(); + pfree(buf); } |