On Monday, February 10, 2025 2:10 PM Amit Kapila <amit.kapil...@gmail.com> wrote: > > 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.
Yes, both places need to be fixed. > > > 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? Yes, I think that would be better. > > > 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. Sorry, I mistakenly thought that the slot only protected dead tuples. Please disregard this comment. Best Regards, Hou zj