diff options
author | Tom Lane <tgl@sss.pgh.pa.us> | 2006-06-08 23:55:54 +0000 |
---|---|---|
committer | Tom Lane <tgl@sss.pgh.pa.us> | 2006-06-08 23:55:54 +0000 |
commit | 03c1be0663a0c0252fb2c1e095f528609f1245ea (patch) | |
tree | dc9324f36b27ef4d278fc7ba53b76b3722774545 | |
parent | 735529ce2429a033074537e5e48250fc5bc07a39 (diff) | |
download | postgresql-03c1be0663a0c0252fb2c1e095f528609f1245ea.tar.gz postgresql-03c1be0663a0c0252fb2c1e095f528609f1245ea.zip |
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.
-rw-r--r-- | src/backend/bootstrap/bootstrap.c | 25 |
1 files changed, 24 insertions, 1 deletions
diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index 40928c8b607..e48a4d3dc2e 100644 --- a/src/backend/bootstrap/bootstrap.c +++ b/src/backend/bootstrap/bootstrap.c @@ -8,7 +8,7 @@ * Portions Copyright (c) 1994, Regents of the University of California * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.208.2.1 2005/11/22 18:23:05 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.208.2.2 2006/06/08 23:55:54 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -57,6 +57,7 @@ extern int Int_yyparse(void); static void usage(void); static void bootstrap_signals(void); +static void ShutdownDummyProcess(int code, Datum arg); static hashnode *AddStr(char *str, int strlength, int mderef); static Form_pg_attribute AllocateAttribute(void); static int CompHash(char *str, int len); @@ -400,6 +401,9 @@ BootstrapMain(int argc, char *argv[]) /* finish setting up bufmgr.c */ InitBufferPoolBackend(); + + /* register a shutdown callback for LWLock cleanup */ + on_shmem_exit(ShutdownDummyProcess, 0); } /* @@ -422,8 +426,14 @@ BootstrapMain(int argc, char *argv[]) case BS_XLOG_STARTUP: bootstrap_signals(); StartupXLOG(); + /* + * These next two functions don't consider themselves critical, + * but we'd best PANIC anyway if they fail. + */ + START_CRIT_SECTION(); LoadFreeSpaceMap(); BuildFlatFiles(false); + END_CRIT_SECTION(); proc_exit(0); /* startup done */ case BS_XLOG_BGWRITER: @@ -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 * ---------------- |