If a shutdown request comes in while we're still starting up, don't
authorTom Lane
Sun, 23 Feb 2003 04:48:19 +0000 (04:48 +0000)
committerTom Lane
Sun, 23 Feb 2003 04:48:19 +0000 (04:48 +0000)
service it until after we execute SetThisStartUpID().  Else shutdown
process will write the wrong SUI into the shutdown checkpoint, which
seems likely to be trouble --- although I've not quite figured out
how significant it really is.

src/backend/postmaster/postmaster.c

index 85a11ce8a433100ed196fa8d0c02163db0a50d0a..3ce63e05d63a8b8b948d55c2f02e9a782b09a412 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.306 2003/01/25 05:19:46 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.307 2003/02/23 04:48:19 tgl Exp $
  *
  * NOTES
  *
@@ -1636,7 +1636,26 @@ reaper(SIGNAL_ARGS)
                ExitPostmaster(1);
            }
            StartupPID = 0;
+
+           /*
+            * Startup succeeded - remember its ID and RedoRecPtr.
+            *
+            * NB: this MUST happen before we fork a checkpoint or shutdown
+            * subprocess, else they will have wrong local ThisStartUpId.
+            */
+           SetThisStartUpID();
+
            FatalError = false; /* done with recovery */
+
+           /*
+            * Arrange for first checkpoint to occur after standard delay.
+            */
+           CheckPointPID = 0;
+           checkpointed = time(NULL);
+
+           /*
+            * Go to shutdown mode if a shutdown request was pending.
+            */
            if (Shutdown > NoShutdown)
            {
                if (ShutdownPID > 0)
@@ -1648,17 +1667,6 @@ reaper(SIGNAL_ARGS)
                ShutdownPID = ShutdownDataBase();
            }
 
-           /*
-            * Startup succeeded - remember its ID and RedoRecPtr
-            */
-           SetThisStartUpID();
-
-           /*
-            * Arrange for first checkpoint to occur after standard delay.
-            */
-           CheckPointPID = 0;
-           checkpointed = time(NULL);
-
            goto reaper_done;
        }