From c5c0c5d3b5fc43760da0fa4ed9466077af573056 Mon Sep 17 00:00:00 2001
From: Michael Paquier <michael@paquier.xyz>
Date: Tue, 8 Aug 2023 16:22:18 +0900
Subject: [PATCH v1 2/3] Force a FATAL when facing OOM in WAL replay

---
 src/backend/access/transam/xlogrecovery.c | 8 +++++++-
 1 file changed, 7 insertions(+), 1 deletion(-)

diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c
index 06b00c7c46..e3b156ec15 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -3098,9 +3098,15 @@ ReadRecord(XLogPrefetcher *xlogprefetcher, int emode,
 			 * failed - in that case we already logged something. In
 			 * StandbyMode that only happens if we have been triggered, so we
 			 * shouldn't loop anymore in that case.
+			 *
+			 * If we failed because of an out-of-memory problem, just give up
+			 * and retry recovery later.  It may be posible that the WAL record
+			 * to decode required a larger memory allocation than what the host
+			 * can offer.
 			 */
 			if (errormsg)
-				ereport(emode_for_corrupt_record(emode, xlogreader->EndRecPtr),
+				ereport(errorcode == XLOG_READER_OOM ?
+						FATAL : emode_for_corrupt_record(emode, xlogreader->EndRecPtr),
 						(errmsg_internal("%s", errormsg) /* already translated */ ));
 		}
 
-- 
2.40.1

