From: Wolfgang Bumiller <w.bumiller@proxmox.com>
To: Maximiliano Sandoval <m.sandoval@proxmox.com>
Cc: pve-devel@lists.proxmox.com
Subject: [pve-devel] applied: [PATCH pve-common v2] systemd: disconnect signals
Date: Fri, 7 Mar 2025 09:28:42 +0100 [thread overview]
Message-ID: <7ufqj34mboo72vox467xdfgkmhgfeq4xczorxgkl56gnmpejtf@iuvjawkkv7dl> (raw)
In-Reply-To: <20250307081414.57671-1-m.sandoval@proxmox.com>
applied, with a minor cleanup
On Fri, Mar 07, 2025 at 09:14:14AM +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>
> ---
>
> Differences from v1:
> - remove two guards on finish_callback
>
> src/PVE/Systemd.pm | 30 ++++++++++++++++++++++++------
> 1 file changed, 24 insertions(+), 6 deletions(-)
>
> diff --git a/src/PVE/Systemd.pm b/src/PVE/Systemd.pm
> index 07c912e3..14038e0c 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;
^ moved this down to the rest of the vars shared with the callback
>
> my $bus = Net::DBus->system();
> my $reactor = Net::DBus::Reactor->main();
> @@ -64,13 +65,18 @@ sub systemd_call($;$) {
> $timer = undef;
> }
>
> + if (defined($signal_info)) {
> + $if->disconnect_from_signal($signal_info->{name}, $signal_info->{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 +130,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 +146,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 +164,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
_______________________________________________
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:28 UTC|newest]
Thread overview: 2+ messages / expand[flat|nested] mbox.gz Atom feed top
2025-03-07 8:14 [pve-devel] " Maximiliano Sandoval
2025-03-07 8:28 ` Wolfgang Bumiller [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=7ufqj34mboo72vox467xdfgkmhgfeq4xczorxgkl56gnmpejtf@iuvjawkkv7dl \
--to=w.bumiller@proxmox.com \
--cc=m.sandoval@proxmox.com \
--cc=pve-devel@lists.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.