[pve-devel] [PATCH qemu-server] change shutdown behaviour on suspended vm

Dominik Csapak d.csapak at proxmox.com
Tue Apr 12 10:54:21 CEST 2016


previously, when shutting down a suspended vm,
we successfully send the shutdown command to it,
but it will not shutdown (because it is suspended)

there we will run into the timeout and either
bail out with an error, or kill the process

when we not kill the process and resume the vm,
it will instantly shutdown, because of the previous
command

this patch checks the status of the vm beforehand,
and either bails out with an error that you cannot
shutdown a suspended vm, or stops the vm with the
correct qmp command (depending of forceStop)

Signed-off-by: Dominik Csapak <d.csapak at proxmox.com>
---
 PVE/API2/Qemu.pm | 25 ++++++++++++++++++++++++-
 1 file changed, 24 insertions(+), 1 deletion(-)

diff --git a/PVE/API2/Qemu.pm b/PVE/API2/Qemu.pm
index 0d33f6c..8bb68a4 100644
--- a/PVE/API2/Qemu.pm
+++ b/PVE/API2/Qemu.pm
@@ -1818,13 +1818,36 @@ __PACKAGE__->register_method({
 
 	my $storecfg = PVE::Storage::config();
 
+	my $shutdown = 1;
+
+	# if vm is paused, do not shutdown (but stop if forceStop = 1)
+	# otherwise, we will infer a shutdown command, but run into the timeout,
+	# then when the vm is resumed, it will instantly shutdown
+	#
+	# checking the qmp status here to get feedback to the gui/cli/api
+	# and the status query should not take too long
+	my $qmpstatus;
+	eval {
+	    $qmpstatus = PVE::QemuServer::vm_qmp_command($vmid, { execute => "query-status" }, 0);
+	};
+	my $err = $@ if $@;
+
+	if (!$err && $qmpstatus->{status} eq "paused") {
+	    if ($param->{forceStop}) {
+		warn "VM is paused - stop instead of shutdown\n";
+		$shutdown = 0;
+	    } else {
+		die "VM is paused - cannot shutdown\n";
+	    }
+	}
+
 	my $realcmd = sub {
 	    my $upid = shift;
 
 	    syslog('info', "shutdown VM $vmid: $upid\n");
 
 	    PVE::QemuServer::vm_stop($storecfg, $vmid, $skiplock, 0, $param->{timeout},
-				     1, $param->{forceStop}, $keepActive);
+				     $shutdown, $param->{forceStop}, $keepActive);
 
 	    return;
 	};
-- 
2.1.4




More information about the pve-devel mailing list