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

Dominic Jäger d.jaeger at proxmox.com
Tue Oct 15 11:23:11 CEST 2019


On Mon, Oct 14, 2019 at 02:02:26PM +0200, Thomas Lamprecht wrote:
> On 10/14/19 1:10 PM, Dominic Jäger wrote:
> > Between calling vm_destroy and removing the ID from user.cfg (remove_vm_access)
> > creating a new VM with this ID was possible. VMs could go missing from pools as
> > a consequence.
> > 
> > Adding a lock solves this for clones from the same node. Additionally,
> > unlinking must happen at the very end of the deletion process to avoid that
> > other nodes use the ID in the meanwhile.
> > 
> > Co-developed-by: Fabian Grünbichler <f.gruenbichler at proxmox.com>
> > Signed-off-by: Dominic Jäger <d.jaeger at proxmox.com>
> > ---
> > v1->v2: Move unlink to the end of the deletion process
> > 
> >  PVE/API2/Qemu.pm | 11 ++++++++---
> >  1 file changed, 8 insertions(+), 3 deletions(-)
> > 
> > diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
> > index 267a08e..f84aca7 100644
> > --- a/PVE/API2/Qemu.pm
> > +++ b/PVE/API2/Qemu.pm
> > @@ -1492,9 +1492,14 @@ __PACKAGE__->register_method({
> >  	    my $upid = shift;
> >  
> >  	    syslog('info', "destroy VM $vmid: $upid\n");
> > -	    PVE::QemuServer::vm_destroy($storecfg, $vmid, $skiplock);
> 
> so skiplock is now a dead parameter? I mean that /could/ be OK, but the
> commit never mentions anywhere why this is the case. No users, just kept
> for backward compat? If so I'd at least adapt the params description, so
> people reading man pages or CLI help output can have an idea that this
> does nothing.
> Or is it in use and still required to be handled? If so, address that.
> Either way, just "silently" removing it is not OK.
> 
Removing the parameter was an accident. I'll think about it and send a v3.

> > -	    PVE::AccessControl::remove_vm_access($vmid);
> > -            PVE::Firewall::remove_vmfw_conf($vmid);
> > +	    PVE::QemuConfig->lock_config($vmid, sub {
> > +		die "VM $vmid is running - destroy failed\n"
> > +		    if (PVE::QemuServer::check_running($vmid));
> > +		PVE::QemuServer::destroy_vm($storecfg, $vmid, 1, 0);
> > +		PVE::AccessControl::remove_vm_access($vmid);
> > +		PVE::Firewall::remove_vmfw_conf($vmid);
> > +		unlink PVE::QemuConfig->config_file($vmid);
> 
> unlink does not errors itself if the removal failed (e.g., pmxcfs went just
> inquorate, so please do a
> unlink ... or die "final removal of $vmid config failed: $!\n";
> 
> to tell an user in such a case.

Ok. Is there a reason why we don't do this in PVE::QemuServer::destroy_vm or
should we actually add the error handling there, too?
> 
> Looks OK, besides those two things.
> 
> > +	    });
> >  	};
> >  
> >  	return $rpcenv->fork_worker('qmdestroy', $vmid, $authuser, $realcmd);
> > 
> 
> 




More information about the pve-devel mailing list