From e41d0a1090b75fed4c033c2e404643382348f88e Mon Sep 17 00:00:00 2001 From: Michael Paquier Date: Mon, 23 Jul 2018 09:37:36 +0900 Subject: [PATCH] Add proper errcodes to new error messages for read() failures Those would use the default ERRCODE_INTERNAL_ERROR, but for foreseeable failures an errcode ought to be set, ERRCODE_DATA_CORRUPTED making the most sense here. While on the way, fix one errcode_for_file_access missing in origin.c since the code has been created, and remove one assignment of errno to 0 before calling read(), as this was around to fit with what was present before 811b6e36 where errno would not be set when not enough bytes are read. I have noticed the first one, and Tom has pinged me about the second one. Author: Michael Paquier Reported-by: Tom Lane Discussion: https://postgr.es/m/27265.1531925836@sss.pgh.pa.us --- src/backend/access/transam/xlog.c | 10 ++++++---- src/backend/replication/logical/origin.c | 6 ++++-- src/backend/replication/logical/snapbuild.c | 12 ++++++++---- src/backend/replication/slot.c | 6 ++++-- src/backend/replication/walsender.c | 6 ++++-- src/backend/utils/cache/relmapper.c | 3 ++- src/common/controldata_utils.c | 3 ++- 7 files changed, 30 insertions(+), 16 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 9f8ae9dc75..335b4a573d 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -3412,7 +3412,6 @@ XLogFileCopy(XLogSegNo destsegno, TimeLineID srcTLI, XLogSegNo srcsegno, if (nread > sizeof(buffer)) nread = sizeof(buffer); - errno = 0; pgstat_report_wait_start(WAIT_EVENT_WAL_COPY_READ); r = read(srcfd, buffer, nread); if (r != nread) @@ -3424,7 +3423,8 @@ XLogFileCopy(XLogSegNo destsegno, TimeLineID srcTLI, XLogSegNo srcsegno, path))); else ereport(ERROR, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", path, r, (Size) nread))); } pgstat_report_wait_end(); @@ -4564,7 +4564,8 @@ ReadControlFile(void) XLOG_CONTROL_FILE))); else ereport(PANIC, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", XLOG_CONTROL_FILE, r, sizeof(ControlFileData)))); } pgstat_report_wait_end(); @@ -11829,7 +11830,8 @@ retry: } else ereport(emode_for_corrupt_record(emode, targetPagePtr + reqLen), - (errmsg("could not read from log segment %s, offset %u: read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read from log segment %s, offset %u: read %d of %zu", fname, readOff, r, (Size) XLOG_BLCKSZ))); goto next_record_is_invalid; } diff --git a/src/backend/replication/logical/origin.c b/src/backend/replication/logical/origin.c index 2d05d04b87..822c96d1c2 100644 --- a/src/backend/replication/logical/origin.c +++ b/src/backend/replication/logical/origin.c @@ -715,11 +715,13 @@ StartupReplicationOrigin(void) { if (readBytes < 0) ereport(PANIC, - (errmsg("could not read file \"%s\": %m", + (errcode_for_file_access(), + errmsg("could not read file \"%s\": %m", path))); else ereport(PANIC, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", path, readBytes, sizeof(magic)))); } COMP_CRC32C(crc, &magic, sizeof(magic)); diff --git a/src/backend/replication/logical/snapbuild.c b/src/backend/replication/logical/snapbuild.c index 7bd969b0a1..1359d9b20a 100644 --- a/src/backend/replication/logical/snapbuild.c +++ b/src/backend/replication/logical/snapbuild.c @@ -1736,7 +1736,8 @@ SnapBuildRestore(SnapBuild *builder, XLogRecPtr lsn) } else ereport(ERROR, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", path, readBytes, (Size) SnapBuildOnDiskConstantSize))); } @@ -1775,7 +1776,8 @@ SnapBuildRestore(SnapBuild *builder, XLogRecPtr lsn) } else ereport(ERROR, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", path, readBytes, sizeof(SnapBuild)))); } COMP_CRC32C(checksum, &ondisk.builder, sizeof(SnapBuild)); @@ -1802,7 +1804,8 @@ SnapBuildRestore(SnapBuild *builder, XLogRecPtr lsn) } else ereport(ERROR, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", path, readBytes, sz))); } COMP_CRC32C(checksum, ondisk.builder.was_running.was_xip, sz); @@ -1828,7 +1831,8 @@ SnapBuildRestore(SnapBuild *builder, XLogRecPtr lsn) } else ereport(ERROR, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", path, readBytes, sz))); } COMP_CRC32C(checksum, ondisk.builder.committed.xip, sz); diff --git a/src/backend/replication/slot.c b/src/backend/replication/slot.c index 271af08572..6c36398058 100644 --- a/src/backend/replication/slot.c +++ b/src/backend/replication/slot.c @@ -1420,7 +1420,8 @@ RestoreSlotFromDisk(const char *name) errmsg("could not read file \"%s\": %m", path))); else ereport(PANIC, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", path, readBytes, (Size) ReplicationSlotOnDiskConstantSize))); } @@ -1464,7 +1465,8 @@ RestoreSlotFromDisk(const char *name) errmsg("could not read file \"%s\": %m", path))); else ereport(PANIC, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", path, readBytes, (Size) cp.length))); } diff --git a/src/backend/replication/walsender.c b/src/backend/replication/walsender.c index e8f4f37e5c..d60026dfd1 100644 --- a/src/backend/replication/walsender.c +++ b/src/backend/replication/walsender.c @@ -509,7 +509,8 @@ SendTimeLineHistory(TimeLineHistoryCmd *cmd) path))); else if (nread == 0) ereport(ERROR, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", path, nread, (Size) bytesleft))); pq_sendbytes(&buf, rbuf, nread); @@ -2442,7 +2443,8 @@ retry: else if (readbytes == 0) { ereport(ERROR, - (errmsg("could not read from log segment %s, offset %u: read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read from log segment %s, offset %u: read %d of %zu", XLogFileNameP(curFileTimeLine, sendSegNo), sendOff, readbytes, (Size) segbytes))); } diff --git a/src/backend/utils/cache/relmapper.c b/src/backend/utils/cache/relmapper.c index 2d31f9f912..c7f0e6f6d4 100644 --- a/src/backend/utils/cache/relmapper.c +++ b/src/backend/utils/cache/relmapper.c @@ -669,7 +669,8 @@ load_relmap_file(bool shared) errmsg("could not read file \"%s\": %m", mapfilename))); else ereport(FATAL, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", mapfilename, r, sizeof(RelMapFile)))); } pgstat_report_wait_end(); diff --git a/src/common/controldata_utils.c b/src/common/controldata_utils.c index 60197b2440..e24af48f52 100644 --- a/src/common/controldata_utils.c +++ b/src/common/controldata_utils.c @@ -83,7 +83,8 @@ get_controlfile(const char *DataDir, const char *progname, bool *crc_ok_p) else #ifndef FRONTEND ereport(ERROR, - (errmsg("could not read file \"%s\": read %d of %zu", + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("could not read file \"%s\": read %d of %zu", ControlFilePath, r, sizeof(ControlFileData)))); #else { -- 2.40.0