From d2ceac56b54d3e89c4eca71607d114b6d7e0093c Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Fabian=20Gr=C3=BCnbichler?= Date: Fri, 10 Sep 2021 09:48:20 +0200 Subject: [PATCH] api: template: invert lock and fork MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit like for other API calls, repeat the cheap checks done for early abort before forking and without locks after forking and obtaining the lock, and only hold the flock in the forked worker instead of across the fork. Signed-off-by: Fabian Grünbichler Reviewed-by: Fabian Ebner --- PVE/API2/Qemu.pm | 27 ++++++++++++++++----------- 1 file changed, 16 insertions(+), 11 deletions(-) diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm index 0a23525f..a8fbd9d3 100644 --- a/PVE/API2/Qemu.pm +++ b/PVE/API2/Qemu.pm @@ -4353,8 +4353,7 @@ __PACKAGE__->register_method({ my $disk = extract_param($param, 'disk'); - my $updatefn = sub { - + my $load_and_check = sub { my $conf = PVE::QemuConfig->load_config($vmid); PVE::QemuConfig->check_lock($conf); @@ -4368,17 +4367,23 @@ __PACKAGE__->register_method({ die "you can't convert a VM to template if VM is running\n" if PVE::QemuServer::check_running($vmid); - my $realcmd = sub { - PVE::QemuServer::template_create($vmid, $conf, $disk); - }; - - $conf->{template} = 1; - PVE::QemuConfig->write_config($vmid, $conf); - - return $rpcenv->fork_worker('qmtemplate', $vmid, $authuser, $realcmd); + return $conf; }; - return PVE::QemuConfig->lock_config($vmid, $updatefn); + $load_and_check->(); + + my $realcmd = sub { + PVE::QemuConfig->lock_config($vmid, sub { + my $conf = $load_and_check->(); + + $conf->{template} = 1; + PVE::QemuConfig->write_config($vmid, $conf); + + PVE::QemuServer::template_create($vmid, $conf, $disk); + }); + }; + + return $rpcenv->fork_worker('qmtemplate', $vmid, $authuser, $realcmd); }}); __PACKAGE__->register_method({