X-Git-Url: https://git.proxmox.com/?a=blobdiff_plain;f=src%2FPVE%2FDaemon.pm;h=ee3c67c4d4895fb6bcbae008946f7228263a619f;hb=563661dd943e969e6df2b97e84043829032794fd;hp=1243fc7512bddabeed908a6f5a24945c72376471;hpb=a526ab1cfc6adda11dd4830501b1eb8a14b2bf6d;p=pve-common.git diff --git a/src/PVE/Daemon.pm b/src/PVE/Daemon.pm index 1243fc7..ee3c67c 100644 --- a/src/PVE/Daemon.pm +++ b/src/PVE/Daemon.pm @@ -34,6 +34,7 @@ use base qw(PVE::CLIHandler); $ENV{'PATH'} = '/sbin:/bin:/usr/sbin:/usr/bin'; my $daemon_initialized = 0; # we only allow one instance +my $daemon_sockets = []; my $close_daemon_lock = sub { my ($self) = @_; @@ -145,11 +146,7 @@ my $start_workers = sub { return if $self->{terminate}; - my $count = 0; - foreach my $cpid (keys %{$self->{workers}}) { - $count++; - } - + my $count = scalar keys %{$self->{workers}}; my $need = $self->{max_workers} - $count; return if $need <= 0; @@ -183,34 +180,28 @@ my $start_workers = sub { } }; +my $terminate_old_workers = sub { + my ($self) = @_; + + # if list is empty kill sends no signal, so no checks needed + kill 15, keys %{$self->{old_workers}}; +}; + my $terminate_server = sub { my ($self, $allow_open_children) = @_; $self->{terminate} = 1; # set flag to avoid worker restart - if (!$self->{max_workers}) { - eval { $self->shutdown(); }; - warn $@ if $@; - return; - } - eval { $self->shutdown(); }; warn $@ if $@; - # we have workers - send TERM signal - - foreach my $cpid (keys %{$self->{workers}}) { - kill(15, $cpid); # TERM childs - } + return if !$self->{max_workers}; # if we have no workers we're done here # if configured, leave children running on HUP - return if $allow_open_children && - $self->{leave_children_open_on_reload}; + return if $allow_open_children && $self->{leave_children_open_on_reload}; - # else, send TERM to old workers - foreach my $cpid (keys %{$self->{old_workers}}) { - kill(15, $cpid); # TERM childs - } + # else send TERM to all (old and current) child workers + kill 15, keys %{$self->@{'workers','old_workers'}}; # nicely shutdown childs (give them max 10 seconds to shut down) my $previous_alarm = alarm(10); @@ -289,11 +280,7 @@ sub setup { if ($restart && $self->{max_workers}) { if (my $wpids = $ENV{PVE_DAEMON_WORKER_PIDS}) { - foreach my $pid (split(':', $wpids)) { - if ($pid =~ m/^(\d+)$/) { - $self->{old_workers}->{$1} = 1; - } - } + $self->{old_workers}->{$_} = 1 foreach (split(':', $wpids)); } } @@ -394,13 +381,11 @@ my $server_run = sub { &$old_sig_chld(@_) if $old_sig_chld; }; - # catch worker finished during restart phase - &$finish_workers($self); - # now loop forever (until we receive terminate signal) for (;;) { &$start_workers($self); sleep(5); + &$terminate_old_workers($self); &$finish_workers($self); last if $self->{terminate}; } @@ -500,9 +485,12 @@ sub restart_daemon { $ENV{RESTART_PVE_DAEMON} = 1; + foreach my $ds (@$daemon_sockets) { + $ds->fcntl(Fcntl::F_SETFD(), 0); + } + if ($self->{max_workers}) { - my @workers = keys %{$self->{workers}}; - push @workers, keys %{$self->{old_workers}}; + my @workers = (keys %{$self->{workers}}, keys %{$self->{old_workers}}); $ENV{PVE_DAEMON_WORKER_PIDS} = join(':', @workers); } @@ -664,7 +652,7 @@ sub register_start_command { code => sub { my ($param) = @_; - if (&$init_ppid()) { + if (&$init_ppid() || $param->{debug}) { $self->start($param->{debug}); } else { PVE::Tools::run_command(['systemctl', 'start', $self->{name}]); @@ -823,6 +811,7 @@ sub create_reusable_socket { $socket->fdopen($sockfd, 'w') || die "cannot fdopen file descriptor '$sockfd' - $!\n"; + $socket->fcntl(Fcntl::F_SETFD(), Fcntl::FD_CLOEXEC); } else { $socket = IO::Socket::IP->new( @@ -842,9 +831,8 @@ sub create_reusable_socket { $ENV{"PVE_DAEMON_SOCKET_$port"} = $socket->fileno; } - # remove FD_CLOEXEC bit to reuse on exec - $socket->fcntl(Fcntl::F_SETFD(), 0); - + push @$daemon_sockets, $socket; + return $socket; }