From 82c69bd8fb0972d9aed6876162d56e9511834b92 Mon Sep 17 00:00:00 2001 From: Ayush Tiwari Date: Fri, 2 Oct 2026 09:08:10 +0000 Subject: [PATCH v3 2/2] 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. --- src/backend/access/transam/xlog.c | 21 +++++++++++++++++++++ src/backend/access/transam/xlogrecovery.c | 2 ++ src/common/controldata_utils.c | 4 ++++ 3 files changed, 27 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/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