On Thu, Apr 04, 2024 at 04:00:16PM +0200, Tim Düsterhus wrote:
> Hi
>
> On 4/4/24 14:35, William Lallemand wrote:
> > I'm not against merging this, but I don't see any change comparing to the
> > current model?
> >
>
> I mainly stumbled upon this new mode in the documentation while looking into
> replacing libsystemd, where you beat me to it :-)
>
> My understanding is that it improves the situation insofar that systemd
> knows that the reload (attempt) is not yet finished even if the kill command
> exits.
>
> Currently it's the following:
>
> - systemd executes the kill.
> - kill exists.
> - systemd believes the reload finished.
> - HAProxy sees the signal, sends RELOADING=1.
> - systemd believes a second reload started.
> - HAProxy finishes reloading, sends READY=1.
> - systemd believes the second reload finished.
> With the new mode it's:
>
> - systemd sends the signal.
> - systemd waits for RELOADING=1.
> - HAProxy sees the signal, sends RELOADING=1.
> - HAProxy finishes reloading, sends READY=1.
> - systemd believes the reload finished.
>
> The new mode is only available with very recent systemd versions, but we can
> future-proof the implementation by already including the MONOTONIC_USEC
> field in the message. Unknown fields are explicitly ignored by systemd, thus
> this patch makes the situation no worse.
I thought systemd was already waiting the READY=1 message in fact, I
made a few tests which confirms your explanation, thanks, merged!
What I find stupid is that it's not possible to have the red
"systemd[1]: Reload failed for haproxy.service" message when using all
these reload method...
For example if you replace `kill`by `false` in the unit file, you will
have:
wla@kikyo:~% systemctl status haproxy
● haproxy.service - HAProxy Load Balancer
Loaded: loaded (/etc/systemd/system/haproxy.service; enabled;
preset: enabled)
Active: active (running) since Thu 2024-04-04 15:04:20 CEST; 1h
4min ago
Docs: man:haproxy(1)
file:/usr/share/doc/haproxy/configuration.txt.gz
Process: 58596 ExecReload=/usr/bin/false (code=exited,
status=1/FAILURE)
Main PID: 57180 (haproxy)
Status: "Ready."
Tasks: 9 (limit: 18702)
Memory: 74.6M
CPU: 1.624s
CGroup: /system.slice/haproxy.service
├─57180 /usr/sbin/haproxy -Ws -f /etc/haproxy/haproxy.cfg
-p /run/haproxy.pid -S /run/haproxy-master.sock
└─57601 /usr/sbin/haproxy -sf 57557 -x sockpair@5 -Ws -f
/etc/haproxy/haproxy.cfg -p /run/haproxy.pid -S /run/haproxy-master.sock
Apr 04 15:14:12 kikyo systemd[1]: Reload failed for haproxy.service -
HAProxy Load Balancer.
Apr 04 15:14:33 kikyo systemd[1]: Reloading haproxy.service - HAProxy
Load Balancer...
Apr 04 15:14:33 kikyo systemd[1]: haproxy.service: Control process
exited, code=exited, status=1/FAILURE
Apr 04 15:14:33 kikyo systemd[1]: Reload failed for haproxy.service -
HAProxy Load Balancer.
Apr 04 15:14:48 kikyo systemd[1]: Reloading haproxy.service - HAProxy
Load Balancer...
Apr 04 15:14:48 kikyo systemd[1]: haproxy.service: Control process
exited, code=exited, status=1/FAILURE
Apr 04 15:14:48 kikyo systemd[1]: Reload failed for haproxy.service -
HAProxy Load Balancer.
Apr 04 15:17:20 kikyo systemd[1]: Reloading haproxy.service - HAProxy
Load Balancer...
Apr 04 15:17:20 kikyo systemd[1]: haproxy.service: Control process
exited, code=exited, status=1/FAILURE
Apr 04 15:17:20 kikyo systemd[1]: Reload failed for haproxy.service -
HAProxy Load Balancer.
With messages hilighted in red, and a clear failure of the reload on the
"Process" line.
I can't find a way of achieving the same thing with sd_notify() :(
--
William Lallemand