One concern: if (should_stop_conflict_info_retention(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 + * max_retention_duration. + */ + if (MySubscription->retentionactive) + rdt_data->phase = RDT_STOP_CONFLICT_INFO_RETENTION; + else + reset_retention_data_fields(rdt_data); + return; + }
Instead of above code changes, shall we have: if (should_stop_conflict_info_retention(rdt_data)) rdt_data->phase = RDT_STOP_CONFLICT_INFO_RETENTION; (always) And then stop_conflict_info_retention() should have these checks: if (MySubscription->retentionactive) { ...update flag and perform stop (current functionality) } else { Assert(!TransactionIdIsValid(MyLogicalRepWorker->oldest_nonremovable_xid)); reset_retention_data_fields(rdt_data); } thanks Shveta