Don't go belly-up if fork() fails for a routine checkpoint subprocess.
authorTom Lane
Wed, 14 Mar 2001 17:58:46 +0000 (17:58 +0000)
committerTom Lane
Wed, 14 Mar 2001 17:58:46 +0000 (17:58 +0000)
Just try again later.

src/backend/postmaster/postmaster.c

index 6a0d1198652c83d1fcfa8f2b6bf0194e1d470cab..044bc207f92026441d7e0ad33cc686a2cea38ce9 100644 (file)
@@ -28,7 +28,7 @@
  *
  *
  * IDENTIFICATION
- *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.209 2001/03/13 01:17:05 tgl Exp $
+ *   $Header: /cvsroot/pgsql/src/backend/postmaster/postmaster.c,v 1.210 2001/03/14 17:58:46 tgl Exp $
  *
  * NOTES
  *
@@ -804,6 +804,11 @@ ServerLoop(void)
            {
                /* Time to make the checkpoint... */
                CheckPointPID = CheckPointDataBase();
+               /* if fork failed, schedule another try at 0.1 normal delay */
+               if (CheckPointPID == 0)
+               {
+                   checkpointed = now - (9 * CheckPointTimeout) / 10;
+               }
            }
        }
 
@@ -2124,6 +2129,7 @@ schedule_checkpoint(SIGNAL_ARGS)
        Shutdown == NoShutdown && !FatalError)
    {
        CheckPointPID = CheckPointDataBase();
+       /* note: if fork fails, CheckPointPID stays 0; nothing happens */
    }
 
    errno = save_errno;
@@ -2264,6 +2270,9 @@ InitSSL(void)
 
 /*
  * Fire off a subprocess for startup/shutdown/checkpoint.
+ *
+ * Return value is subprocess' PID, or 0 if failed to start subprocess
+ * (0 is returned only for checkpoint case).
  */
 static pid_t
 SSDataBase(int xlop)
@@ -2332,8 +2341,15 @@ SSDataBase(int xlop)
 
        fprintf(stderr, "%s Data Base: fork failed: %s\n",
                ((xlop == BS_XLOG_STARTUP) ? "Startup" : 
-                   ((xlop == BS_XLOG_CHECKPOINT) ? "CheckPoint" :
-                       "Shutdown")), strerror(errno));
+                ((xlop == BS_XLOG_CHECKPOINT) ? "CheckPoint" :
+                 "Shutdown")),
+               strerror(errno));
+       /*
+        * fork failure is fatal during startup/shutdown, but there's
+        * no need to choke if a routine checkpoint fails.
+        */
+       if (xlop == BS_XLOG_CHECKPOINT)
+           return 0;
        ExitPostmaster(1);
    }
 
@@ -2363,7 +2379,7 @@ SSDataBase(int xlop)
        TouchSocketLockFile();
    }
 
-   return (pid);
+   return pid;
 }