[pve-devel] [PATCH qemu-server v2 4/6] resume suspended vm on start

Thomas Lamprecht t.lamprecht at proxmox.com
Thu Mar 14 08:44:15 CET 2019


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.csapak at 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');
>      });
>  }
> 




More information about the pve-devel mailing list