]> git.proxmox.com Git - librados2-perl.git/commitdiff
use POSIX::_exit instead of exit in forked child
authorFiona Ebner <f.ebner@proxmox.com>
Tue, 8 Aug 2023 11:23:12 +0000 (13:23 +0200)
committerWolfgang Bumiller <w.bumiller@proxmox.com>
Fri, 11 Aug 2023 07:01:01 +0000 (09:01 +0200)
This avoids calling the END blocks and destructor routines most of
which have nothing to do with the fork, so it cannot be assumed to be
safe to do from the fork.

Move the call to pve_rados_shutdown from the destructor routine,
which will not be called by the child anymore. Make sure the cleanup
is also done when the worker dies.

Signed-off-by: Fiona Ebner <f.ebner@proxmox.com>
PVE/RADOS.pm

index 41b9c3967ccdbd79847b1af7f41fe84803d70226..f09d890ef188b8ec862d88baef9417a9d95abd84 100644 (file)
@@ -7,6 +7,7 @@ use warnings;
 
 use Carp;
 use JSON;
+use POSIX;
 use Socket;
 
 use PVE::Tools;
@@ -195,24 +196,30 @@ sub new {
     } else { # child
        $0 = 'pverados';
 
-       PVE::INotify::inotify_close();
+       eval {
+           PVE::INotify::inotify_close();
 
-       if (my $atfork = $rpcenv->{atfork}) {
-           &$atfork();
-       }
+           if (my $atfork = $rpcenv->{atfork}) {
+               &$atfork();
+           }
 
-       # override signal handlers inherited from the parent
-       local $SIG{HUP} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
-           exit(1);
-       };
+           # override signal handlers inherited from the parent
+           local $SIG{HUP} = $SIG{INT} = $SIG{QUIT} = $SIG{TERM} = sub {
+               pve_rados_shutdown($self->{conn}) if $self->{conn};
+               POSIX::_exit(1);
+           };
 
-       # fixme: timeout?
+           # fixme: timeout?
 
-       close $child;
+           close $child;
 
-       $self->pve_rados_work($parent, $timeout, %params);
+           $self->pve_rados_work($parent, $timeout, %params);
+       };
+       my $err = $@;
+       warn $err if $err;
 
-       exit(0);
+       pve_rados_shutdown($self->{conn}) if $self->{conn};
+       POSIX::_exit($err ? 1 : 0);
     }
 
     return $self;
@@ -233,9 +240,6 @@ sub DESTROY {
        #print "$$: DESTROY WAIT0\n";
        &$kill_worker($self);
        #print "$$: DESTROY WAIT\n";
-    } else {
-       #print "$$: DESTROY SHUTDOWN\n";
-       pve_rados_shutdown($self->{conn}) if $self->{conn};
     }
 }