Re: Conflict detection for update_deleted in logical replication

From: shveta malik <shveta(dot)malik(at)gmail(dot)com>
To: "Zhijie Hou (Fujitsu)" <houzj(dot)fnst(at)fujitsu(dot)com>
Cc: Dilip Kumar <dilipbalaut(at)gmail(dot)com>, Amit Kapila <amit(dot)kapila16(at)gmail(dot)com>, Masahiko Sawada <sawada(dot)mshk(at)gmail(dot)com>, "Hayato Kuroda (Fujitsu)" <kuroda(dot)hayato(at)fujitsu(dot)com>, pgsql-hackers <pgsql-hackers(at)postgresql(dot)org>, vignesh C <vignesh21(at)gmail(dot)com>, Nisha Moond <nisha(dot)moond412(at)gmail(dot)com>, shveta malik <shveta(dot)malik(at)gmail(dot)com>
Subject: Re: Conflict detection for update_deleted in logical replication
Date: 2025-08-12 08:36:30
Message-ID: CAJpy0uB4235JBVf3Yehjtcf=W2Keba+TpPwHvqhJevFn7WMfJQ@mail.gmail.com
Views: Whole Thread | Raw Message | Download mbox | Resend email
Thread:
Lists: pgsql-hackers

On Mon, Aug 11, 2025 at 2:40 PM Zhijie Hou (Fujitsu)
<houzj(dot)fnst(at)fujitsu(dot)com> wrote:
>
> I agree. So, following the above points and some off-list discussions, I have
> revised the option to be a subscription option in the V60 version.
>

Thank You for the patches. Tried to test the new sub-level parameter,
have few comments:

1)
Let's say commit on pub is taking time and worker has stopped
retention and meanwhile we alter max_conflict_retention_duration=0,
then the expectation is immediately worker should resume retention.
But it does not happen, it does not restart conflict-retention until
the pub's commit is finished. The 'dead_tuple_retention_active'
remains 'f' till then.

postgres=# select subname, subretaindeadtuples, maxconflretention from
pg_subscription order by subname;
subname | subretaindeadtuples | maxconflretention
---------+---------------------+-------------------
sub1 | t | 0

postgres=# select subname, worker_type, dead_tuple_retention_active
from pg_stat_subscription order by subname;
subname | worker_type | dead_tuple_retention_active
---------+-------------+-----------------------------
sub1 | apply | f

I think we shall reset 'stop_conflict_info_retention' flag in
should_stop_conflict_info_retention() if maxconflretention is 0 and
the flag is originally true.

2)
postgres=# create subscription sub2 connection 'dbname=postgres
host=localhost user=shveta port=5433' publication pub2 WITH
(retain_dead_tuples = false, max_conflict_retention_duration=1000);
NOTICE: created replication slot "sub2" on publisher
CREATE SUBSCRIPTION

Shall we give notice that max_conflict_retention_duration is ignored
as retain_dead_tuples is false.

3)
When worker stops retention, it gives message:

LOG: logical replication worker for subscription "sub1" will stop
retaining the information for detecting conflicts
DETAIL: The time spent advancing the non-removable transaction ID has
exceeded the maximum limit of 100 ms.

Will it be more informative if we mention the parameter name
'max_conflict_retention_duration' either in DETAIL or in additional
HINT, as then the user can easily map this behaviour to the parameter
configured.

thanks
Shveta

In response to

Responses

Browse pgsql-hackers by date

  From Date Subject
Next Message Amit Kapila 2025-08-12 08:51:30 Re: Conflict detection for update_deleted in logical replication
Previous Message Shlok Kyal 2025-08-12 08:26:14 Re: POC: enable logical decoding when wal_level = 'replica' without a server restart