From 62406086b3d2046a3ce1d7d84d51e6ce4721b885 Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Wed, 9 Aug 2023 14:53:44 +0900 Subject: [PATCH v3 3/3] Tweak to force OOM behavior when replaying records --- src/backend/access/transam/xlogreader.c | 26 ++++++++++++++++++++++++- 1 file changed, 25 insertions(+), 1 deletion(-) diff --git a/src/backend/access/transam/xlogreader.c b/src/backend/access/transam/xlogreader.c index c29b8ff387..ed43360f78 100644 --- a/src/backend/access/transam/xlogreader.c +++ b/src/backend/access/transam/xlogreader.c @@ -557,6 +557,7 @@ XLogDecodeNextRecord(XLogReaderState *state, bool nonblocking) int readOff; DecodedXLogRecord *decoded; XLogReaderError errordata = {0}; /* not used */ + bool trigger_oom = false; /* * randAccess indicates whether to verify the previous-record pointer of @@ -708,7 +709,30 @@ restart: total_len, !nonblocking /* allow_oversized */ ); - if (decoded == NULL) +#ifndef FRONTEND + + /* + * Trick to emulate an OOM after a hardcoded number of records replayed. + */ + { + struct stat fstat; + static int counter = 0; + + if (stat("/tmp/xlogreader_oom", &fstat) == 0) + { + counter++; + if (counter >= 100) + { + trigger_oom = true; + + /* Reset counter, to not fail when shutting down WAL */ + counter = 0; + } + } + } +#endif + + if (decoded == NULL || trigger_oom) { /* * There is no space in the decode buffer. The caller should help -- 2.40.1