From: William Lallemand Date: Thu, 7 Jul 2022 12:00:36 +0000 (+0200) Subject: MEDIUM: mworker/systemd: send STATUS over sd_notify X-Git-Tag: v2.7-dev2~83 X-Git-Url: http://git.ipfire.org/?a=commitdiff_plain;h=a46a99e98c6b3c45f809d66035a91f66115012e1;p=thirdparty%2Fhaproxy.git 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. --- diff --git a/src/haproxy.c b/src/haproxy.c index 85467a58fb..513a967f20 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 */