diff --git a/src/backend/storage/ipc/procarray.c b/src/backend/storage/ipc/procarray.c
index 42a89fc5dc..2e819163c4 100644
--- a/src/backend/storage/ipc/procarray.c
+++ b/src/backend/storage/ipc/procarray.c
@@ -4853,10 +4853,24 @@ KnownAssignedXidsRemovePreceding(TransactionId removeXid)
 
 	if (!TransactionIdIsValid(removeXid))
 	{
-		elog(trace_recovery(DEBUG4), "removing all KnownAssignedXids");
-		pArray->numKnownAssignedXids = 0;
-		pArray->headKnownAssignedXids = pArray->tailKnownAssignedXids = 0;
-		return;
+		tail = pArray->tailKnownAssignedXids;
+		head = pArray->headKnownAssignedXids;
+
+		for (i = tail; i < head; i++)
+		{
+			if (KnownAssignedXidsValid[i])
+			{
+				TransactionId knownXid = KnownAssignedXids[i];
+
+				if (!StandbyTransactionIdIsPrepared(knownXid))
+				{
+					KnownAssignedXidsValid[i] = false;
+					count++;
+				}
+			}
+		}
+
+		goto recompute;
 	}
 
 	elog(trace_recovery(DEBUG4), "prune KnownAssignedXids to %u", removeXid);
@@ -4885,6 +4899,9 @@ KnownAssignedXidsRemovePreceding(TransactionId removeXid)
 		}
 	}
 
+	/* fall through */
+recompute:
+
 	pArray->numKnownAssignedXids -= count;
 	Assert(pArray->numKnownAssignedXids >= 0);
 
