</para>
       <para>
         The time when the slot became inactive. <literal>NULL</literal> if the
-        slot is currently being streamed.
+        slot is currently being streamed. If the slot becomes invalid,
+        this value will never be updated.
         Note that for slots on the standby that are being synced from a
         primary server (whose <structfield>synced</structfield> field is
         <literal>true</literal>), the <structfield>inactive_since</structfield>
 
     * Reset the time since the slot has become inactive as the slot is active
     * now.
     */
-   SpinLockAcquire(&s->mutex);
-   s->inactive_since = 0;
-   SpinLockRelease(&s->mutex);
+   ReplicationSlotSetInactiveSince(s, 0, true);
 
    if (am_walsender)
    {
         */
        SpinLockAcquire(&slot->mutex);
        slot->active_pid = 0;
-       slot->inactive_since = now;
+       ReplicationSlotSetInactiveSince(slot, now, false);
        SpinLockRelease(&slot->mutex);
        ConditionVariableBroadcast(&slot->active_cv);
    }
    else
-   {
-       SpinLockAcquire(&slot->mutex);
-       slot->inactive_since = now;
-       SpinLockRelease(&slot->mutex);
-   }
+       ReplicationSlotSetInactiveSince(slot, now, true);
 
    MyReplicationSlot = NULL;
 
    bool        restored = false;
    int         readBytes;
    pg_crc32c   checksum;
+   TimestampTz now = 0;
 
    /* no need to lock here, no concurrent access allowed yet */
 
        /*
         * Set the time since the slot has become inactive after loading the
         * slot from the disk into memory. Whoever acquires the slot i.e.
-        * makes the slot active will reset it.
+        * makes the slot active will reset it. Use the same inactive_since
+        * time for all the slots.
         */
-       slot->inactive_since = GetCurrentTimestamp();
+       if (now == 0)
+           now = GetCurrentTimestamp();
+
+       ReplicationSlotSetInactiveSince(slot, now, false);
 
        restored = true;
        break;
 
    ReplicationSlot replication_slots[1];
 } ReplicationSlotCtlData;
 
+/*
+ * Set slot's inactive_since property unless it was previously invalidated.
+ */
+static inline void
+ReplicationSlotSetInactiveSince(ReplicationSlot *s, TimestampTz ts,
+                               bool acquire_lock)
+{
+   if (acquire_lock)
+       SpinLockAcquire(&s->mutex);
+
+   if (s->data.invalidated == RS_INVAL_NONE)
+       s->inactive_since = ts;
+
+   if (acquire_lock)
+       SpinLockRelease(&s->mutex);
+}
+
 /*
  * Pointers to shared memory
  */