diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c
index c64f020742f..600b87fa9cb 100644
--- a/src/backend/replication/slot.c
+++ b/src/backend/replication/slot.c
@@ -424,7 +424,6 @@ ReplicationSlotCreate(const char *name, bool db_specific,
 	slot->candidate_restart_valid = InvalidXLogRecPtr;
 	slot->candidate_restart_lsn = InvalidXLogRecPtr;
 	slot->last_saved_confirmed_flush = InvalidXLogRecPtr;
-	slot->last_saved_restart_lsn = InvalidXLogRecPtr;
 	slot->inactive_since = 0;
 
 	/*
@@ -1166,41 +1165,20 @@ ReplicationSlotsComputeRequiredLSN(void)
 	{
 		ReplicationSlot *s = &ReplicationSlotCtl->replication_slots[i];
 		XLogRecPtr	restart_lsn;
-		XLogRecPtr	last_saved_restart_lsn;
 		bool		invalidated;
-		ReplicationSlotPersistency persistency;
 
 		if (!s->in_use)
 			continue;
 
 		SpinLockAcquire(&s->mutex);
-		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
-		last_saved_restart_lsn = s->last_saved_restart_lsn;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
-		/*
-		 * For persistent slot use last_saved_restart_lsn to compute the
-		 * oldest LSN for removal of WAL segments.  The segments between
-		 * last_saved_restart_lsn and restart_lsn might be needed by a
-		 * persistent slot in the case of database crash.  Non-persistent
-		 * slots can't survive the database crash, so we don't care about
-		 * last_saved_restart_lsn for them.
-		 */
-		if (persistency == RS_PERSISTENT)
-		{
-			if (last_saved_restart_lsn != InvalidXLogRecPtr &&
-				restart_lsn > last_saved_restart_lsn)
-			{
-				restart_lsn = last_saved_restart_lsn;
-			}
-		}
-
 		if (restart_lsn != InvalidXLogRecPtr &&
 			(min_required == InvalidXLogRecPtr ||
 			 restart_lsn < min_required))
@@ -1238,9 +1216,7 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 	{
 		ReplicationSlot *s;
 		XLogRecPtr	restart_lsn;
-		XLogRecPtr	last_saved_restart_lsn;
 		bool		invalidated;
-		ReplicationSlotPersistency persistency;
 
 		s = &ReplicationSlotCtl->replication_slots[i];
 
@@ -1254,33 +1230,14 @@ ReplicationSlotsComputeLogicalRestartLSN(void)
 
 		/* read once, it's ok if it increases while we're checking */
 		SpinLockAcquire(&s->mutex);
-		persistency = s->data.persistency;
 		restart_lsn = s->data.restart_lsn;
 		invalidated = s->data.invalidated != RS_INVAL_NONE;
-		last_saved_restart_lsn = s->last_saved_restart_lsn;
 		SpinLockRelease(&s->mutex);
 
 		/* invalidated slots need not apply */
 		if (invalidated)
 			continue;
 
-		/*
-		 * For persistent slot use last_saved_restart_lsn to compute the
-		 * oldest LSN for removal of WAL segments.  The segments between
-		 * last_saved_restart_lsn and restart_lsn might be needed by a
-		 * persistent slot in the case of database crash.  Non-persistent
-		 * slots can't survive the database crash, so we don't care about
-		 * last_saved_restart_lsn for them.
-		 */
-		if (persistency == RS_PERSISTENT)
-		{
-			if (last_saved_restart_lsn != InvalidXLogRecPtr &&
-				restart_lsn > last_saved_restart_lsn)
-			{
-				restart_lsn = last_saved_restart_lsn;
-			}
-		}
-
 		if (restart_lsn == InvalidXLogRecPtr)
 			continue;
 
@@ -1498,7 +1455,6 @@ ReplicationSlotReserveWal(void)
 
 	Assert(slot != NULL);
 	Assert(slot->data.restart_lsn == InvalidXLogRecPtr);
-	Assert(slot->last_saved_restart_lsn == InvalidXLogRecPtr);
 
 	/*
 	 * The replication slot mechanism is used to prevent removal of required
@@ -1810,8 +1766,6 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 		 */
 		SpinLockAcquire(&s->mutex);
 
-		Assert(s->data.restart_lsn >= s->last_saved_restart_lsn);
-
 		restart_lsn = s->data.restart_lsn;
 
 		/* we do nothing if the slot is already invalid */
@@ -1881,10 +1835,7 @@ InvalidatePossiblyObsoleteSlot(uint32 possible_causes,
 			 * just rely on .invalidated.
 			 */
 			if (invalidation_cause == RS_INVAL_WAL_REMOVED)
-			{
 				s->data.restart_lsn = InvalidXLogRecPtr;
-				s->last_saved_restart_lsn = InvalidXLogRecPtr;
-			}
 
 			/* Let caller know */
 			*invalidated = true;
@@ -2128,12 +2079,6 @@ CheckPointReplicationSlots(bool is_shutdown)
 		SaveSlotToPath(s, path, LOG);
 	}
 	LWLockRelease(ReplicationSlotAllocationLock);
-
-	/*
-	 * Recompute the required LSN as SaveSlotToPath() updated
-	 * last_saved_restart_lsn for slots.
-	 */
-	ReplicationSlotsComputeRequiredLSN();
 }
 
 /*
@@ -2409,7 +2354,6 @@ SaveSlotToPath(ReplicationSlot *slot, const char *dir, int elevel)
 	if (!slot->just_dirtied)
 		slot->dirty = false;
 	slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
-	slot->last_saved_restart_lsn = cp.slotdata.restart_lsn;
 	SpinLockRelease(&slot->mutex);
 
 	LWLockRelease(&slot->io_in_progress_lock);
@@ -2625,7 +2569,6 @@ RestoreSlotFromDisk(const char *name)
 		slot->effective_xmin = cp.slotdata.xmin;
 		slot->effective_catalog_xmin = cp.slotdata.catalog_xmin;
 		slot->last_saved_confirmed_flush = cp.slotdata.confirmed_flush;
-		slot->last_saved_restart_lsn = cp.slotdata.restart_lsn;
 
 		slot->candidate_catalog_xmin = InvalidTransactionId;
 		slot->candidate_xmin_lsn = InvalidXLogRecPtr;
diff --git a/src/include/replication/slot.h b/src/include/replication/slot.h
index ffacba9d2ae..eb0b93b1114 100644
--- a/src/include/replication/slot.h
+++ b/src/include/replication/slot.h
@@ -215,14 +215,6 @@ typedef struct ReplicationSlot
 	 * recently stopped.
 	 */
 	TimestampTz inactive_since;
-
-	/*
-	 * Latest restart_lsn that has been flushed to disk. For persistent slots
-	 * the flushed LSN should be taken into account when calculating the
-	 * oldest LSN for WAL segments removal.
-	 */
-	XLogRecPtr	last_saved_restart_lsn;
-
 } ReplicationSlot;
 
 #define SlotIsPhysical(slot) ((slot)->data.database == InvalidOid)
diff --git a/src/test/recovery/t/046_checkpoint_logical_slot.pl b/src/test/recovery/t/046_checkpoint_logical_slot.pl
index d67c5108d78..9e1285339fb 100644
--- a/src/test/recovery/t/046_checkpoint_logical_slot.pl
+++ b/src/test/recovery/t/046_checkpoint_logical_slot.pl
@@ -21,7 +21,7 @@ my ($node, $result);
 
 $node = PostgreSQL::Test::Cluster->new('mike');
 $node->init;
-$node->append_conf('postgresql.conf', "wal_level = 'logical'");
+$node->append_conf('postgresql.conf', "wal_level = 'logical'\nwal_keep_size=1GB");
 $node->start;
 
 # Check if the extension injection_points is available, as it may be
diff --git a/src/test/recovery/t/047_checkpoint_physical_slot.pl b/src/test/recovery/t/047_checkpoint_physical_slot.pl
index a1332b5d44c..63fd2277cbe 100644
--- a/src/test/recovery/t/047_checkpoint_physical_slot.pl
+++ b/src/test/recovery/t/047_checkpoint_physical_slot.pl
@@ -21,7 +21,7 @@ my ($node, $result);
 
 $node = PostgreSQL::Test::Cluster->new('mike');
 $node->init;
-$node->append_conf('postgresql.conf', "wal_level = 'replica'");
+$node->append_conf('postgresql.conf', "wal_level = 'replica'\nwal_keep_size=1GB");
 $node->start;
 
 # Check if the extension injection_points is available, as it may be
