On Sat, Feb 8, 2025 at 12:28 PM Zhijie Hou (Fujitsu) <houzj.f...@fujitsu.com> wrote: > > 3. > > + if (cause & RS_INVAL_HORIZON) > + { > + if (!SlotIsLogical(s)) > + goto invalidation_marked; > > I am not sure if this logic is correct. Even if the slot would not be > invalidated due to RS_INVAL_HORIZON, we should continue to check other causes. >
Isn't this comment apply to even the next condition (if (dboid != InvalidOid && dboid != s->data.database))? We need to probably continue to check other invalidation causes unless one is set. > Besides, instead of using a goto, I personally prefer to move all these codes > into a separate function which would return a single invalidation cause. > Instead of using goto label (invalidation_marked:), won't it be better if we use a boolean invalidation_marked and convert all if's to if .. else if .. else cases? > 4. > - if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED, > + if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED | > RS_INVAL_IDLE_TIMEOUT, > > _logSegNo, InvalidOid, > > InvalidTransactionId)) > > I think this change could trigger an unnecessary WAL position re-calculation > when > slots are invalidated only due to RS_INVAL_IDLE_TIMEOUT. > Why is that unnecessary? If some slots got invalidated due to timeout, we don't want to retain the WAL corresponding to them. -- With Regards, Amit Kapila.