]> granicus.if.org Git - postgresql/commitdiff
Don't go belly-up if fork() fails for a routine checkpoint subprocess.
authorTom Lane <tgl@sss.pgh.pa.us>
Wed, 14 Mar 2001 17:58:46 +0000 (17:58 +0000)
committerTom Lane <tgl@sss.pgh.pa.us>
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;
 }