[pve-devel] applied: [RFC PATCH qemu-server] use 'system_wakeup' to resume suspended vms
Thomas Lamprecht
t.lamprecht at proxmox.com
Wed Jun 20 07:53:42 CEST 2018
On 6/13/18 1:46 PM, Thomas Lamprecht wrote:
> On 6/13/18 11:17 AM, Dominik Csapak wrote:
>> when a vm is suspended (e.g. autosuspend on windows)
>> we detect that it is not running, display the resume button,
>> but 'cont' does not wakeup the system from suspend
>>
>> with this we can wake up suspended vms
>>
>> [snip]
>
> applied, but I wonder if we could remove the $nocheck from this
> method...
>
> nocheck was introduced in 289e0b8564dce494481cd3a5d534b801835f85b6 as
> a band-aid, but it only accomplishes skipping the check_running call
> in the vm_qmp_command (which vm_mon_cmd uses) and avoiding the
> load_conf for some race cases with migration where the config wasn't
> moved yet at this point.
>
> But as neither cont nor system_wakup will work on an non-running VM
> we could use only vm_mon_cmd once at the end of the locked scope?
>
> Further nocheck may be removed, the load_conf could be wrapped in
> skiplock, which the migration case uses anyway.
> The qm skiplock param would need to be kept as dummy param for now,
> to keep incoming migration backward compatibility...
>
> What do you think? I.e., something like this followup:
>
Any comments?
> ---8<---
> diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
> index c15c71f..ab1f73d 100644
> --- a/PVE/API2/Qemu.pm
> +++ b/PVE/API2/Qemu.pm
> @@ -2349,7 +2349,7 @@ __PACKAGE__->register_method({
> vmid => get_standard_option('pve-vmid',
> { completion => \&PVE::QemuServer::complete_vmid_running }),
> skiplock => get_standard_option('skiplock'),
> - nocheck => { type => 'boolean', optional => 1 },
> + nocheck => { type => 'boolean', optional => 1, description => 'deprecated' },
>
> },
> },
> @@ -2371,16 +2371,14 @@ __PACKAGE__->register_method({
> raise_param_exc({ skiplock => "Only root may use this option." })
> if $skiplock && $authuser ne 'root at pam';
>
> - my $nocheck = extract_param($param, 'nocheck');
> -
> - die "VM $vmid not running\n" if !PVE::QemuServer::check_running($vmid, $nocheck);
> + die "VM $vmid not running\n";
>
> my $realcmd = sub {
> my $upid = shift;
>
> syslog('info', "resume VM $vmid: $upid\n");
>
> - PVE::QemuServer::vm_resume($vmid, $skiplock, $nocheck);
> + PVE::QemuServer::vm_resume($vmid, $skiplock);
>
> return;
> };
> diff --git a/PVE/CLI/qm.pm b/PVE/CLI/qm.pm
> index c017a59..83a50a2 100755
> --- a/PVE/CLI/qm.pm
> +++ b/PVE/CLI/qm.pm
> @@ -297,7 +297,7 @@ __PACKAGE__->register_method ({
> } elsif ($line =~ /^resume (\d+)$/) {
> my $vmid = $1;
> if (PVE::QemuServer::check_running($vmid, 1)) {
> - eval { PVE::QemuServer::vm_resume($vmid, 1, 1); };
> + eval { PVE::QemuServer::vm_resume($vmid, 1) };
> if ($@) {
> $tunnel_write->("ERR: resume failed - $@");
> } else {
> diff --git a/PVE/QemuServer.pm b/PVE/QemuServer.pm
> index 277bc58..a93625a 100644
> --- a/PVE/QemuServer.pm
> +++ b/PVE/QemuServer.pm
> @@ -5166,29 +5166,22 @@ sub vm_suspend {
> }
>
> sub vm_resume {
> - my ($vmid, $skiplock, $nocheck) = @_;
> + my ($vmid, $skiplock) = @_;
>
> PVE::QemuConfig->lock_config($vmid, sub {
>
> my $res = vm_mon_cmd($vmid, 'query-status');
> my $resume_cmd = 'cont';
> -
> if ($res->{status} && $res->{status} eq 'suspended') {
> $resume_cmd = 'system_wakeup';
> }
>
> - if (!$nocheck) {
> -
> + if (!$skiplock) {
> my $conf = PVE::QemuConfig->load_config($vmid);
> -
> - PVE::QemuConfig->check_lock($conf)
> - if !($skiplock || PVE::QemuConfig->has_lock($conf, 'backup'));
> -
> - vm_mon_cmd($vmid, $resume_cmd);
> -
> - } else {
> - vm_mon_cmd_nocheck($vmid, $resume_cmd);
> + PVE::QemuConfig->check_lock($conf) if !PVE::QemuConfig->has_lock($conf, 'backup');
> }
> +
> + vm_mon_cmd($vmid, $resume_cmd);
> });
> }
>
> @@ -6299,7 +6292,7 @@ sub qemu_drive_mirror_monitor {
> eval { PVE::QemuServer::vm_mon_cmd($vmid, "guest-fsfreeze-thaw"); };
> } else {
> print "resume vm\n";
> - eval { PVE::QemuServer::vm_resume($vmid, 1, 1); };
> + eval { vm_resume($vmid, 1) };
> }
>
> last;
>
More information about the pve-devel
mailing list