]> granicus.if.org Git - postgresql/commitdiff
Under new theory of operation wherein postmaster forks children
authorTom Lane <tgl@sss.pgh.pa.us>
Sun, 1 Jul 2001 00:06:23 +0000 (00:06 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
Sun, 1 Jul 2001 00:06:23 +0000 (00:06 +0000)
immediately, we will fork a child even if the database state does not
permit connections to be accepted (eg, we are in recovery mode).
The child process will correctly reject the connection and exit as
soon as it's finished collecting the connection request message.
However, this means that reaper() must be prepared to see child
process exit signals even while it's waiting for startup or shutdown
process to finish.  As was, a connection request arriving during a
database recovery or shutdown would cause postmaster abort.

src/backend/postmaster/postmaster.c

index 1f02bf73a39a0cf26e1fe3258e0cd2d5e53933c1..0d92324623cda57c879baada9fb2b95f357ad8b4 100644 (file)
@@ -37,7 +37,7 @@
  *
  *
  * IDENTIFICATION
- *       $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.229 2001/06/29 16:05:57 tgl Exp $
+ *       $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.230 2001/07/01 00:06:23 tgl Exp $
  *
  * NOTES
  *
@@ -1357,7 +1357,11 @@ pmdie(SIGNAL_ARGS)
                                return;
                        }
                        if (ShutdownPID > 0)
+                       {
+                               postmaster_error("Shutdown process %d already running",
+                                                                ShutdownPID);
                                abort();
+                       }
 
                        ShutdownPID = ShutdownDataBase();
                        errno = save_errno;
@@ -1409,7 +1413,11 @@ pmdie(SIGNAL_ARGS)
                                return;
                        }
                        if (ShutdownPID > 0)
+                       {
+                               postmaster_error("Shutdown process %d already running",
+                                                                ShutdownPID);
                                abort();
+                       }
 
                        ShutdownPID = ShutdownDataBase();
                        errno = save_errno;
@@ -1481,27 +1489,21 @@ reaper(SIGNAL_ARGS)
                        continue;
                }
 
-               if (ShutdownPID > 0)
+               if (ShutdownPID > 0 && pid == ShutdownPID)
                {
-                       if (pid != ShutdownPID)
-                               abort();
                        if (exitstatus != 0)
                        {
                                postmaster_error("Shutdown proc %d exited with status %d", pid, exitstatus);
-                               fflush(stderr);
                                ExitPostmaster(1);
                        }
                        ExitPostmaster(0);
                }
-               if (StartupPID > 0)
+               if (StartupPID > 0 && pid == StartupPID)
                {
-                       if (pid != StartupPID)
-                               abort();
                        if (exitstatus != 0)
                        {
                                postmaster_error("Startup proc %d exited with status %d - abort",
                                                                 pid, exitstatus);
-                               fflush(stderr);
                                ExitPostmaster(1);
                        }
                        StartupPID = 0;
@@ -1509,7 +1511,11 @@ reaper(SIGNAL_ARGS)
                        if (Shutdown > NoShutdown)
                        {
                                if (ShutdownPID > 0)
+                               {
+                                       postmaster_error("Shutdown process %d already running",
+                                                                        ShutdownPID);
                                        abort();
+                               }
                                ShutdownPID = ShutdownDataBase();
                        }
 
@@ -1533,7 +1539,6 @@ reaper(SIGNAL_ARGS)
 
        if (FatalError)
        {
-
                /*
                 * Wait for all children exit, then reset shmem and
                 * StartupDataBase.