Re: pgsql: Preserve conflict-relevant data during logical replication. - Mailing list pgsql-hackers

From Robert Haas
Subject Re: pgsql: Preserve conflict-relevant data during logical replication.
Date
Msg-id CA+TgmoaQtB=cnMJwCA33bDrGt7x5ysoW770uJ2Z56AU_NVNdbw@mail.gmail.com
Whole thread Raw
Responses RE: pgsql: Preserve conflict-relevant data during logical replication.
List pgsql-hackers
On Wed, Jul 23, 2025 at 11:44 PM Amit Kapila <amit.kapila16@gmail.com> wrote:
> The fix looks good to me. I'll push your patch in sometime.

The tests in this patch are insufficient to prove that this logic
works properly. I tried with this patch:

diff --git a/src/backend/access/transam/twophase.c
b/src/backend/access/transam/twophase.c
index 7918176fc58..7c1d0ef07b5 100644
--- a/src/backend/access/transam/twophase.c
+++ b/src/backend/access/transam/twophase.c
@@ -2325,6 +2325,16 @@ RecordTransactionCommitPrepared(TransactionId xid,
     TimestampTz committs;
     bool        replorigin;

+    /*
+     * Note it is important to set committs value after marking ourselves as
+     * in the commit critical section (DELAY_CHKPT_IN_COMMIT). This is because
+     * we want to ensure all transactions that have acquired commit timestamp
+     * are finished before we allow the logical replication client to advance
+     * its xid which is used to hold back dead rows for conflict detection.
+     * See comments atop worker.c.
+     */
+    committs = GetCurrentTimestamp();
+
     /*
      * Are we using the replication origins feature?  Or, in other words, are
      * we replaying remote actions?
@@ -2344,16 +2354,6 @@ RecordTransactionCommitPrepared(TransactionId xid,
      */
     pg_write_barrier();

-    /*
-     * Note it is important to set committs value after marking ourselves as
-     * in the commit critical section (DELAY_CHKPT_IN_COMMIT). This is because
-     * we want to ensure all transactions that have acquired commit timestamp
-     * are finished before we allow the logical replication client to advance
-     * its xid which is used to hold back dead rows for conflict detection.
-     * See comments atop worker.c.
-     */
-    committs = GetCurrentTimestamp();
-
     /*
      * Emit the XLOG commit record. Note that we mark 2PC commits as
      * potentially having AccessExclusiveLocks since we don't know whether or

If it is in fact important to acquire the commit timestamp after
setting delayChkptFlags, you'd hope this would lead to a test failure,
but it doesn't for me. I understand it probably requires an injection
point to be certain of hitting the race condition, but I think that
would be worth doing. Otherwise, if something gets broken here by
accident, it might be a long time before anyone notices.

--
Robert Haas
EDB: http://www.enterprisedb.com



pgsql-hackers by date:

Previous
From: Andrew Dunstan
Date:
Subject: Re: split func.sgml to separated individual sgml files
Next
From: Jacob Champion
Date:
Subject: Re: pgsql: oauth: Add unit tests for multiplexer handling