[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

[Xen-devel] [PATCH] libxl: do not leak qemu saved state on restore (Was: Re: [xen-unstable test] 10481: regressions - FAIL)



On Tue, 2011-12-13 at 09:44 +0000, Ian Campbell wrote:
> 
> >  test-amd64-i386-xend-winxpsp3 16 leak-check/check             fail  never 
> > pass
> >  test-i386-i386-win           16 leak-check/check             fail   never 
> > pass
> >  test-amd64-i386-win-vcpus1   16 leak-check/check             fail   never 
> > pass
> >  test-amd64-i386-win          16 leak-check/check             fail   never 
> > pass
> 
> These all leaked a load of /var/lib/xen/qemu-resume.N. This should be
> quick & easy to fix, I'll have a look. 

These happen to all be xend failures but the only reason xl doesn't have
this is that those tests all fail at the guest-stop stage and never get
as far as the migration test. Here is the fix for the xl version, fixing
the xend side seems less trivial and I don't propose to dig into it.

Ian.

8<--------------------------------------------------

# HG changeset patch
# User Ian Campbell <ian.campbell@xxxxxxxxxx>
# Date 1323772303 0
# Node ID 9ea12474c6dcd75bbbc7a5c62a2b96de902ccb83
# Parent  88df802b4905d7e34032eacf1942b70c76d150a4
libxl: do not leak qemu saved state on restore

In particular do not leak /var/lib/xen/qemu-resume.<domid>.

Signed-off-by: Ian Campbell <ian.campbell@xxxxxxxxxx>

diff -r 88df802b4905 -r 9ea12474c6dc tools/libxl/libxl_create.c
--- a/tools/libxl/libxl_create.c        Mon Dec 12 17:43:55 2011 +0000
+++ b/tools/libxl/libxl_create.c        Tue Dec 13 10:31:43 2011 +0000
@@ -622,7 +622,7 @@ static int do_domain_create(libxl__gc *g
             == LIBXL_DEVICE_MODEL_VERSION_QEMU_XEN) {
             libxl__qmp_initializations(ctx, domid);
         }
-        ret = libxl__confirm_device_model_startup(gc, dm_starting);
+        ret = libxl__confirm_device_model_startup(gc, dm_info, dm_starting);
         if (ret < 0) {
             LIBXL__LOG(ctx, LIBXL__LOG_ERROR,
                        "device model did not start: %d", ret);
diff -r 88df802b4905 -r 9ea12474c6dc tools/libxl/libxl_dm.c
--- a/tools/libxl/libxl_dm.c    Mon Dec 12 17:43:55 2011 +0000
+++ b/tools/libxl/libxl_dm.c    Tue Dec 13 10:31:43 2011 +0000
@@ -753,7 +753,8 @@ retry_transaction:
         ret = ERROR_FAIL;
         goto out_free;
     }
-    if (libxl__confirm_device_model_startup(gc, dm_starting) < 0) {
+    if (libxl__confirm_device_model_startup(gc, &xenpv_dm_info,
+                                            dm_starting) < 0) {
         ret = ERROR_FAIL;
         goto out_free;
     }
@@ -894,14 +895,26 @@ out:
 
 
 int libxl__confirm_device_model_startup(libxl__gc *gc,
-                                       libxl__spawner_starting *starting)
+                                libxl_device_model_info *dm_info,
+                                libxl__spawner_starting *starting)
 {
+    libxl_ctx *ctx = libxl__gc_owner(gc);
     char *path;
     int domid = starting->domid;
+    int ret, ret2;
     path = libxl__sprintf(gc, "/local/domain/0/device-model/%d/state", domid);
-    return libxl__spawn_confirm_offspring_startup(gc,
+    ret = libxl__spawn_confirm_offspring_startup(gc,
                                      LIBXL_DEVICE_MODEL_START_TIMEOUT,
                                      "Device Model", path, "running", 
starting);
+    if (dm_info->saved_state) {
+        ret2 = unlink(dm_info->saved_state);
+        if (ret2) LIBXL__LOG_ERRNO(ctx, XTL_ERROR,
+                                   "failed to remove device-model state %s\n",
+                                   dm_info->saved_state);
+        /* Do not clobber spawn_confirm error code with unlink error code. */
+        if (!ret) ret = ret2;
+    }
+    return ret;
 }
 
 int libxl__destroy_device_model(libxl__gc *gc, uint32_t domid)
diff -r 88df802b4905 -r 9ea12474c6dc tools/libxl/libxl_internal.h
--- a/tools/libxl/libxl_internal.h      Mon Dec 12 17:43:55 2011 +0000
+++ b/tools/libxl/libxl_internal.h      Tue Dec 13 10:31:43 2011 +0000
@@ -419,6 +419,7 @@ _hidden int libxl__need_xenpv_qemu(libxl
    * return pass *starting_r (which will be non-0) to
    * libxl__confirm_device_model_startup or libxl__detach_device_model. */
 _hidden int libxl__confirm_device_model_startup(libxl__gc *gc,
+                              libxl_device_model_info *dm_info,
                               libxl__spawner_starting *starting);
 _hidden int libxl__detach_device_model(libxl__gc *gc, libxl__spawner_starting 
*starting);
 _hidden int libxl__wait_for_device_model(libxl__gc *gc,



_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxxxxxxxx
http://lists.xensource.com/xen-devel


 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.