*
*
* 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
*
{
/* 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;
+ }
}
}
Shutdown == NoShutdown && !FatalError)
{
CheckPointPID = CheckPointDataBase();
+ /* note: if fork fails, CheckPointPID stays 0; nothing happens */
}
errno = save_errno;
/*
* 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)
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);
}
TouchSocketLockFile();
}
- return (pid);
+ return pid;
}