From 207e0d7a7909b75b2cb9d7bf8f8e817698bf55c9 Mon Sep 17 00:00:00 2001 From: Donald Sharp Date: Wed, 9 Nov 2016 10:22:22 -0500 Subject: [PATCH] watchquagga: Signal when we are actually up and running When Quagga is starting up, it is returning immediately. This is leaving us in a state where systemd believes Quagga is up and running, while the sytem might actually not have restarted the code yet. Modify the code so that when watchquagga starts up it doesn't start communicating with systemd until such time that it detects that all daemons are running. Additionally modify watchquagga to touch a file in /var/run/quagga/ that the /usr/lib/quagga/quagga script looks for for 10 seconds. If it finds this Quagga started file then we know watchquagga has successfully communicated with all daemons. If after 10 seconds we haven't communicated with Quagga, continue on for the start and let the normal start failure code work. Signed-off-by: Donald Sharp --- tools/quagga | 14 ++++++++++++-- watchquagga/watchquagga.c | 24 +++++++++++++++++++++++- 2 files changed, 35 insertions(+), 3 deletions(-) diff --git a/tools/quagga b/tools/quagga index 83dfb63029..e8595d7877 100755 --- a/tools/quagga +++ b/tools/quagga @@ -33,7 +33,6 @@ else SSD=`which start-stop-daemon` fi -echo ${SSD} # Print the name of the pidfile. pidfile() { @@ -114,12 +113,23 @@ start() echo -n " $1" fi + if [ -e /var/run/quagga/watchquagga.started ] ; then + rm /var/run/quagga/watchquagga.started + fi ${SSD} \ --start \ --pidfile=`pidfile $1` \ --exec "$D_PATH/$1" \ -- \ "${watchquagga_options[@]}" + for i in `seq 1 10`; + do + if [ -e /var/run/quagga/watchquagga.started ] ; then + break + else + sleep 1 + fi + done elif [ -n "$2" ]; then echo -n " $1-$2" if ! check_daemon $1 $2 ; then @@ -502,8 +512,8 @@ case "$1" in if [ "$2" != "watchquagga" ]; then start_prio 10 $dmn fi - vtysh_b start_watchquagga + vtysh_b ;; 1|2|3|4|5|6|7|8|9|10) diff --git a/watchquagga/watchquagga.c b/watchquagga/watchquagga.c index e882653e38..cb9d50ff88 100644 --- a/watchquagga/watchquagga.c +++ b/watchquagga/watchquagga.c @@ -682,6 +682,28 @@ handle_read(struct thread *t_read) return 0; } +/* + * Wait till we notice that all daemons are ready before + * we send we are ready to systemd + */ +static void +daemon_send_ready (void) +{ + static int sent = 0; + if (!sent && gs.numdown == 0) + { +#if defined (HAVE_CUMULUS) + FILE *fp; + + fp = fopen("/var/run/quagga/watchquagga.started", "w"); + fclose(fp); +#endif + zlog_notice ("Watchquagga: Notifying Systemd we are up and running"); + systemd_send_started(master, 0); + sent = 1; + } +} + static void daemon_up(struct daemon *dmn, const char *why) { @@ -689,6 +711,7 @@ daemon_up(struct daemon *dmn, const char *why) gs.numdown--; dmn->connect_tries = 0; zlog_notice("%s state -> up : %s",dmn->name,why); + daemon_send_ready(); if (gs.do_ping) SET_WAKEUP_ECHO(dmn); phase_check(); @@ -1284,7 +1307,6 @@ main(int argc, char **argv) gs.restart.interval = gs.min_restart_interval; master = thread_master_create(); - systemd_send_started (master, 0); signal_init (master, array_size(my_signals), my_signals); srandom(time(NULL)); -- 2.39.5