From: Maximiliano Sandoval <m.sandoval@proxmox.com>
To: Wolfgang Bumiller <w.bumiller@proxmox.com>
Cc: pve-devel@lists.proxmox.com
Subject: Re: [pve-devel] [PATCH] systemd: disconnect signals
Date: Fri, 07 Mar 2025 09:14:23 +0100 [thread overview]
Message-ID: <s8omsdx45qx.fsf@proxmox.com> (raw)
In-Reply-To: <sreeukcmnl4lqj3ookyrfr2dm4new5gm3magemwrt2ah57qhiz@b2s35kdk6iod>
Wolfgang Bumiller <w.bumiller@proxmox.com> writes:
> On Mon, Mar 03, 2025 at 03:42:53PM +0100, Maximiliano Sandoval wrote:
>> Dbus has a limit of 512 connections by default and signals should be
>> disconnected as soon as they are not needed anymore.
>>
>> This should alleviate https://bugzilla.proxmox.com/show_bug.cgi?id=5876.
>>
>> Signed-off-by: Maximiliano Sandoval <m.sandoval@proxmox.com>
>> ---
>> src/PVE/Systemd.pm | 34 ++++++++++++++++++++++++++++------
>> 1 file changed, 28 insertions(+), 6 deletions(-)
>>
>> diff --git a/src/PVE/Systemd.pm b/src/PVE/Systemd.pm
>> index 07c912e3..1d7772d9 100644
>> --- a/src/PVE/Systemd.pm
>> +++ b/src/PVE/Systemd.pm
>> @@ -44,6 +44,7 @@ sub unescape_unit {
>> # main loop is being used as we need to wait signals.
>> sub systemd_call($;$) {
>> my ($code, $timeout) = @_;
>> + my $signal_info;
>>
>> my $bus = Net::DBus->system();
>> my $reactor = Net::DBus::Reactor->main();
>> @@ -64,13 +65,22 @@ sub systemd_call($;$) {
>> $timer = undef;
>> }
>>
>> + if (defined($signal_info)) {
>> + if (my $signal_name = $signal_info->{name}) {
>> + if (my $signal_handle = $signal_info->{handle}) {
>
> I think it's enough to require the info to either be valid or undef,
> therefore the first `if` should suffice.
>
>> + $if->disconnect_from_signal($signal_name, $signal_handle);
>> + }
>> + }
>> + $signal_info = undef;
>> + }
>> +
>> if (defined($reactor)) {
>> $reactor->shutdown();
>> $reactor = undef;
>> }
>> };
>>
>> - my $result = $code->($if, $reactor, $finish_callback);
>> + (my $result, $signal_info) = $code->($if, $reactor, $finish_callback);
>> # Are we done immediately?
>> return $result if defined $result;
>>
>> @@ -124,7 +134,8 @@ sub enter_systemd_scope {
>>
>> my $job;
>>
>> - $if->connect_to_signal('JobRemoved', sub {
>> + my $signal_name = 'JobRemoved';
>> + my $signal_handle = $if->connect_to_signal($signal_name, sub {
>> my ($id, $removed_job, $signaled_unit, $result) = @_;
>> return if $signaled_unit ne $unit || $removed_job ne $job;
>> if ($result ne 'done') {
>> @@ -139,7 +150,12 @@ sub enter_systemd_scope {
>>
>> $job = $if->StartTransientUnit($unit, 'fail', $properties, []);
>>
>> - return undef;
>> + my $signal_info = {
>> + name => $signal_name,
>> + handle => $signal_handle,
>> + };
>> +
>> + return (undef, $signal_info);
>> }, $timeout);
>> }
>>
>> @@ -152,18 +168,24 @@ sub wait_for_unit_removed($;$) {
>> my $unit_obj = eval { $if->GetUnit($unit) };
>> return 1 if !$unit_obj;
>>
>> - $if->connect_to_signal('UnitRemoved', sub {
>> + my $signal_name = 'UnitRemoved';
>> + my $signal_handle = $if->connect_to_signal($signal_name, sub {
>> my ($id, $removed_unit) = @_;
>> $finish_cb->(1) if $removed_unit eq $unit_obj;
>> });
>>
>> + my $signal_info = {
>> + name => $signal_name,
>> + handle => $signal_handle,
>> + };
>> +
>> # Deal with what we lost between GetUnit() and connecting to UnitRemoved:
>> my $unit_obj_new = eval { $if->GetUnit($unit) };
>> if (!$unit_obj_new) {
>> - return 1;
>> + return (1, $signal_info);
>> }
>>
>> - return undef;
>> + return (undef, $signal_info);
>> }, $timeout);
>> }
>>
>> --
>> 2.39.5
v2 sent.
_______________________________________________
pve-devel mailing list
pve-devel@lists.proxmox.com
https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel
prev parent reply other threads:[~2025-03-07 8:14 UTC|newest]
Thread overview: 3+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-03 14:42 Maximiliano Sandoval
2025-03-06 15:54 ` Wolfgang Bumiller
2025-03-07 8:14 ` Maximiliano Sandoval [this message]
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=s8omsdx45qx.fsf@proxmox.com \
--to=m.sandoval@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 an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.
Service provided by Proxmox Server Solutions GmbH | Privacy | Legal