From: | Konstantin Knizhnik <k(dot)knizhnik(at)postgrespro(dot)ru> |
---|---|
To: | Michael Paquier <michael(at)paquier(dot)xyz>, Alvaro Herrera <alvherre(at)2ndquadrant(dot)com> |
Cc: | Oleksii Kliukin <alexk(at)hintbits(dot)com>, PostgreSQL-development <pgsql-hackers(at)postgresql(dot)org> |
Subject: | Re: Prepared transaction releasing locks before deregistering its GID |
Date: | 2019-02-19 09:26:04 |
Message-ID: | 6a95c096-7b5d-0c58-db7f-99c653ed7db6@postgrespro.ru |
Views: | Raw Message | Whole Thread | Download mbox | Resend email |
Thread: | |
Lists: | pgsql-hackers |
On 19.02.2019 7:44, Michael Paquier wrote:
> On Tue, Feb 19, 2019 at 01:07:06AM -0300, Alvaro Herrera wrote:
>> On 2019-Feb-19, Michael Paquier wrote:
>>> extern GlobalTransaction MarkAsPreparing(TransactionId xid, const char *gid,
>> Hmm, ABI break ...
> Well, sure. I always post patches for HEAD first. And I was actually
> wondering if that's worth back-patching per the odds of facing the
> error and seeing how old it is.
> --
> Michael
May be I missed something, but why it is not possible just to move
removing 2PC GXact before releasing transaction locks:
diff --git a/src/backend/access/transam/twophase.c
b/src/backend/access/transam/twophase.c
index 9a8a6bb..574d28b 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -1560,17 +1560,6 @@ FinishPreparedTransaction(const char *gid, bool
isCommit)
if (hdr->initfileinval)
RelationCacheInitFilePostInvalidate();
- /* And now do the callbacks */
- if (isCommit)
- ProcessRecords(bufptr, xid, twophase_postcommit_callbacks);
- else
- ProcessRecords(bufptr, xid, twophase_postabort_callbacks);
-
- PredicateLockTwoPhaseFinish(xid, isCommit);
-
- /* Count the prepared xact as committed or aborted */
- AtEOXact_PgStat(isCommit);
-
/*
* And now we can clean up any files we may have left.
*/
@@ -1582,6 +1571,17 @@ FinishPreparedTransaction(const char *gid, bool
isCommit)
LWLockRelease(TwoPhaseStateLock);
MyLockedGxact = NULL;
+ /* And now do the callbacks */
+ if (isCommit)
+ ProcessRecords(bufptr, xid, twophase_postcommit_callbacks);
+ else
+ ProcessRecords(bufptr, xid, twophase_postabort_callbacks);
+
+ PredicateLockTwoPhaseFinish(xid, isCommit);
+
+ /* Count the prepared xact as committed or aborted */
+ AtEOXact_PgStat(isCommit);
+
RESUME_INTERRUPTS();
pfree(buf);
--
Konstantin Knizhnik
Postgres Professional: http://www.postgrespro.com
The Russian Postgres Company
From | Date | Subject | |
---|---|---|---|
Next Message | Michael Meskes | 2019-02-19 09:26:51 | Re: [Bug Fix] ECPG: could not use set xxx to default statement |
Previous Message | Magnus Hagander | 2019-02-19 08:56:28 | Re: Reaping Temp tables to avoid XID wraparound |