RESTEnvironment: better SIGCHLD handling in AnyEvent event loop

when we're in an API server that uses AnyEvent, we must postpone
the worker_reaper, since it calls 'active_workers' which might already
be called and then we're inside the lock twice (flocks are per process
for us, see PVE::Tools::lock_file)

This resulted in an error like this:
close (rename) atomic file '/var/log/pve/tasks/active' failed: No such file or directory

We use the fact that only 'pub' and 'priv' RESTEnvironment types are an
api server with anyevent. For other types we call it like before.

Signed-off-by: Dominik Csapak <d.csapak@proxmox.com>
This commit is contained in:
Dominik Csapak 2023-02-20 11:08:28 +01:00 committed by Thomas Lamprecht
parent 1a758ec1dd
commit 6870afa455
2 changed files with 13 additions and 1 deletions

1
debian/control vendored
View File

@ -3,6 +3,7 @@ Section: perl
Priority: optional
Maintainer: Proxmox Support Team <support@proxmox.com>
Build-Depends: debhelper (>= 12~),
libanyevent-perl,
libclone-perl,
libdevel-cycle-perl,
libfilesys-df-perl,

View File

@ -14,6 +14,7 @@ use IO::File;
use IO::Handle;
use IO::Select;
use POSIX qw(:sys_wait_h EINTR);
use AnyEvent;
use PVE::Exception qw(raise raise_perm_exc);
use PVE::INotify;
@ -111,7 +112,17 @@ sub init {
die "unknown environment type"
if !$type || $type !~ m/^(cli|pub|priv|ha)$/;
$SIG{CHLD} = $worker_reaper;
my $has_anyevent = $type eq 'pub' || $type eq 'priv';
$SIG{CHLD} = sub {
# when we're in an api server, we have to postpone the call to worker_reaper, otherwise it
# might interfere with running api calls
if ($has_anyevent) {
AnyEvent::postpone { $worker_reaper->() };
} else {
$worker_reaper->();
}
};
# environment types
# cli ... command started fron command line