From 664e5b872a35ef2124cb4fa7da003017e070fef9 Mon Sep 17 00:00:00 2001
From: Ayush Tiwari <ayushtiwari.slg01@gmail.com>
Date: Fri, 2 Oct 2026 09:08:10 +0000
Subject: [PATCH v5 2/3] Avoid core dumps for WAL disk-full failures

Use errnocoredump_on_errno(ENOSPC) for selected WAL and control-file I/O
errors that report or may be promoted to PANIC.  They retain existing
crash handling, while ENOSPC terminates without requesting a core file.
Other errno values, corruption failures, and internal-invariant PANICs
still use abort().

Control-file I/O can run in the postmaster.  Configuration has already
been read before its initial control-file read, so the developer override
is available there.  During crash reinitialization, the postmaster reads
the control file only after all non-syslogger children have exited.

Reviewed-by: Nazir Bilal Yavuz <byavuz81@gmail.com>
---
 src/backend/access/transam/xlog.c         | 21 +++++++++++++++++++++
 src/backend/access/transam/xlogrecovery.c |  2 ++
 src/backend/replication/walreceiver.c     |  1 +
 src/common/controldata_utils.c            |  4 ++++
 4 files changed, 28 insertions(+)

diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c
index 9ec0be77ca0..aace542509c 100644
--- a/src/backend/access/transam/xlog.c
+++ b/src/backend/access/transam/xlog.c
@@ -2528,6 +2528,7 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible)
 					errno = save_errno;
 					ereport(PANIC,
 							(errcode_for_file_access(),
+							 errnocoredump_on_errno(ENOSPC),
 							 errmsg("could not write to log file \"%s\" at offset %u, length %zu: %m",
 									xlogfname, startoffset, nleft)));
 				}
@@ -3327,6 +3328,7 @@ XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli,
 		if (errno != ENOENT)
 			ereport(ERROR,
 					(errcode_for_file_access(),
+					 errnocoredump_on_errno(ENOSPC),
 					 errmsg("could not open file \"%s\": %m", path)));
 	}
 	else
@@ -3352,6 +3354,7 @@ XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli,
 	if (fd < 0)
 		ereport(ERROR,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not create file \"%s\": %m", tmppath)));
 
 	/* Measure I/O timing when initializing segment */
@@ -3405,6 +3408,7 @@ XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli,
 
 		ereport(ERROR,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not write to file \"%s\": %m", tmppath)));
 	}
 
@@ -3427,6 +3431,7 @@ XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli,
 		errno = save_errno;
 		ereport(ERROR,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not fsync file \"%s\": %m", tmppath)));
 	}
 	pgstat_report_wait_end();
@@ -3437,6 +3442,7 @@ XLogFileInitInternal(XLogSegNo logsegno, TimeLineID logtli,
 	if (close(fd) != 0)
 		ereport(ERROR,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not close file \"%s\": %m", tmppath)));
 
 	/*
@@ -3507,6 +3513,7 @@ XLogFileInit(XLogSegNo logsegno, TimeLineID logtli)
 	if (fd < 0)
 		ereport(ERROR,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not open file \"%s\": %m", path)));
 	return fd;
 }
@@ -3625,6 +3632,7 @@ XLogFileCopy(TimeLineID destTLI, XLogSegNo destsegno,
 	if (pg_fsync(fd) != 0)
 		ereport(data_sync_elevel(ERROR),
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not fsync file \"%s\": %m", tmppath)));
 	pgstat_report_wait_end();
 
@@ -3739,6 +3747,7 @@ XLogFileOpen(XLogSegNo segno, TimeLineID tli)
 	if (fd < 0)
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not open file \"%s\": %m", path)));
 
 	return fd;
@@ -3772,6 +3781,7 @@ XLogFileClose(void)
 		errno = save_errno;
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not close file \"%s\": %m", xlogfname)));
 	}
 
@@ -4434,6 +4444,7 @@ WriteControlFile(void)
 	if (fd < 0)
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not create file \"%s\": %m",
 						XLOG_CONTROL_FILE)));
 
@@ -4446,6 +4457,7 @@ WriteControlFile(void)
 			errno = ENOSPC;
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not write to file \"%s\": %m",
 						XLOG_CONTROL_FILE)));
 	}
@@ -4455,6 +4467,7 @@ WriteControlFile(void)
 	if (pg_fsync(fd) != 0)
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not fsync file \"%s\": %m",
 						XLOG_CONTROL_FILE)));
 	pgstat_report_wait_end();
@@ -4462,6 +4475,7 @@ WriteControlFile(void)
 	if (close(fd) != 0)
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not close file \"%s\": %m",
 						XLOG_CONTROL_FILE)));
 }
@@ -4482,6 +4496,7 @@ ReadControlFile(void)
 	if (fd < 0)
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not open file \"%s\": %m",
 						XLOG_CONTROL_FILE)));
 
@@ -4492,6 +4507,7 @@ ReadControlFile(void)
 		if (r < 0)
 			ereport(PANIC,
 					(errcode_for_file_access(),
+					 errnocoredump_on_errno(ENOSPC),
 					 errmsg("could not read file \"%s\": %m",
 							XLOG_CONTROL_FILE)));
 		else
@@ -5797,6 +5813,7 @@ BootStrapXLOG(uint32 data_checksum_version)
 			errno = ENOSPC;
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not write bootstrap write-ahead log file: %m")));
 	}
 	pgstat_report_wait_end();
@@ -5805,12 +5822,14 @@ BootStrapXLOG(uint32 data_checksum_version)
 	if (pg_fsync(openLogFile) != 0)
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not fsync bootstrap write-ahead log file: %m")));
 	pgstat_report_wait_end();
 
 	if (close(openLogFile) != 0)
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not close bootstrap write-ahead log file: %m")));
 
 	openLogFile = -1;
@@ -9856,6 +9875,7 @@ assign_wal_sync_method(int new_wal_sync_method, void *extra)
 				errno = save_errno;
 				ereport(PANIC,
 						(errcode_for_file_access(),
+						 errnocoredump_on_errno(ENOSPC),
 						 errmsg("could not fsync file \"%s\": %m", xlogfname)));
 			}
 
@@ -9934,6 +9954,7 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli)
 		errno = save_errno;
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg(msg, xlogfname)));
 	}
 
diff --git a/src/backend/access/transam/xlogrecovery.c b/src/backend/access/transam/xlogrecovery.c
index 54aaec9529f..eeb703b688e 100644
--- a/src/backend/access/transam/xlogrecovery.c
+++ b/src/backend/access/transam/xlogrecovery.c
@@ -3415,6 +3415,7 @@ retry:
 			errno = save_errno;
 			ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen),
 					(errcode_for_file_access(),
+					 errnocoredump_on_errno(ENOSPC),
 					 errmsg("could not read from WAL segment %s, LSN %X/%08X, offset %u: %m",
 							fname, LSN_FORMAT_ARGS(targetPagePtr),
 							readOff)));
@@ -4287,6 +4288,7 @@ XLogFileRead(XLogSegNo segno, TimeLineID tli,
 	if (errno != ENOENT || !notfoundOk) /* unexpected failure? */
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not open file \"%s\": %m", path)));
 	return -1;
 }
diff --git a/src/backend/replication/walreceiver.c b/src/backend/replication/walreceiver.c
index b93e699ba4b..2e44c019394 100644
--- a/src/backend/replication/walreceiver.c
+++ b/src/backend/replication/walreceiver.c
@@ -1047,6 +1047,7 @@ XLogWalRcvWrite(char *buf, Size nbytes, XLogRecPtr recptr, TimeLineID tli)
 			errno = save_errno;
 			ereport(PANIC,
 					(errcode_for_file_access(),
+					 errnocoredump_on_errno(ENOSPC),
 					 errmsg("could not write to WAL segment %s "
 							"at offset %d, length %d: %m",
 							xlogfname, startoff, segbytes)));
diff --git a/src/common/controldata_utils.c b/src/common/controldata_utils.c
index 0e8e03c566c..4c566b46b88 100644
--- a/src/common/controldata_utils.c
+++ b/src/common/controldata_utils.c
@@ -223,6 +223,7 @@ update_controlfile(const char *DataDir,
 	if ((fd = BasicOpenFile(ControlFilePath, O_RDWR | PG_BINARY)) < 0)
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not open file \"%s\": %m",
 						ControlFilePath)));
 #else
@@ -244,6 +245,7 @@ update_controlfile(const char *DataDir,
 #ifndef FRONTEND
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not write file \"%s\": %m",
 						ControlFilePath)));
 #else
@@ -261,6 +263,7 @@ update_controlfile(const char *DataDir,
 		if (pg_fsync(fd) != 0)
 			ereport(PANIC,
 					(errcode_for_file_access(),
+					 errnocoredump_on_errno(ENOSPC),
 					 errmsg("could not fsync file \"%s\": %m",
 							ControlFilePath)));
 		pgstat_report_wait_end();
@@ -275,6 +278,7 @@ update_controlfile(const char *DataDir,
 #ifndef FRONTEND
 		ereport(PANIC,
 				(errcode_for_file_access(),
+				 errnocoredump_on_errno(ENOSPC),
 				 errmsg("could not close file \"%s\": %m",
 						ControlFilePath)));
 #else
-- 
2.43.0

