[pve-devel] [PATCH qemu-server] Fix #2412: Missing VMs in pools

Dominic Jäger d.jaeger at proxmox.com
Fri Oct 11 11:55:38 CEST 2019


Between destroying a VM (unlink config file) and removing it from user.cfg
creating a new VM with the ID that is still in use in user.cfg was possible.
VMs could go missing as a consequence.

Adding a lock solves this. This lock does not interfere with the one in
vm_destroy as they are held by the same process.

Signed-off-by: Dominic Jäger <d.jaeger at proxmox.com>
---
 PVE/API2/Qemu.pm | 8 +++++---
 1 file changed, 5 insertions(+), 3 deletions(-)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 267a08e..7dd83a9 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -1492,9 +1492,11 @@ __PACKAGE__->register_method({
 	    my $upid = shift;
 
 	    syslog('info', "destroy VM $vmid: $upid\n");
-	    PVE::QemuServer::vm_destroy($storecfg, $vmid, $skiplock);
-	    PVE::AccessControl::remove_vm_access($vmid);
-            PVE::Firewall::remove_vmfw_conf($vmid);
+	    PVE::QemuConfig->lock_config($vmid, sub {
+		PVE::QemuServer::vm_destroy($storecfg, $vmid, $skiplock);
+		PVE::AccessControl::remove_vm_access($vmid);
+		PVE::Firewall::remove_vmfw_conf($vmid);
+	    });
 	};
 
 	return $rpcenv->fork_worker('qmdestroy', $vmid, $authuser, $realcmd);
-- 
2.20.1




More information about the pve-devel mailing list