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

Reply via email to