[libvirt] [PATCH] qemu: Fix error reporting in qemuDomainSaveImageStartVM

Jiri Denemark posted 1 patch 5 years, 7 months ago
Failed in applying to current master (apply log)
src/qemu/qemu_driver.c | 11 ++++++++++-
1 file changed, 10 insertions(+), 1 deletion(-)
[libvirt] [PATCH] qemu: Fix error reporting in qemuDomainSaveImageStartVM
Posted by Jiri Denemark 5 years, 7 months ago
When restoring a domain from a compressed image, we launch an
intermediate process for decompressing the saved data. If QEMU fails to
load the data for some reason, we force close the stdin/stdout file
descriptors of the intermediate process and wait for it to die. However,
virCommandWait can report various errors which would overwrite the real
error from QEMU. Thus instead of getting something useful:

    internal error: process exited while connecting to monitor:
    2018-09-17T15:17:29.998910Z qemu-system-x86_64: can't apply global
    Skylake-Client-x86_64-cpu.osxsave=off: Property '.osxsave' not found

we could get an irrelevant error message:

    internal error: Child process (lzop -dc --ignore-warn) unexpected
    fatal signal 13

Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
---
 src/qemu/qemu_driver.c | 11 ++++++++++-
 1 file changed, 10 insertions(+), 1 deletion(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 9424994aa1..25cbccc5e6 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6590,11 +6590,15 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
         restored = true;
 
     if (intermediatefd != -1) {
+        virErrorPtr orig_err = NULL;
+
         if (!restored) {
             /* if there was an error setting up qemu, the intermediate
              * process will wait forever to write to stdout, so we
-             * must manually kill it.
+             * must manually kill it and ignore any error related to
+             * the process
              */
+            orig_err = virSaveLastError();
             VIR_FORCE_CLOSE(intermediatefd);
             VIR_FORCE_CLOSE(*fd);
         }
@@ -6604,6 +6608,11 @@ qemuDomainSaveImageStartVM(virConnectPtr conn,
             restored = false;
         }
         VIR_DEBUG("Decompression binary stderr: %s", NULLSTR(errbuf));
+
+        if (orig_err) {
+            virSetError(orig_err);
+            virFreeError(orig_err);
+        }
     }
     VIR_FORCE_CLOSE(intermediatefd);
 
-- 
2.19.0

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list
Re: [libvirt] [PATCH] qemu: Fix error reporting in qemuDomainSaveImageStartVM
Posted by John Ferlan 5 years, 7 months ago

On 09/18/2018 03:59 AM, Jiri Denemark wrote:
> When restoring a domain from a compressed image, we launch an
> intermediate process for decompressing the saved data. If QEMU fails to
> load the data for some reason, we force close the stdin/stdout file
> descriptors of the intermediate process and wait for it to die. However,
> virCommandWait can report various errors which would overwrite the real
> error from QEMU. Thus instead of getting something useful:
> 
>     internal error: process exited while connecting to monitor:
>     2018-09-17T15:17:29.998910Z qemu-system-x86_64: can't apply global
>     Skylake-Client-x86_64-cpu.osxsave=off: Property '.osxsave' not found
> 
> we could get an irrelevant error message:
> 
>     internal error: Child process (lzop -dc --ignore-warn) unexpected
>     fatal signal 13
> 
> Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
> ---
>  src/qemu/qemu_driver.c | 11 ++++++++++-
>  1 file changed, 10 insertions(+), 1 deletion(-)
> 

Reviewed-by: John Ferlan <jferlan@redhat.com>

John

Side note, reviewing Michal's recent patches, he used
virErrorPreserveLast and virErrorRestore... IDC which is used, but it
does leave the question why pkrempa didn't modify existing callers to
use one mechanism or another... Two very similar paths with some slight
but perhaps important differences.  Different problem for a different day.

--
libvir-list mailing list
libvir-list@redhat.com
https://www.redhat.com/mailman/listinfo/libvir-list