🌐 AI搜索 & 代理 主页
Skip to content

Commit db76ba0

Browse files
committed
Fix bug with unfished prepared transactions in case of query cancel.
elog() called from xact callback caused CHECK_FOR_INTERRUPTS() and cancelled FinishPreparedTransaction() after WAL record was emmited but before ProcArray and GXact were emptied. So move callback down after sensible processing is finished.
1 parent 86fd22d commit db76ba0

File tree

1 file changed

+7
-7
lines changed

1 file changed

+7
-7
lines changed

src/backend/access/transam/twophase.c

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -1573,12 +1573,10 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
15731573
int ndelrels;
15741574
SharedInvalidationMessage *invalmsgs;
15751575
int i;
1576+
XactEvent finish_event;
15761577

1577-
1578-
if (isCommit)
1579-
{
1578+
if (isCommit)
15801579
CallXactCallbacks(XACT_EVENT_PRE_COMMIT_PREPARED);
1581-
}
15821580

15831581
/*
15841582
* Validate the GID, and lock the GXACT to ensure that two backends do not
@@ -1634,17 +1632,17 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
16341632
hdr->ncommitrels, commitrels,
16351633
hdr->ninvalmsgs, invalmsgs,
16361634
hdr->initfileinval, gid);
1637-
CallXactCallbacks(XACT_EVENT_COMMIT_PREPARED);
1635+
finish_event = XACT_EVENT_COMMIT_PREPARED;
16381636
}
16391637
else
16401638
{
16411639
RecordTransactionAbortPrepared(xid,
16421640
hdr->nsubxacts, children,
16431641
hdr->nabortrels, abortrels,
16441642
gid);
1645-
CallXactCallbacks(XACT_EVENT_ABORT_PREPARED);
1643+
finish_event = XACT_EVENT_ABORT_PREPARED;
16461644
}
1647-
1645+
16481646

16491647
ProcArrayRemove(proc, latestXid);
16501648

@@ -1716,6 +1714,8 @@ FinishPreparedTransaction(const char *gid, bool isCommit)
17161714
MyLockedGxact = NULL;
17171715

17181716
pfree(buf);
1717+
1718+
CallXactCallbacks(finish_event);
17191719
}
17201720

17211721
/*

0 commit comments

Comments
 (0)