Commit 1358466a authored by Tom Lane's avatar Tom Lane

Fix bootstrap.c so that database startup process and bgwriter properly release

LWLocks during a panic exit.  This avoids the possible self-deadlock pointed
out by Qingqing Zhou.  Also, I noted that an error during LoadFreeSpaceMap()
or BuildFlatFiles() would result in exit(0) which would leave the postmaster
thinking all is well.  Added a critical section to ensure such errors don't
allow startup to proceed.

Backpatched to 8.1.  The 8.0 code is a bit different and I'm not sure if the
problem exists there; given we've not seen this reported from the field, I'm
going to be conservative about backpatching any further.
parent e4725e35
...@@ -8,7 +8,7 @@ ...@@ -8,7 +8,7 @@
* Portions Copyright (c) 1994, Regents of the University of California * Portions Copyright (c) 1994, Regents of the University of California
* *
* IDENTIFICATION * IDENTIFICATION
* $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.215 2006/05/10 23:18:39 tgl Exp $ * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.216 2006/06/08 23:55:48 tgl Exp $
* *
*------------------------------------------------------------------------- *-------------------------------------------------------------------------
*/ */
...@@ -55,6 +55,7 @@ extern char *optarg; ...@@ -55,6 +55,7 @@ extern char *optarg;
static void usage(void); static void usage(void);
static void bootstrap_signals(void); static void bootstrap_signals(void);
static void ShutdownDummyProcess(int code, Datum arg);
static hashnode *AddStr(char *str, int strlength, int mderef); static hashnode *AddStr(char *str, int strlength, int mderef);
static Form_pg_attribute AllocateAttribute(void); static Form_pg_attribute AllocateAttribute(void);
static int CompHash(char *str, int len); static int CompHash(char *str, int len);
...@@ -395,6 +396,9 @@ BootstrapMain(int argc, char *argv[]) ...@@ -395,6 +396,9 @@ BootstrapMain(int argc, char *argv[])
/* finish setting up bufmgr.c */ /* finish setting up bufmgr.c */
InitBufferPoolBackend(); InitBufferPoolBackend();
/* register a shutdown callback for LWLock cleanup */
on_shmem_exit(ShutdownDummyProcess, 0);
} }
/* /*
...@@ -417,8 +421,14 @@ BootstrapMain(int argc, char *argv[]) ...@@ -417,8 +421,14 @@ BootstrapMain(int argc, char *argv[])
case BS_XLOG_STARTUP: case BS_XLOG_STARTUP:
bootstrap_signals(); bootstrap_signals();
StartupXLOG(); StartupXLOG();
/*
* These next two functions don't consider themselves critical,
* but we'd best PANIC anyway if they fail.
*/
START_CRIT_SECTION();
LoadFreeSpaceMap(); LoadFreeSpaceMap();
BuildFlatFiles(false); BuildFlatFiles(false);
END_CRIT_SECTION();
proc_exit(0); /* startup done */ proc_exit(0); /* startup done */
case BS_XLOG_BGWRITER: case BS_XLOG_BGWRITER:
...@@ -552,6 +562,19 @@ bootstrap_signals(void) ...@@ -552,6 +562,19 @@ bootstrap_signals(void)
} }
} }
/*
* Begin shutdown of a dummy process. This is approximately the equivalent
* of ShutdownPostgres() in postinit.c. We can't run transactions in a
* dummy process, so most of the work of AbortTransaction() is not needed,
* but we do need to make sure we've released any LWLocks we are holding.
* (This is only critical during an error exit.)
*/
static void
ShutdownDummyProcess(int code, Datum arg)
{
LWLockReleaseAll();
}
/* ---------------- /* ----------------
* error handling / abort routines * error handling / abort routines
* ---------------- * ----------------
......
Markdown is supported
0% or
You are about to add 0 people to the discussion. Proceed with caution.
Finish editing this message first!
Please register or to comment