diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 99f702cb804ece6fad877daf445d3cc2697635e1..60531277dc67b88cc0fdf4cfe6f6bd728d9cd3dd 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -6446,6 +6446,16 @@ StartupXLOG(void)
 	 */
 	ShutdownWalRcv();
 
+	/*
+	 * Reset unlogged relations to the contents of their INIT fork. This is
+	 * done AFTER recovery is complete so as to include any unlogged relations
+	 * created during recovery, but BEFORE recovery is marked as having
+	 * completed successfully. Otherwise we'd not retry if any of the post
+	 * end-of-recovery steps fail.
+	 */
+	if (InRecovery)
+		ResetUnloggedRelations(UNLOGGED_RELATION_INIT);
+
 	/*
 	 * We don't need the latch anymore. It's not strictly necessary to disown
 	 * it, but let's do it for the sake of tidiness.
@@ -6713,14 +6723,6 @@ StartupXLOG(void)
 	 */
 	PreallocXlogFiles(EndOfLog);
 
-	/*
-	 * Reset initial contents of unlogged relations.  This has to be done
-	 * AFTER recovery is complete so that any unlogged relations created
-	 * during recovery also get picked up.
-	 */
-	if (InRecovery)
-		ResetUnloggedRelations(UNLOGGED_RELATION_INIT);
-
 	/*
 	 * Okay, we're officially UP.
 	 */