public inbox for pve-devel@lists.proxmox.com
 help / color / mirror / Atom feed
From: Fiona Ebner <f.ebner@proxmox.com>
To: Wolfgang Bumiller <w.bumiller@proxmox.com>
Cc: pve-devel@lists.proxmox.com
Subject: Re: [pve-devel] [PATCH common v3 1/2] systemd: add sd_notify() helper
Date: Wed, 29 Oct 2025 10:16:55 +0100	[thread overview]
Message-ID: <45e140a2-8944-4018-82a1-626da3cf77d7@proxmox.com> (raw)
In-Reply-To: <clmaws4vmhld4o2mvsp2a7kqbqeytupcgdbg3ejul7mg774vga@5nm4lyhxprdm>

Am 28.10.25 um 3:58 PM schrieb Wolfgang Bumiller:
> On Tue, Oct 07, 2025 at 02:25:00PM +0200, Fiona Ebner wrote:
>> @@ -282,4 +285,32 @@ sub write_ini {
>>      file_set_contents($filename, $content);
>>  }
>>  
>> +# This is a pure Perl reimplementation of systemd's sd_notify() as defined in systemd/sd-daemon.h
>> +sub sd_notify {
>> +    my ($unset_environment, $state) = @_;
>> +
>> +    my $socket_path = $ENV{NOTIFY_SOCKET};
> 
> Technically this could be an abstract socket. Should be enough to just
> 
>     $socket_path =~ s/^@/\0/;

Will do in v4!

> 
>> +
>> +    my $socket = IO::Socket::UNIX->new(
>> +        Type => SOCK_DGRAM(),
>> +        Peer => $socket_path,
>> +    ) or die "unable to connect to socket $socket_path to notify systemd - $IO::Socket::errstr\n";
>> +
>> +    # we won't be reading from the socket
>> +    $socket->shutdown(SHUT_RD);
>> +
>> +    my $sent = 0;
>> +    my $total = length($state);
>> +    while ($sent < $total) {
>> +        my $res = $socket->send($state);
>> +        die "sending to $socket_path failed - $!" if !$res && $! != EINTR;
>> +        $sent += $res if $res;
> 
> ^ This is a datagram socket. Systemd expects a single datagram.
> The code sort of makes it look like you're trying doing a `write_all()`
> style send (without actually changing what it sent in between calls
> which wouldn't return zero).
> Trying to continue sending in a fragmented way won't work anyway.
> (Otherwise it would be rather cumbersome, since the protocol also allows
> adding things like file descriptors to store in the fd registry; data
> and metadata need to come in one nice bundle)
> 
> The example code in the referenced man page errors out with `-EPROTO` if
> the length does not match, so we could do that as well.
> 
> So basically, only an EINTR loop makes sense here.

Yes, I messed that up. Thank you for the explanation and suggestions!

> 
>> +    }
>> +    $socket->flush();
> 
> This should not be necessary, this is not buffered I/O.

Ack!

>> +
>> +    close($socket);
>> +
>> +    delete($ENV{NOTIFY_SOCKET}) if $unset_environment;
> 
> Why is this part of this function, though?

Because I wanted to match the signature of the original sd_notify(), but
actually it already doesn't match because of the return value. I guess
I'll drop it for now since the examples in 'man 3 sd_notify' also don't
have it. If a future caller needs it, it could also unset the variable
itself.


_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel


  reply	other threads:[~2025-10-29  9:16 UTC|newest]

Thread overview: 7+ messages / expand[flat|nested]  mbox.gz  Atom feed  top
2025-10-07 12:24 [pve-devel] [PATCH-SERIES common/qemu-server v3 0/2] migration: conntrack: fix race adding dbus-vmstate object to QEMU Fiona Ebner
2025-10-07 12:25 ` [pve-devel] [PATCH common v3 1/2] systemd: add sd_notify() helper Fiona Ebner
2025-10-28 14:58   ` Wolfgang Bumiller
2025-10-29  9:16     ` Fiona Ebner [this message]
2025-10-07 12:25 ` [pve-devel] [PATCH qemu-server v3 2/2] migration: conntrack: avoid crash when dbus-vmstate object cannot be added (quickly enough) Fiona Ebner
2025-10-15  8:15 ` [pve-devel] [PATCH-SERIES common/qemu-server v3 0/2] migration: conntrack: fix race adding dbus-vmstate object to QEMU Fiona Ebner
2025-10-28 13:41   ` Fiona Ebner

Reply instructions:

You may reply publicly to this message via plain-text email
using any one of the following methods:

* Save the following mbox file, import it into your mail client,
  and reply-to-all from there: mbox

  Avoid top-posting and favor interleaved quoting:
  https://en.wikipedia.org/wiki/Posting_style#Interleaved_style

* Reply using the --to, --cc, and --in-reply-to
  switches of git-send-email(1):

  git send-email \
    --in-reply-to=45e140a2-8944-4018-82a1-626da3cf77d7@proxmox.com \
    --to=f.ebner@proxmox.com \
    --cc=pve-devel@lists.proxmox.com \
    --cc=w.bumiller@proxmox.com \
    /path/to/YOUR_REPLY

  https://kernel.org/pub/software/scm/git/docs/git-send-email.html

* If your mail client supports setting the In-Reply-To header
  via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line before the message body.
This is a public inbox, see mirroring instructions
for how to clone and mirror all data and code used for this inbox
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal