Fix bogus log message when starting from a cleanly shut down state.

In commit 70e81861fa to split xlog.c, I moved the startup code that
updates the state in the control file and prints out the "database
system was not properly shut down" message to the log, but I
accidentally removed the "if (InRecovery)" check around it. As a
result, that message was printed even if the system was cleanly shut
down, also during 'initdb'.

Discussion: https://www.postgresql.org/message-id/3357075.1645031062@sss.pgh.pa.us
pull/77/head
Heikki Linnakangas 3 years ago
parent 01ad1c9530
commit 4620892344
  1. 118
      src/backend/access/transam/xlogrecovery.c

@ -840,69 +840,75 @@ InitWalRecovery(ControlFileData *ControlFile, bool *wasShutdown_ptr,
} }
/* /*
* Update pg_control to show that we are recovering and to show the * If recovery is needed, update our in-memory copy of pg_control to show
* selected checkpoint as the place we are starting from. We also mark * that we are recovering and to show the selected checkpoint as the place
* pg_control with any minimum recovery stop point obtained from a backup * we are starting from. We also mark pg_control with any minimum recovery
* history file. * stop point obtained from a backup history file.
*
* We don't write the changes to disk yet, though. Only do that after
* initializing various subsystems.
*/ */
if (InArchiveRecovery) if (InRecovery)
{
ControlFile->state = DB_IN_ARCHIVE_RECOVERY;
}
else
{ {
ereport(LOG, if (InArchiveRecovery)
(errmsg("database system was not properly shut down; " {
"automatic recovery in progress"))); ControlFile->state = DB_IN_ARCHIVE_RECOVERY;
if (recoveryTargetTLI > ControlFile->checkPointCopy.ThisTimeLineID) }
else
{
ereport(LOG, ereport(LOG,
(errmsg("crash recovery starts in timeline %u " (errmsg("database system was not properly shut down; "
"and has target timeline %u", "automatic recovery in progress")));
ControlFile->checkPointCopy.ThisTimeLineID, if (recoveryTargetTLI > ControlFile->checkPointCopy.ThisTimeLineID)
recoveryTargetTLI))); ereport(LOG,
ControlFile->state = DB_IN_CRASH_RECOVERY; (errmsg("crash recovery starts in timeline %u "
} "and has target timeline %u",
ControlFile->checkPoint = CheckPointLoc; ControlFile->checkPointCopy.ThisTimeLineID,
ControlFile->checkPointCopy = checkPoint; recoveryTargetTLI)));
if (InArchiveRecovery) ControlFile->state = DB_IN_CRASH_RECOVERY;
{ }
/* initialize minRecoveryPoint if not set yet */ ControlFile->checkPoint = CheckPointLoc;
if (ControlFile->minRecoveryPoint < checkPoint.redo) ControlFile->checkPointCopy = checkPoint;
if (InArchiveRecovery)
{ {
ControlFile->minRecoveryPoint = checkPoint.redo; /* initialize minRecoveryPoint if not set yet */
ControlFile->minRecoveryPointTLI = checkPoint.ThisTimeLineID; if (ControlFile->minRecoveryPoint < checkPoint.redo)
{
ControlFile->minRecoveryPoint = checkPoint.redo;
ControlFile->minRecoveryPointTLI = checkPoint.ThisTimeLineID;
}
} }
}
/*
* Set backupStartPoint if we're starting recovery from a base backup.
*
* Also set backupEndPoint and use minRecoveryPoint as the backup end
* location if we're starting recovery from a base backup which was taken
* from a standby. In this case, the database system status in pg_control
* must indicate that the database was already in recovery. Usually that
* will be DB_IN_ARCHIVE_RECOVERY but also can be
* DB_SHUTDOWNED_IN_RECOVERY if recovery previously was interrupted before
* reaching this point; e.g. because restore_command or primary_conninfo
* were faulty.
*
* Any other state indicates that the backup somehow became corrupted and
* we can't sensibly continue with recovery.
*/
if (haveBackupLabel)
{
ControlFile->backupStartPoint = checkPoint.redo;
ControlFile->backupEndRequired = backupEndRequired;
if (backupFromStandby) /*
* Set backupStartPoint if we're starting recovery from a base backup.
*
* Also set backupEndPoint and use minRecoveryPoint as the backup end
* location if we're starting recovery from a base backup which was
* taken from a standby. In this case, the database system status in
* pg_control must indicate that the database was already in recovery.
* Usually that will be DB_IN_ARCHIVE_RECOVERY but also can be
* DB_SHUTDOWNED_IN_RECOVERY if recovery previously was interrupted
* before reaching this point; e.g. because restore_command or
* primary_conninfo were faulty.
*
* Any other state indicates that the backup somehow became corrupted
* and we can't sensibly continue with recovery.
*/
if (haveBackupLabel)
{ {
if (dbstate_at_startup != DB_IN_ARCHIVE_RECOVERY && ControlFile->backupStartPoint = checkPoint.redo;
dbstate_at_startup != DB_SHUTDOWNED_IN_RECOVERY) ControlFile->backupEndRequired = backupEndRequired;
ereport(FATAL,
(errmsg("backup_label contains data inconsistent with control file"), if (backupFromStandby)
errhint("This means that the backup is corrupted and you will " {
"have to use another backup for recovery."))); if (dbstate_at_startup != DB_IN_ARCHIVE_RECOVERY &&
ControlFile->backupEndPoint = ControlFile->minRecoveryPoint; dbstate_at_startup != DB_SHUTDOWNED_IN_RECOVERY)
ereport(FATAL,
(errmsg("backup_label contains data inconsistent with control file"),
errhint("This means that the backup is corrupted and you will "
"have to use another backup for recovery.")));
ControlFile->backupEndPoint = ControlFile->minRecoveryPoint;
}
} }
} }

Loading…
Cancel
Save