From c670410e7fe59dffb0227ed1dd0f532013993859 Mon Sep 17 00:00:00 2001 From: Tom Lane Date: Tue, 20 Apr 2010 01:38:52 +0000 Subject: [PATCH] Move the responsibility for calling StartupXLOG into InitPostgres, for those process types that go through InitPostgres; in particular, bootstrap and standalone-backend cases. This ensures that we have set up a PGPROC and done some other basic initialization steps (corresponding to the if (IsUnderPostmaster) block in AuxiliaryProcessMain) before we attempt to run WAL recovery in a standalone backend. As was discovered last September, this is necessary for some corner-case code paths during WAL recovery, particularly end-of-WAL cleanup. Moving the bootstrap case here too is not necessary for correctness, but it seems like a good idea since it reduces the number of distinct code paths. --- src/backend/bootstrap/bootstrap.c | 25 +++++------------------ src/backend/tcop/postgres.c | 20 +++++-------------- src/backend/utils/init/postinit.c | 33 ++++++++++++++++++++++--------- 3 files changed, 34 insertions(+), 44 deletions(-) diff --git a/src/backend/bootstrap/bootstrap.c b/src/backend/bootstrap/bootstrap.c index a9c5d1fd53..080d80e296 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.260 2010/02/26 02:00:35 momjian Exp $ + * $PostgreSQL: pgsql/src/backend/bootstrap/bootstrap.c,v 1.261 2010/04/20 01:38:52 tgl Exp $ * *------------------------------------------------------------------------- */ @@ -397,14 +397,13 @@ AuxiliaryProcessMain(int argc, char *argv[]) switch (auxType) { case CheckerProcess: - bootstrap_signals(); + /* don't set signals, they're useless here */ CheckerModeMain(); proc_exit(1); /* should never return */ case BootstrapProcess: bootstrap_signals(); BootStrapXLOG(); - StartupXLOG(); BootstrapModeMain(); proc_exit(1); /* should never return */ @@ -438,23 +437,12 @@ AuxiliaryProcessMain(int argc, char *argv[]) /* * In shared memory checker mode, all we really want to do is create shared * memory and semaphores (just to prove we can do it with the current GUC - * settings). + * settings). Since, in fact, that was already done by BaseInit(), + * we have nothing more to do here. */ static void CheckerModeMain(void) { - /* - * We must be getting invoked for bootstrap mode - */ - Assert(!IsUnderPostmaster); - - SetProcessingMode(BootstrapProcessing); - - /* - * Do backend-like initialization for bootstrap mode - */ - InitProcess(); - InitPostgres(NULL, InvalidOid, NULL, NULL); proc_exit(0); } @@ -478,6 +466,7 @@ BootstrapModeMain(void) * Do backend-like initialization for bootstrap mode */ InitProcess(); + InitPostgres(NULL, InvalidOid, NULL, NULL); /* Initialize stuff for bootstrap-file processing */ @@ -498,10 +487,6 @@ BootstrapModeMain(void) */ RelationMapFinishBootstrap(); - /* Perform a checkpoint to ensure everything's down to disk */ - SetProcessingMode(NormalProcessing); - CreateCheckPoint(CHECKPOINT_IS_SHUTDOWN | CHECKPOINT_IMMEDIATE); - /* Clean up and exit */ cleanup(); proc_exit(0); diff --git a/src/backend/tcop/postgres.c b/src/backend/tcop/postgres.c index 287445b535..b1d700a97e 100644 --- a/src/backend/tcop/postgres.c +++ b/src/backend/tcop/postgres.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.592 2010/03/21 00:17:58 petere Exp $ + * $PostgreSQL: pgsql/src/backend/tcop/postgres.c,v 1.593 2010/04/20 01:38:52 tgl Exp $ * * NOTES * this is the "main" module of the postgres backend and @@ -3531,11 +3531,7 @@ PostgresMain(int argc, char *argv[], const char *username) PG_SETMASK(&BlockSig); /* block everything except SIGQUIT */ - if (IsUnderPostmaster) - { - BaseInit(); - } - else + if (!IsUnderPostmaster) { /* * Validate we have been given a reasonable-looking DataDir (if under @@ -3551,17 +3547,11 @@ PostgresMain(int argc, char *argv[], const char *username) * Create lockfile for data directory. */ CreateDataDirLockFile(false); - - BaseInit(); - - /* - * Start up xlog for standalone backend, and register to have it - * closed down at exit. - */ - StartupXLOG(); - on_shmem_exit(ShutdownXLOG, 0); } + /* Early initialization */ + BaseInit(); + /* * Create a per-backend PGPROC struct in shared memory, except in the * EXEC_BACKEND case where this was done in SubPostmasterMain. We must do diff --git a/src/backend/utils/init/postinit.c b/src/backend/utils/init/postinit.c index afd4bc65b2..5be80b8f68 100644 --- a/src/backend/utils/init/postinit.c +++ b/src/backend/utils/init/postinit.c @@ -8,7 +8,7 @@ * * * IDENTIFICATION - * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.208 2010/03/25 20:40:17 sriggs Exp $ + * $PostgreSQL: pgsql/src/backend/utils/init/postinit.c,v 1.209 2010/04/20 01:38:52 tgl Exp $ * * *------------------------------------------------------------------------- @@ -427,11 +427,9 @@ pg_split_opts(char **argv, int *argcp, char *optstr) * Early initialization of a backend (either standalone or under postmaster). * This happens even before InitPostgres. * - * If you're wondering why this is separate from InitPostgres at all: - * the critical distinction is that this stuff has to happen before we can - * run XLOG-related initialization, which is done before InitPostgres --- in - * fact, for cases such as the background writer process, InitPostgres may - * never be done at all. + * This is separate from InitPostgres because it is also called by auxiliary + * processes, such as the background writer process, which may not call + * InitPostgres at all. */ void BaseInit(void) @@ -512,11 +510,28 @@ InitPostgres(const char *in_dbname, Oid dboid, const char *username, InitBufferPoolBackend(); /* - * Initialize local process's access to XLOG, if appropriate. In - * bootstrap case we skip this since StartupXLOG() was run instead. + * Initialize local process's access to XLOG. */ - if (!bootstrap) + if (IsUnderPostmaster) + { + /* + * The postmaster already started the XLOG machinery, but we need + * to call InitXLOGAccess(), if the system isn't in hot-standby mode. + * This is handled by calling RecoveryInProgress and ignoring the + * result. + */ (void) RecoveryInProgress(); + } + else + { + /* + * We are either a bootstrap process or a standalone backend. + * Either way, start up the XLOG machinery, and register to have it + * closed down at exit. + */ + StartupXLOG(); + on_shmem_exit(ShutdownXLOG, 0); + } /* * Initialize the relation cache and the system catalog caches. Note that