Hi, While the database is performing end-of-recovery checkpoint, the control file gets updated with db state as "shutting down" in CreateCheckPoint (see the code snippet at [1]) and at the end it sets it back to "shut down" for a brief moment and then finally to "in production". If the end-of-recovery checkpoint takes a lot of time or the db goes down during the end-of-recovery checkpoint for whatever reasons, the control file ends up having the wrong db state.
Should we add a new db state something like DB_IN_END_OF_RECOVERY_CHECKPOINT/"in end-of-recovery checkpoint" or something else to represent the correct state? Thoughts? [1] void CreateCheckPoint(int flags) { /* * An end-of-recovery checkpoint is really a shutdown checkpoint, just * issued at a different time. */ if (flags & (CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_END_OF_RECOVERY)) shutdown = true; else shutdown = false; if (shutdown) { LWLockAcquire(ControlFileLock, LW_EXCLUSIVE); ControlFile->state = DB_SHUTDOWNING; UpdateControlFile(); LWLockRelease(ControlFileLock); } if (shutdown) ControlFile->state = DB_SHUTDOWNED; Regards, Bharath Rupireddy.