all lists on lists.proxmox.com
 help / color / mirror / Atom feed
* [pve-devel] [PATCH pve-common v2] systemd: disconnect signals
@ 2025-03-07  8:14 Maximiliano Sandoval
  2025-03-07  8:28 ` [pve-devel] applied: " Wolfgang Bumiller
  0 siblings, 1 reply; 2+ messages in thread
From: Maximiliano Sandoval @ 2025-03-07  8:14 UTC (permalink / raw)
  To: pve-devel

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;
 
     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


^ permalink raw reply	[flat|nested] 2+ messages in thread

* [pve-devel] applied: [PATCH pve-common v2] systemd: disconnect signals
  2025-03-07  8:14 [pve-devel] [PATCH pve-common v2] systemd: disconnect signals Maximiliano Sandoval
@ 2025-03-07  8:28 ` Wolfgang Bumiller
  0 siblings, 0 replies; 2+ messages in thread
From: Wolfgang Bumiller @ 2025-03-07  8:28 UTC (permalink / raw)
  To: Maximiliano Sandoval; +Cc: pve-devel

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


^ permalink raw reply	[flat|nested] 2+ messages in thread

end of thread, other threads:[~2025-03-07  8:28 UTC | newest]

Thread overview: 2+ messages (download: mbox.gz / follow: Atom feed)
-- links below jump to the message on this page --
2025-03-07  8:14 [pve-devel] [PATCH pve-common v2] systemd: disconnect signals Maximiliano Sandoval
2025-03-07  8:28 ` [pve-devel] applied: " Wolfgang Bumiller

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