X-Git-Url: https://pintos-os.org/cgi-bin/gitweb.cgi?a=blobdiff_plain;f=lib%2Fdaemon.c;h=59628f23335d85368b29527b495cc761253ae44b;hb=106eab5dfd26c4739d7781e7aee50a8cc27ff8bd;hp=081912b128c230c59550608059ea4cdc9a8b25a0;hpb=daf03c53ee14a0227b43330be2e638b9ad9ce022;p=openvswitch diff --git a/lib/daemon.c b/lib/daemon.c index 081912b1..59628f23 100644 --- a/lib/daemon.c +++ b/lib/daemon.c @@ -18,8 +18,10 @@ #include "daemon.h" #include #include +#include #include #include +#include #include #include #include "command-line.h" @@ -323,14 +325,15 @@ should_restart(int status) static void monitor_daemon(pid_t daemon_pid) { - /* XXX Should limit the rate at which we restart the daemon. */ /* XXX Should log daemon's stderr output at startup time. */ const char *saved_program_name; + time_t last_restart; char *status_msg; saved_program_name = program_name; program_name = xasprintf("monitor(%s)", program_name); status_msg = xstrdup("healthy"); + last_restart = TIME_MIN; for (;;) { int retval; int status; @@ -353,6 +356,33 @@ monitor_daemon(pid_t daemon_pid) free(s); if (should_restart(status)) { + if (WCOREDUMP(status)) { + /* Disable further core dumps to save disk space. */ + struct rlimit r; + + r.rlim_cur = 0; + r.rlim_max = 0; + if (setrlimit(RLIMIT_CORE, &r) == -1) { + VLOG_WARN("failed to disable core dumps: %s", + strerror(errno)); + } + } + + /* Throttle restarts to no more than once every 10 seconds. */ + if (time(NULL) < last_restart + 10) { + VLOG_WARN("%s, waiting until 10 seconds since last " + "restart", status_msg); + for (;;) { + time_t now = time(NULL); + time_t wakeup = last_restart + 10; + if (now >= wakeup) { + break; + } + sleep(wakeup - now); + } + } + last_restart = time(NULL); + VLOG_ERR("%s, restarting", status_msg); daemon_pid = fork_and_wait_for_startup(&daemonize_fd); if (!daemon_pid) {