Previously, container start/stop/shutdown/suspend would try to acquire the config lock in the API handler prior to forking a worker. If the lock was currently held elsewhere, this would block the API handler and thus the pvedaemon worker thread until the 10s timeout expired (or the lock could be acquired).
To avoid blocking the API handler, immediately fork off a worker process and try to acquire the config lock in that worker. Patch best viewed with `git show -w`. Suggested-by: Wolfgang Bumiller <w.bumil...@proxmox.com> Signed-off-by: Friedrich Weber <f.we...@proxmox.com> --- Notes: The diff is somewhat messy without `-w` -- couldn't come up with a better way. new in v2 src/PVE/API2/LXC/Status.pm | 91 ++++++++++++++++++-------------------- 1 file changed, 42 insertions(+), 49 deletions(-) diff --git a/src/PVE/API2/LXC/Status.pm b/src/PVE/API2/LXC/Status.pm index f7e3128..7741374 100644 --- a/src/PVE/API2/LXC/Status.pm +++ b/src/PVE/API2/LXC/Status.pm @@ -176,32 +176,31 @@ __PACKAGE__->register_method({ my $realcmd = sub { my $upid = shift; - syslog('info', "starting CT $vmid: $upid\n"); + PVE::LXC::Config->lock_config($vmid, sub { + syslog('info', "starting CT $vmid: $upid\n"); - my $conf = PVE::LXC::Config->load_config($vmid); - - die "you can't start a CT if it's a template\n" - if PVE::LXC::Config->is_template($conf); + my $conf = PVE::LXC::Config->load_config($vmid); - if (!$skiplock && !PVE::LXC::Config->has_lock($conf, 'mounted')) { - PVE::LXC::Config->check_lock($conf); - } + die "you can't start a CT if it's a template\n" + if PVE::LXC::Config->is_template($conf); - if ($conf->{unprivileged}) { - PVE::LXC::Config->foreach_volume($conf, sub { - my ($ms, $mountpoint) = @_; - die "Quotas are not supported by unprivileged containers.\n" if $mountpoint->{quota}; - }); - } + if (!$skiplock && !PVE::LXC::Config->has_lock($conf, 'mounted')) { + PVE::LXC::Config->check_lock($conf); + } - PVE::LXC::vm_start($vmid, $conf, $skiplock, $param->{debug}); - }; + if ($conf->{unprivileged}) { + PVE::LXC::Config->foreach_volume($conf, sub { + my ($ms, $mountpoint) = @_; + die "Quotas are not supported by unprivileged containers.\n" + if $mountpoint->{quota}; + }); + } - my $lockcmd = sub { - return $rpcenv->fork_worker('vzstart', $vmid, $authuser, $realcmd); + PVE::LXC::vm_start($vmid, $conf, $skiplock, $param->{debug}); + }); }; - return PVE::LXC::Config->lock_config($vmid, $lockcmd); + return $rpcenv->fork_worker('vzstart', $vmid, $authuser, $realcmd); } }}); @@ -258,21 +257,19 @@ __PACKAGE__->register_method({ my $realcmd = sub { my $upid = shift; - syslog('info', "stopping CT $vmid: $upid\n"); + PVE::LXC::Config->lock_config($vmid, sub { + syslog('info', "stopping CT $vmid: $upid\n"); - my $conf = PVE::LXC::Config->load_config($vmid); - if (!$skiplock && !PVE::LXC::Config->has_lock($conf, 'mounted')) { - PVE::LXC::Config->check_lock($conf); - } + my $conf = PVE::LXC::Config->load_config($vmid); + if (!$skiplock && !PVE::LXC::Config->has_lock($conf, 'mounted')) { + PVE::LXC::Config->check_lock($conf); + } - PVE::LXC::vm_stop($vmid, 1); + PVE::LXC::vm_stop($vmid, 1); + }); }; - my $lockcmd = sub { - return $rpcenv->fork_worker('vzstop', $vmid, $authuser, $realcmd); - }; - - return PVE::LXC::Config->lock_config($vmid, $lockcmd); + return $rpcenv->fork_worker('vzstop', $vmid, $authuser, $realcmd); } }}); @@ -339,19 +336,17 @@ __PACKAGE__->register_method({ my $realcmd = sub { my $upid = shift; - syslog('info', "shutdown CT $vmid: $upid\n"); - - my $conf = PVE::LXC::Config->load_config($vmid); - PVE::LXC::Config->check_lock($conf); + PVE::LXC::Config->lock_config($vmid, sub { + syslog('info', "shutdown CT $vmid: $upid\n"); - PVE::LXC::vm_stop($vmid, 0, $timeout, $param->{forceStop}); - }; + my $conf = PVE::LXC::Config->load_config($vmid); + PVE::LXC::Config->check_lock($conf); - my $lockcmd = sub { - return $rpcenv->fork_worker('vzshutdown', $vmid, $authuser, $realcmd); + PVE::LXC::vm_stop($vmid, 0, $timeout, $param->{forceStop}); + }); }; - return PVE::LXC::Config->lock_config($vmid, $lockcmd); + return $rpcenv->fork_worker('vzshutdown', $vmid, $authuser, $realcmd); }}); __PACKAGE__->register_method({ @@ -388,20 +383,18 @@ __PACKAGE__->register_method({ my $realcmd = sub { my $upid = shift; - syslog('info', "suspend CT $vmid: $upid\n"); - - my $conf = PVE::LXC::Config->load_config($vmid); - PVE::LXC::Config->check_lock($conf); + PVE::LXC::Config->lock_config($vmid, sub { + syslog('info', "suspend CT $vmid: $upid\n"); - my $cmd = ['lxc-checkpoint', '-n', $vmid, '-s', '-D', '/var/lib/vz/dump']; - run_command($cmd); - }; + my $conf = PVE::LXC::Config->load_config($vmid); + PVE::LXC::Config->check_lock($conf); - my $lockcmd = sub { - return $rpcenv->fork_worker('vzsuspend', $vmid, $authuser, $realcmd); + my $cmd = ['lxc-checkpoint', '-n', $vmid, '-s', '-D', '/var/lib/vz/dump']; + run_command($cmd); + }); }; - return PVE::LXC::Config->lock_config($vmid, $lockcmd); + return $rpcenv->fork_worker('vzsuspend', $vmid, $authuser, $realcmd); }}); __PACKAGE__->register_method({ -- 2.39.2 _______________________________________________ pve-devel mailing list pve-devel@lists.proxmox.com https://lists.proxmox.com/cgi-bin/mailman/listinfo/pve-devel