* Portions Copyright (c) 1996-2006, PostgreSQL Global Development Group
* Portions Copyright (c) 1994, Regents of the University of California
*
- * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.257 2006/11/21 20:59:52 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/access/transam/xlog.c,v 1.258 2006/11/30 18:29:11 tgl Exp $
*
*-------------------------------------------------------------------------
*/
uint32 freespace;
TransactionId oldestActiveXID;
- CritSectionCount++;
-
/*
* Read control file and check XLOG status looks valid.
*
ereport(LOG,
(errmsg("database system is ready")));
- CritSectionCount--;
/* Shut down readFile facility, free space */
if (readFile >= 0)
ereport(LOG,
(errmsg("shutting down")));
- CritSectionCount++;
CreateCheckPoint(true, true);
ShutdownCLOG();
ShutdownSUBTRANS();
ShutdownMultiXact();
- CritSectionCount--;
ereport(LOG,
(errmsg("database system is shut down")));
*
* This I/O could fail for various reasons. If so, we will fail to
* complete the checkpoint, but there is no reason to force a system
- * panic. Accordingly, exit critical section while doing it. (If we are
- * doing a shutdown checkpoint, we probably *should* panic --- but that
- * will happen anyway because we'll still be inside the critical section
- * established by ShutdownXLOG.)
+ * panic. Accordingly, exit critical section while doing it.
*/
END_CRIT_SECTION();
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/bgwriter.c,v 1.31 2006/11/21 20:59:52 tgl Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/bgwriter.c,v 1.32 2006/11/30 18:29:12 tgl Exp $
*
*-------------------------------------------------------------------------
*/
}
if (shutdown_requested)
{
+ /*
+ * From here on, elog(ERROR) should end with exit(1), not send
+ * control back to the sigsetjmp block above
+ */
+ ExitOnAnyError = true;
+ /* Close down the database */
ShutdownXLOG(0, 0);
DumpFreeSpaceMap(0, 0);
/* Normal exit from the bgwriter is here */
*
*
* IDENTIFICATION
- * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.504 2006/11/28 12:54:41 petere Exp $
+ * $PostgreSQL: pgsql/src/backend/postmaster/postmaster.c,v 1.505 2006/11/30 18:29:12 tgl Exp $
*
* NOTES
*
* Note: if we previously got SIGTERM then we may send SIGUSR2 to
* the bgwriter a second time here. This should be harmless.
*/
- if (StartupPID != 0 || FatalError)
- break; /* let reaper() handle this */
+ if (StartupPID != 0)
+ {
+ signal_child(StartupPID, SIGTERM);
+ break; /* let reaper() do the rest */
+ }
+ if (FatalError)
+ break; /* let reaper() handle this case */
/* Start the bgwriter if not running */
if (BgWriterPID == 0)
BgWriterPID = StartBackgroundWriter();
*/
HandleChildCrash(pid, exitstatus,
_("background writer process"));
+
+ /*
+ * If the bgwriter crashed while trying to write the shutdown
+ * checkpoint, we may as well just stop here; any recovery
+ * required will happen on next postmaster start.
+ */
+ if (Shutdown > NoShutdown &&
+ !DLGetHead(BackendList) && AutoVacPID == 0)
+ {
+ ereport(LOG,
+ (errmsg("abnormal database system shutdown")));
+ ExitPostmaster(1);
+ }
+
+ /* Else, proceed as in normal crash recovery */
continue;
}