]> granicus.if.org Git - postgresql/commitdiff
Move the responsibility for calling StartupXLOG into InitPostgres, for
authorTom Lane <tgl@sss.pgh.pa.us>
Tue, 20 Apr 2010 01:38:52 +0000 (01:38 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Tue, 20 Apr 2010 01:38:52 +0000 (01:38 +0000)
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
src/backend/tcop/postgres.c
src/backend/utils/init/postinit.c

index a9c5d1fd53b631ec9fecaf48900918cf249a0f7c..080d80e296b7b8276f193c648e254e7c6d0dbb1d 100644 (file)
@@ -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);
index 287445b535e4f9411b108478b11673c398bc3c69..b1d700a97e40e9fed1e6c010848e98a6848f553b 100644 (file)
@@ -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
index afd4bc65b273b30264266fc38d040b785f1c7a45..5be80b8f6892202025b7d61371a30e84fe35cd99 100644 (file)
@@ -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