mirror of
https://github.com/postgres/postgres.git
synced 2025-04-29 13:56:47 +03:00
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.
This commit is contained in:
parent
e4725e35be
commit
1358466a8c
@ -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;
|
|||||||
|
|
||||||
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[])
|
|||||||
|
|
||||||
/* 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[])
|
|||||||
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)
|
|||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
|
||||||
|
/*
|
||||||
|
* 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
|
||||||
* ----------------
|
* ----------------
|
||||||
|
Loading…
x
Reference in New Issue
Block a user