mirror of
https://git.proxmox.com/git/pve-common
synced 2025-04-28 17:07:50 +00:00
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:
parent
1a758ec1dd
commit
6870afa455
1
debian/control
vendored
1
debian/control
vendored
@ -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,
|
||||
|
@ -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
|
||||
|
Loading…
Reference in New Issue
Block a user