On Fri, Sep 12, 2025 at 8:55 AM Zhijie Hou (Fujitsu)
<[email protected]> wrote:
>
> I agree. Here is a V73 patch that will restart the worker if the retention
> resumes. I also addressed other comments posted by Amit[1].
>

Few comments:
============
* In adjust_xid_advance_interval(), for the case when retention is not
active, we still cap the interval by wal_receiver_status_interval. Is
that required or do we let it go till 3 minutes? We can add a new else
if loop to keep the code clear, if you agree with this.

*
+ /*
+ * Resume retention immediately if required. (See
+ * should_resume_retention_immediately() for details).
+ */
+ if (should_resume_retention_immediately(rdt_data, status_received))
+ rdt_data->phase = RDT_RESUME_CONFLICT_INFO_RETENTION;

Is this optimization for the case when we are in stop_phase or after
stop_phase and someone has changed maxretention to 0? If so, I don't
think it is worth optimizing for such a rare case at the cost of
making code difficult to understand.

Apart from this, I have changed a few comments in the attached.

-- 
With Regards,
Amit Kapila.
diff --git a/src/backend/replication/logical/worker.c 
b/src/backend/replication/logical/worker.c
index 1274192de7e..7d1ed506622 100644
--- a/src/backend/replication/logical/worker.c
+++ b/src/backend/replication/logical/worker.c
@@ -4363,10 +4363,7 @@ maybe_advance_nonremovable_xid(RetainDeadTuplesData 
*rdt_data,
        if (!can_advance_nonremovable_xid(rdt_data))
                return;
 
-       /*
-        * Resume retention immediately if required. (See
-        * should_resume_retention_immediately() for details).
-        */
+       /* Resume dead_tuples retention immediately if required. */
        if (should_resume_retention_immediately(rdt_data, status_received))
                rdt_data->phase = RDT_RESUME_CONFLICT_INFO_RETENTION;
 
@@ -4549,8 +4546,8 @@ wait_for_publisher_status(RetainDeadTuplesData *rdt_data,
        {
                /*
                 * Stop retention if not yet. Otherwise, reset to the initial 
phase to
-                * retry all phases. This is required to recalculate the 
current wait
-                * time and resume retention if the time falls within
+                * retry resuming retention. This reset is required to 
recalculate the
+                * current wait time and resume retention if the time falls 
within
                 * max_retention_duration.
                 */
                if (MySubscription->retentionactive)
@@ -4683,8 +4680,8 @@ wait_for_local_flush(RetainDeadTuplesData *rdt_data)
        {
                /*
                 * Stop retention if not yet. Otherwise, reset to the initial 
phase to
-                * retry all phases. This is required to recalculate the 
current wait
-                * time and resume retention if the time falls within
+                * retry resuming retention. This reset is required to 
recalculate the
+                * current wait time and resume retention if the time falls 
within
                 * max_retention_duration.
                 */
                if (MySubscription->retentionactive)
@@ -4763,9 +4760,7 @@ wait_for_local_flush(RetainDeadTuplesData *rdt_data)
  * Check whether conflict information retention should be stopped due to
  * exceeding the maximum wait time (max_retention_duration).
  *
- * If retention should be stopped, transition to the
- * RDT_STOP_CONFLICT_INFO_RETENTION phase and return true. Otherwise, return
- * false.
+ * If retention should be stopped, return true. Otherwise, return false.
  */
 static bool
 should_stop_conflict_info_retention(RetainDeadTuplesData *rdt_data)

Reply via email to