[Qemu-devel] [PATCH v3 06/14] tests/vm: proper guest shutdown

Gerd Hoffmann posted 14 patches 6 years, 8 months ago
Maintainers: Brad Smith <brad@comstyle.com>, "Philippe Mathieu-Daudé" <philmd@redhat.com>, "Alex Bennée" <alex.bennee@linaro.org>, Fam Zheng <fam@euphon.net>, Kamil Rytarowski <kamil@netbsd.org>
There is a newer version of this series
[Qemu-devel] [PATCH v3 06/14] tests/vm: proper guest shutdown
Posted by Gerd Hoffmann 6 years, 8 months ago
When not running in snapshot mode ask the guest to poweroff and wait for
this to finish instead of simply quitting qemu, so the guest can flush
pending updates to disk.

Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
Tested-by: Thomas Huth <thuth@redhat.com>
---
 tests/vm/basevm.py | 22 +++++++++++++++-------
 1 file changed, 15 insertions(+), 7 deletions(-)

diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
index 878f1a7a32b8..465c7b80d011 100755
--- a/tests/vm/basevm.py
+++ b/tests/vm/basevm.py
@@ -51,6 +51,8 @@ class BaseVM(object):
     name = "#base"
     # The guest architecture, to be overridden by subclasses
     arch = "#arch"
+    # command to halt the guest, can be overridden by subclasses
+    poweroff = "poweroff"
     def __init__(self, debug=False, vcpus=None):
         self._guest = None
         self._tmpdir = os.path.realpath(tempfile.mkdtemp(prefix="vm-test-",
@@ -201,6 +203,10 @@ class BaseVM(object):
     def wait(self):
         self._guest.wait()
 
+    def graceful_shutdown(self):
+        self.ssh_root(self.poweroff)
+        self._guest.wait()
+
     def qmp(self, *args, **kwargs):
         return self._guest.qmp(*args, **kwargs)
 
@@ -277,11 +283,13 @@ def main(vmcls):
         traceback.print_exc()
         return 2
 
-    if args.interactive:
-        if vm.ssh(*cmd) == 0:
-            return 0
+    exitcode = 0
+    if vm.ssh(*cmd) != 0:
+        exitcode = 3
+    if exitcode != 0 and args.interactive:
         vm.ssh()
-        return 3
-    else:
-        if vm.ssh(*cmd) != 0:
-            return 3
+
+    if not args.snapshot:
+        vm.graceful_shutdown()
+
+    return exitcode
-- 
2.18.1


Re: [Qemu-devel] [PATCH v3 06/14] tests/vm: proper guest shutdown
Posted by Philippe Mathieu-Daudé 6 years, 8 months ago
On 5/20/19 2:47 PM, Gerd Hoffmann wrote:
> When not running in snapshot mode ask the guest to poweroff and wait for
> this to finish instead of simply quitting qemu, so the guest can flush
> pending updates to disk.
> 
> Signed-off-by: Gerd Hoffmann <kraxel@redhat.com>
> Tested-by: Thomas Huth <thuth@redhat.com>

Reviewed-by: Philippe Mathieu-Daudé <philmd@redhat.com>
Tested-by: Philippe Mathieu-Daudé <philmd@redhat.com>

> ---
>  tests/vm/basevm.py | 22 +++++++++++++++-------
>  1 file changed, 15 insertions(+), 7 deletions(-)
> 
> diff --git a/tests/vm/basevm.py b/tests/vm/basevm.py
> index 878f1a7a32b8..465c7b80d011 100755
> --- a/tests/vm/basevm.py
> +++ b/tests/vm/basevm.py
> @@ -51,6 +51,8 @@ class BaseVM(object):
>      name = "#base"
>      # The guest architecture, to be overridden by subclasses
>      arch = "#arch"
> +    # command to halt the guest, can be overridden by subclasses
> +    poweroff = "poweroff"
>      def __init__(self, debug=False, vcpus=None):
>          self._guest = None
>          self._tmpdir = os.path.realpath(tempfile.mkdtemp(prefix="vm-test-",
> @@ -201,6 +203,10 @@ class BaseVM(object):
>      def wait(self):
>          self._guest.wait()
>  
> +    def graceful_shutdown(self):
> +        self.ssh_root(self.poweroff)
> +        self._guest.wait()
> +
>      def qmp(self, *args, **kwargs):
>          return self._guest.qmp(*args, **kwargs)
>  
> @@ -277,11 +283,13 @@ def main(vmcls):
>          traceback.print_exc()
>          return 2
>  
> -    if args.interactive:
> -        if vm.ssh(*cmd) == 0:
> -            return 0
> +    exitcode = 0
> +    if vm.ssh(*cmd) != 0:
> +        exitcode = 3
> +    if exitcode != 0 and args.interactive:
>          vm.ssh()
> -        return 3
> -    else:
> -        if vm.ssh(*cmd) != 0:
> -            return 3
> +
> +    if not args.snapshot:
> +        vm.graceful_shutdown()
> +
> +    return exitcode
>