From a46a99e98c6b3c45f809d66035a91f66115012e1 Mon Sep 17 00:00:00 2001 From: William Lallemand Date: Thu, 7 Jul 2022 14:00:36 +0200 Subject: [PATCH] MEDIUM: mworker/systemd: send STATUS over sd_notify The sd_notify API is not able to change the "Active:" line in "systemcl status". However a message can still be displayed on a "Status: " line, even if the service is still green and "active (running)". When startup succeed the Status will be set to "Ready.", upon a reload it will be set to "Reloading Configuration." If the configuration succeed "Ready." again. However if the reload failed, it will be set to "Reload failed!". Keep in mind that the "Active:" line won't change upon a reload failure, and will still be green. --- src/haproxy.c | 23 +++++++++++++++-------- 1 file changed, 15 insertions(+), 8 deletions(-) diff --git a/src/haproxy.c b/src/haproxy.c index 85467a58f..513a967f2 100644 --- a/src/haproxy.c +++ b/src/haproxy.c @@ -682,10 +682,6 @@ static void mworker_reexec() struct mworker_proc *current_child = NULL; mworker_block_signals(); -#if defined(USE_SYSTEMD) - if (global.tune.options & GTUNE_USE_SYSTEMD) - sd_notify(0, "RELOADING=1"); -#endif setenv("HAPROXY_MWORKER_REEXEC", "1", 1); mworker_cleanup_proc(); @@ -802,16 +798,16 @@ void mworker_reload() child->reloads++; } +#if defined(USE_SYSTEMD) + if (global.tune.options & GTUNE_USE_SYSTEMD) + sd_notify(0, "RELOADING=1\nSTATUS=Reloading Configuration.\n"); +#endif mworker_reexec(); } static void mworker_loop() { -#if defined(USE_SYSTEMD) - if (global.tune.options & GTUNE_USE_SYSTEMD) - sd_notifyf(0, "READY=1\nMAINPID=%lu", (unsigned long)getpid()); -#endif /* Busy polling makes no sense in the master :-) */ global.tune.options &= ~GTUNE_BUSY_POLLING; @@ -877,6 +873,13 @@ void reexec_on_failure() usermsgs_clr(NULL); ha_warning("Loading failure!\n"); +#if defined(USE_SYSTEMD) + /* the sd_notify API is not able to send a reload failure signal. So + * the READY=1 signal still need to be sent */ + if (global.tune.options & GTUNE_USE_SYSTEMD) + sd_notify(0, "READY=1\nSTATUS=Reload failed!\n"); +#endif + mworker_reexec_waitmode(); } @@ -3440,6 +3443,10 @@ int main(int argc, char **argv) mworker_loop(); } else { +#if defined(USE_SYSTEMD) + if (global.tune.options & GTUNE_USE_SYSTEMD) + sd_notifyf(0, "READY=1\nMAINPID=%lu\nSTATUS=Ready.\n", (unsigned long)getpid()); +#endif /* if not in wait mode, reload in wait mode to free the memory */ ha_notice("Loading success.\n"); proc_self->failedreloads = 0; /* reset the number of failure */