*** a/src/backend/access/transam/xlog.c --- b/src/backend/access/transam/xlog.c *************** *** 5663,5668 **** StartupXLOG(void) --- 5663,5672 ---- ereport(LOG, (errmsg("database system was shut down at %s", str_time(ControlFile->time)))); + else if (ControlFile->state == DB_SHUTDOWNED_IN_RECOVERY) + ereport(LOG, + (errmsg("database system was shut down in recovery at %s", + str_time(ControlFile->time)))); else if (ControlFile->state == DB_SHUTDOWNING) ereport(LOG, (errmsg("database system shutdown was interrupted; last known up at %s", *************** *** 7550,7555 **** CreateRestartPoint(int flags) --- 7554,7567 ---- lastCheckPoint.redo.xlogid, lastCheckPoint.redo.xrecoff))); UpdateMinRecoveryPoint(InvalidXLogRecPtr, true); + if (flags & CHECKPOINT_IS_SHUTDOWN) + { + LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); + ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; + ControlFile->time = (pg_time_t) time(NULL); + UpdateControlFile(); + LWLockRelease(ControlFileLock); + } LWLockRelease(CheckpointLock); return false; } *************** *** 7587,7592 **** CreateRestartPoint(int flags) --- 7599,7606 ---- ControlFile->checkPoint = lastCheckPointRecPtr; ControlFile->checkPointCopy = lastCheckPoint; ControlFile->time = (pg_time_t) time(NULL); + if (flags & CHECKPOINT_IS_SHUTDOWN) + ControlFile->state = DB_SHUTDOWNED_IN_RECOVERY; UpdateControlFile(); } LWLockRelease(ControlFileLock); *** a/src/bin/pg_controldata/pg_controldata.c --- b/src/bin/pg_controldata/pg_controldata.c *************** *** 57,62 **** dbState(DBState state) --- 57,64 ---- return _("starting up"); case DB_SHUTDOWNED: return _("shut down"); + case DB_SHUTDOWNED_IN_RECOVERY: + return _("shut down in recovery"); case DB_SHUTDOWNING: return _("shutting down"); case DB_IN_CRASH_RECOVERY: *** a/src/include/catalog/pg_control.h --- b/src/include/catalog/pg_control.h *************** *** 65,70 **** typedef enum DBState --- 65,71 ---- { DB_STARTUP = 0, DB_SHUTDOWNED, + DB_SHUTDOWNED_IN_RECOVERY, DB_SHUTDOWNING, DB_IN_CRASH_RECOVERY, DB_IN_ARCHIVE_RECOVERY,