Add support for systemd watchdog protocol

It work by notifying systemd on a regular basis. If
there is no notification, the daemon is restarted.
This requires a version newer than the 209 version
of systemd, as it is not supported before.
This commit is contained in:
Michael Scherer
2014-12-23 11:22:42 -05:00
committed by Nick Mathewson
parent aabaed6f49
commit 29ac883606
2 changed files with 49 additions and 0 deletions
+29
View File
@@ -1763,6 +1763,17 @@ second_elapsed_callback(periodic_timer_t *timer, void *arg)
current_second = now; /* remember which second it is, for next time */
}
#ifdef HAVE_SYSTEMD_209
static periodic_timer_t *systemd_watchdog_timer = NULL;
/** Libevent callback: invoked to reset systemd watchdog. */
static void
systemd_watchdog_callback(periodic_timer_t *timer, void *arg)
{
sd_notify(1, "WATCHDOG=1");
}
#endif
#ifndef USE_BUFFEREVENTS
/** Timer: used to invoke refill_callback(). */
static periodic_timer_t *refill_timer = NULL;
@@ -2031,6 +2042,24 @@ do_main_loop(void)
tor_assert(second_timer);
}
#ifdef HAVE_SYSTEMD_209
uint64_t watchdog_delay;
/* set up systemd watchdog notification. */
if (sd_watchdog_enabled(1, &watchdog_delay)) {
if (! systemd_watchdog_timer) {
struct timeval watchdog;
watchdog.tv_sec = 0;
watchdog.tv_usec = watchdog_delay/2;
systemd_watchdog_timer = periodic_timer_new(tor_libevent_get_base(),
&watchdog,
systemd_watchdog_callback,
NULL);
tor_assert(systemd_watchdog_timer);
}
}
#endif
#ifndef USE_BUFFEREVENTS
if (!refill_timer) {
struct timeval refill_interval;