[squid-users] squid.service with Type=Notify is not always reliable (Arch Linux)
Amish
anon.amish at gmail.com
Wed Sep 2 07:01:20 UTC 2020
On 01/09/20 8:31 pm, Alex Rousskov wrote:
> On 9/1/20 10:27 AM, Amish wrote:
>
>> Accepting ... connections at ... message came almost immediately (in 1
>> second).
>> Sep 01 06:40:05 foo squid[8446]: Accepting SSL bumped HTTP Socket
>> connections at local=[::]:3128 remote=[::] FD 27 flags=9
> OK, so you are not using SMP Squid and, assuming your Squid build
> supports calling sd_notify(), sd_notify() was called. We need to figure
> out why it had no effect. Suggested next steps:
>
> 1. Adjust Squid to print the value of $NOTIFY_SOCKET together with the
> "Accepting..." line. This will confirm that the variable is set. It
> should be set. This debugging can be added without fear of producing too
> much info but it is unlikely to be insightful.
>
> 2. Add some kind of sd_notify() debugging that would show us what the
> first sd_notify() call was doing and when/whether systemd received the
> notification from Squid. I have not researched how to do that, but I am
> sure it is possible. I bet there are not enough notifications happening
> on your production server to cause problems, but you should practice on
> a lab server first, of course.
Ok. I will try above. But here is a note from "man sd_notify" about race
condition that MAY occur.
Conversely, if an auxiliary process of the unit sends an sd_notify()
message and immediately exits, the service manager might not be able to
properly attribute the message to the unit, and thus will ignore it,
even if NotifyAccess=all is set for it.
Hence, to eliminate all race conditions involving lookup of the client's
unit and attribution of notifications to units correctly,
sd_notify_barrier() may be used. This call acts as a synchronization
point and ensures all notifications sent before this call have been
picked up by the service manager when it returns successfully. Use of
sd_notify_barrier() is needed for clients which are not invoked by the
service manager, otherwise this synchronization mechanism is unnecessary
for attribution of notifications to the unit.
Example 5. Eliminating race conditions
When the client sending the notifications is not spawned by the service
manager, it may exit too quickly and the service manager may fail to
attribute them correctly to the unit. To prevent such races, use
sd_notify_barrier() to synchronize against reception of all
notifications sent before this call is made.
sd_notify(0, "READY=1");
/* set timeout to 5 seconds */
sd_notify_barrier(0, 5 * 1000000);
I am not sure if this is related. I have no clue about sd_notify(). But
can it be the reason?
Amish
More information about the squid-users
mailing list