On 3/13/19 9:55 AM, Dominik Csapak wrote: > if a vm has the 'suspend' lock, we resume with the saved state > and remove the lock, the saved vmstate and the saved runningmachine > after the vm started
how this all plays out if I start a VM someone is currently in the process of suspending? flock isn't taken here, or? so maybe really do an two step lock approach (suspending, suspended) should make things clearer and also easier to understand for users if errors occur. > > Signed-off-by: Dominik Csapak <d.csa...@proxmox.com> > --- > changes from v1: > * pull out has_lock > * better comment > * better variable naming > * more consise deletion of hash properties > PVE/QemuServer.pm | 23 ++++++++++++++++++++++- > 1 file changed, 22 insertions(+), 1 deletion(-) > > diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm > index 3a54671..7dfd52b 100644 > --- a/PVE/QemuServer.pm > +++ b/PVE/QemuServer.pm > @@ -4002,6 +4002,12 @@ sub config_to_command { > push @$cmd, '-global', join(',', @$globalFlags) > if scalar(@$globalFlags); > > + if (my $vmstate = $conf->{vmstate}) { > + my $statepath = PVE::Storage::path($storecfg, $vmstate); > + PVE::Storage::activate_volumes($storecfg, [$vmstate]); > + push @$cmd, '-loadstate', $statepath; > + } > + > # add custom args > if ($conf->{args}) { > my $aa = PVE::Tools::split_args($conf->{args}); > @@ -5148,7 +5154,10 @@ sub vm_start { > > die "you can't start a vm if it's a template\n" if > PVE::QemuConfig->is_template($conf); > > - PVE::QemuConfig->check_lock($conf) if !$skiplock; > + my $is_suspended = PVE::QemuConfig->has_lock($conf, 'suspend'); > + > + PVE::QemuConfig->check_lock($conf) > + if !($skiplock || $is_suspended); > > die "VM $vmid already running\n" if check_running($vmid, undef, > $migratedfrom); > > @@ -5214,6 +5223,11 @@ sub vm_start { > > PVE::GuestHelpers::exec_hookscript($conf, $vmid, 'pre-start', 1); > > + if ($is_suspended) { > + # enforce machine type on suspended vm to ensure HW compatibility > + $forcemachine = $conf->{runningmachine}; > + } > + > my ($cmd, $vollist, $spice_port) = config_to_command($storecfg, $vmid, > $conf, $defaults, $forcemachine); > > my $migrate_port = 0; > @@ -5411,6 +5425,13 @@ sub vm_start { > property => "guest-stats-polling-interval", > value => 2) if (!defined($conf->{balloon}) || > $conf->{balloon}); > > + if ($is_suspended && (my $vmstate = $conf->{vmstate})) { > + delete $conf->@{qw(lock vmstate runningmachine)}; > + PVE::Storage::deactivate_volumes($storecfg, [$vmstate]); > + PVE::Storage::vdisk_free($storecfg, $vmstate); > + PVE::QemuConfig->write_config($vmid, $conf); > + } > + > PVE::GuestHelpers::exec_hookscript($conf, $vmid, 'post-start'); > }); > } > _______________________________________________ pve-devel mailing list pve-devel@pve.proxmox.com https://pve.proxmox.com/cgi-bin/mailman/listinfo/pve-devel