On Wed, Sep 17, 2025 at 4:19 PM Vitaly Davydov <v.davy...@postgrespro.ru> wrote: > > [1] 0001-Fix-invalidation-when-slot-is-created-during-checkpo.patch >
- /* Calculate how many segments are kept by slots. */ - keep = slotsMinReqLSN; + /* + * Calculate how many segments are kept by slots. Keep the wal using + * the minimal value from the current reserved LSN and the reserved LSN at + * the moment of checkpoint start (before CheckPointReplicationSlots). + */ + keep = XLogGetReplicationSlotMinimumLSN(); + if (!XLogRecPtrIsInvalid(slotsMinReqLSN)) + keep = Min(keep, slotsMinReqLSN); Can we add why we need this additional calculation here? I have one question regarding commit 2090edc6f32f652a2c: * if (InvalidateObsoleteReplicationSlots(RS_INVAL_WAL_REMOVED, _logSegNo, InvalidOid, InvalidTransactionId)) { + /* + * Recalculate the current minimum LSN to be used in the WAL segment + * cleanup. Then, we must synchronize the replication slots again in + * order to make this LSN safe to use. + */ + slotsMinReqLSN = XLogGetReplicationSlotMinimumLSN(); + CheckPointReplicationSlots(shutdown); + /* * Some slots have been invalidated; recalculate the old-segment * horizon, starting again from RedoRecPtr. */ XLByteToSeg(RedoRecPtr, _logSegNo, wal_segment_size); - KeepLogSeg(recptr, &_logSegNo); + KeepLogSeg(recptr, slotsMinReqLSN, &_logSegNo); After invalidating the slots, we recalculate the slotsMinReqLSN with the latest value of XLogGetReplicationSlotMinimumLSN(). Can't it generate a more recent value of slot's restart_lsn which has not been flushed and we may end up removing the corresponding WAL? We should probably add some comments as to why such a race doesn't exist. -- With Regards, Amit Kapila.