From 804c2d87a2d0204c7e1996ed41fec326bc6d0d21 Mon Sep 17 00:00:00 2001 From: Nazir Bilal Yavuz Date: Mon, 4 Dec 2023 15:22:32 +0300 Subject: [PATCH v1 1/2] [xlog.c] Add missing error codes to PANIC/FATAL error reports --- src/backend/access/transam/xlog.c | 110 ++++++++++++++++++++---------- 1 file changed, 74 insertions(+), 36 deletions(-) diff --git a/src/backend/access/transam/xlog.c b/src/backend/access/transam/xlog.c index 2d603d8dee..8cc2664db7 100644 --- a/src/backend/access/transam/xlog.c +++ b/src/backend/access/transam/xlog.c @@ -1353,7 +1353,9 @@ CopyXLogRecordToWAL(int write_len, bool isLogSwitch, XLogRecData *rdata, } if (CurrPos != EndPos) - elog(PANIC, "space reserved for WAL record does not match what was written"); + ereport(PANIC, + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("space reserved for WAL record does not match what was written"))); } /* @@ -1502,7 +1504,9 @@ WaitXLogInsertionsToFinish(XLogRecPtr upto) int i; if (MyProc == NULL) - elog(PANIC, "cannot wait without a PGPROC structure"); + ereport(PANIC, + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("cannot wait without a PGPROC structure"))); /* Read the current insert position */ SpinLockAcquire(&Insert->insertpos_lck); @@ -1683,8 +1687,10 @@ GetXLogBuffer(XLogRecPtr ptr, TimeLineID tli) endptr = XLogCtl->xlblocks[idx]; if (expectedEndPtr != endptr) - elog(PANIC, "could not find WAL buffer for %X/%X", - LSN_FORMAT_ARGS(ptr)); + ereport(PANIC, + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("could not find WAL buffer for %X/%X", + LSN_FORMAT_ARGS(ptr)))); } else { @@ -2211,9 +2217,11 @@ XLogWrite(XLogwrtRqst WriteRqst, TimeLineID tli, bool flexible) XLogRecPtr EndPtr = XLogCtl->xlblocks[curridx]; if (LogwrtResult.Write >= EndPtr) - elog(PANIC, "xlog write request %X/%X is past end of log %X/%X", - LSN_FORMAT_ARGS(LogwrtResult.Write), - LSN_FORMAT_ARGS(EndPtr)); + ereport(PANIC, + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("xlog write request %X/%X is past end of log %X/%X", + LSN_FORMAT_ARGS(LogwrtResult.Write), + LSN_FORMAT_ARGS(EndPtr)))); /* Advance LogwrtResult.Write to end of current buffer page */ LogwrtResult.Write = EndPtr; @@ -3891,7 +3899,8 @@ ValidateXLOGDirectoryStructure(void) if (stat(XLOGDIR, &stat_buf) != 0 || !S_ISDIR(stat_buf.st_mode)) ereport(FATAL, - (errmsg("required WAL directory \"%s\" does not exist", + (errcode_for_file_access(), + errmsg("required WAL directory \"%s\" does not exist", XLOGDIR))); /* Check for archive_status */ @@ -3901,7 +3910,8 @@ ValidateXLOGDirectoryStructure(void) /* Check for weird cases where it exists but isn't a directory */ if (!S_ISDIR(stat_buf.st_mode)) ereport(FATAL, - (errmsg("required WAL directory \"%s\" does not exist", + (errcode_for_file_access(), + errmsg("required WAL directory \"%s\" does not exist", path))); } else @@ -3910,7 +3920,8 @@ ValidateXLOGDirectoryStructure(void) (errmsg("creating missing WAL directory \"%s\"", path))); if (MakePGDirectory(path) < 0) ereport(FATAL, - (errmsg("could not create missing directory \"%s\": %m", + (errcode_for_file_access(), + errmsg("could not create missing directory \"%s\": %m", path))); } } @@ -4127,7 +4138,8 @@ ReadControlFile(void) if (ControlFile->pg_control_version != PG_CONTROL_VERSION && ControlFile->pg_control_version % 65536 == 0 && ControlFile->pg_control_version / 65536 != 0) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with PG_CONTROL_VERSION %d (0x%08x)," " but the server was compiled with PG_CONTROL_VERSION %d (0x%08x).", ControlFile->pg_control_version, ControlFile->pg_control_version, @@ -4136,7 +4148,8 @@ ReadControlFile(void) if (ControlFile->pg_control_version != PG_CONTROL_VERSION) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with PG_CONTROL_VERSION %d," " but the server was compiled with PG_CONTROL_VERSION %d.", ControlFile->pg_control_version, PG_CONTROL_VERSION), @@ -4151,7 +4164,8 @@ ReadControlFile(void) if (!EQ_CRC32C(crc, ControlFile->crc)) ereport(FATAL, - (errmsg("incorrect checksum in control file"))); + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("incorrect checksum in control file"))); /* * Do compatibility checking immediately. If the database isn't @@ -4160,68 +4174,78 @@ ReadControlFile(void) */ if (ControlFile->catalog_version_no != CATALOG_VERSION_NO) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with CATALOG_VERSION_NO %d," " but the server was compiled with CATALOG_VERSION_NO %d.", ControlFile->catalog_version_no, CATALOG_VERSION_NO), errhint("It looks like you need to initdb."))); if (ControlFile->maxAlign != MAXIMUM_ALIGNOF) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with MAXALIGN %d," " but the server was compiled with MAXALIGN %d.", ControlFile->maxAlign, MAXIMUM_ALIGNOF), errhint("It looks like you need to initdb."))); if (ControlFile->floatFormat != FLOATFORMAT_VALUE) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster appears to use a different floating-point number format than the server executable."), errhint("It looks like you need to initdb."))); if (ControlFile->blcksz != BLCKSZ) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with BLCKSZ %d," " but the server was compiled with BLCKSZ %d.", ControlFile->blcksz, BLCKSZ), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->relseg_size != RELSEG_SIZE) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with RELSEG_SIZE %d," " but the server was compiled with RELSEG_SIZE %d.", ControlFile->relseg_size, RELSEG_SIZE), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->xlog_blcksz != XLOG_BLCKSZ) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with XLOG_BLCKSZ %d," " but the server was compiled with XLOG_BLCKSZ %d.", ControlFile->xlog_blcksz, XLOG_BLCKSZ), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->nameDataLen != NAMEDATALEN) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with NAMEDATALEN %d," " but the server was compiled with NAMEDATALEN %d.", ControlFile->nameDataLen, NAMEDATALEN), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->indexMaxKeys != INDEX_MAX_KEYS) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with INDEX_MAX_KEYS %d," " but the server was compiled with INDEX_MAX_KEYS %d.", ControlFile->indexMaxKeys, INDEX_MAX_KEYS), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->toast_max_chunk_size != TOAST_MAX_CHUNK_SIZE) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with TOAST_MAX_CHUNK_SIZE %d," " but the server was compiled with TOAST_MAX_CHUNK_SIZE %d.", ControlFile->toast_max_chunk_size, (int) TOAST_MAX_CHUNK_SIZE), errhint("It looks like you need to recompile or initdb."))); if (ControlFile->loblksize != LOBLKSIZE) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with LOBLKSIZE %d," " but the server was compiled with LOBLKSIZE %d.", ControlFile->loblksize, (int) LOBLKSIZE), @@ -4230,14 +4254,16 @@ ReadControlFile(void) #ifdef USE_FLOAT8_BYVAL if (ControlFile->float8ByVal != true) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized without USE_FLOAT8_BYVAL" " but the server was compiled with USE_FLOAT8_BYVAL."), errhint("It looks like you need to recompile or initdb."))); #else if (ControlFile->float8ByVal != false) ereport(FATAL, - (errmsg("database files are incompatible with server"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("database files are incompatible with server"), errdetail("The database cluster was initialized with USE_FLOAT8_BYVAL" " but the server was compiled without USE_FLOAT8_BYVAL."), errhint("It looks like you need to recompile or initdb."))); @@ -5110,7 +5136,8 @@ CheckRequiredParameterValues(void) if (ArchiveRecoveryRequested && ControlFile->wal_level == WAL_LEVEL_MINIMAL) { ereport(FATAL, - (errmsg("WAL was generated with wal_level=minimal, cannot continue recovering"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL was generated with wal_level=minimal, cannot continue recovering"), errdetail("This happens if you temporarily set wal_level=minimal on the server."), errhint("Use a backup taken after setting wal_level to higher than minimal."))); } @@ -5176,7 +5203,8 @@ StartupXLOG(void) */ if (!XRecOffIsValid(ControlFile->checkPoint)) ereport(FATAL, - (errmsg("control file contains invalid checkpoint location"))); + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("control file contains invalid checkpoint location"))); switch (ControlFile->state) { @@ -5227,7 +5255,8 @@ StartupXLOG(void) default: ereport(FATAL, - (errmsg("control file contains invalid database cluster state"))); + (errcode(ERRCODE_DATA_CORRUPTED), + errmsg("control file contains invalid database cluster state"))); } /* This is just to allow attaching to startup process with a debugger */ @@ -5611,11 +5640,13 @@ StartupXLOG(void) { if (!XLogRecPtrIsInvalid(ControlFile->backupStartPoint) || ControlFile->backupEndRequired) ereport(FATAL, - (errmsg("WAL ends before end of online backup"), + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL ends before end of online backup"), errhint("All WAL generated while online backup was taken must be available at recovery."))); else ereport(FATAL, - (errmsg("WAL ends before consistent recovery point"))); + (errcode(ERRCODE_OBJECT_NOT_IN_PREREQUISITE_STATE), + errmsg("WAL ends before consistent recovery point"))); } } @@ -6913,7 +6944,8 @@ CreateCheckPoint(int flags) */ if (shutdown && checkPoint.redo != ProcLastRecPtr) ereport(PANIC, - (errmsg("concurrent write-ahead log activity while database system is shutting down"))); + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("concurrent write-ahead log activity while database system is shutting down"))); /* * Remember the prior checkpoint's redo ptr for @@ -7931,7 +7963,8 @@ xlog_redo(XLogReaderState *record) !XLogRecPtrIsInvalid(ControlFile->backupStartPoint) && XLogRecPtrIsInvalid(ControlFile->backupEndPoint)) ereport(PANIC, - (errmsg("online backup was canceled, recovery cannot continue"))); + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("online backup was canceled, recovery cannot continue"))); /* * If we see a shutdown checkpoint, we know that nothing was running @@ -7988,7 +8021,8 @@ xlog_redo(XLogReaderState *record) (void) GetCurrentReplayRecPtr(&replayTLI); if (checkPoint.ThisTimeLineID != replayTLI) ereport(PANIC, - (errmsg("unexpected timeline ID %u (should be %u) in shutdown checkpoint record", + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("unexpected timeline ID %u (should be %u) in shutdown checkpoint record", checkPoint.ThisTimeLineID, replayTLI))); RecoveryRestartPoint(&checkPoint, record); @@ -8046,7 +8080,8 @@ xlog_redo(XLogReaderState *record) (void) GetCurrentReplayRecPtr(&replayTLI); if (checkPoint.ThisTimeLineID != replayTLI) ereport(PANIC, - (errmsg("unexpected timeline ID %u (should be %u) in online checkpoint record", + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("unexpected timeline ID %u (should be %u) in online checkpoint record", checkPoint.ThisTimeLineID, replayTLI))); RecoveryRestartPoint(&checkPoint, record); @@ -8075,7 +8110,8 @@ xlog_redo(XLogReaderState *record) (void) GetCurrentReplayRecPtr(&replayTLI); if (xlrec.ThisTimeLineID != replayTLI) ereport(PANIC, - (errmsg("unexpected timeline ID %u (should be %u) in end-of-recovery record", + (errcode(ERRCODE_INTERNAL_ERROR), + errmsg("unexpected timeline ID %u (should be %u) in end-of-recovery record", xlrec.ThisTimeLineID, replayTLI))); } else if (info == XLOG_NOOP) @@ -8359,7 +8395,9 @@ issue_xlog_fsync(int fd, XLogSegNo segno, TimeLineID tli) Assert(false); break; default: - elog(PANIC, "unrecognized wal_sync_method: %d", wal_sync_method); + ereport(PANIC, + (errcode(ERRCODE_INVALID_PARAMETER_VALUE), + errmsg("unrecognized wal_sync_method: %d", wal_sync_method))); break; } -- 2.25.1