]> git.ipfire.org Git - thirdparty/libvirt.git/commitdiff
conf: Store managed save image existence in virDomainObj
authorPeter Krempa <pkrempa@redhat.com>
Mon, 11 Jun 2012 09:03:27 +0000 (11:03 +0200)
committerPeter Krempa <pkrempa@redhat.com>
Mon, 18 Jun 2012 19:24:13 +0000 (21:24 +0200)
This patch stores existence of the image in the object. At start of the
daemon the state is checked and then updated in key moments in domain
lifecycle.

src/conf/domain_conf.h
src/libxl/libxl_driver.c
src/qemu/qemu_driver.c

index d627ad82e88c5709dec0e5dc1cd3e2eca7d9dc54..88674eb8308de5ecd6c21b5653bbdee9dc9d7c6b 100644 (file)
@@ -1817,6 +1817,8 @@ struct _virDomainObj {
     virDomainSnapshotObjList snapshots;
     virDomainSnapshotObjPtr current_snapshot;
 
+    bool hasManagedSave;
+
     void *privateData;
     void (*privateDataFreeFunc)(void *);
 
index 500d51b4bad67f06f03dfe122cc4f8ee0bd7402b..0520ce988e72a9eee627e9818842dc71806c05b0 100644 (file)
 /* Number of Xen scheduler parameters */
 #define XEN_SCHED_CREDIT_NPARAM   2
 
+static void libxlDomainManagedSaveLoad(void *payload,
+                                       const void *n ATTRIBUTE_UNUSED,
+                                       void *opaque);
+
+
 static libxlDriverPrivatePtr libxl_driver = NULL;
 
 /* Function declarations */
@@ -647,6 +652,7 @@ libxlVmStart(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
                 VIR_WARN("Failed to remove the managed state %s",
                          managed_save_path);
             }
+            vm->hasManagedSave = false;
         }
         VIR_FREE(managed_save_path);
     }
@@ -983,6 +989,9 @@ libxlStartup(int privileged) {
     virHashForEach(libxl_driver->domains.objs, libxlAutostartDomain,
                    libxl_driver);
 
+    virHashForEach(libxl_driver->domains.objs, libxlDomainManagedSaveLoad,
+                   libxl_driver);
+
     libxlDriverUnlock(libxl_driver);
 
     return 0;
@@ -1868,6 +1877,8 @@ libxlDoDomainSave(libxlDriverPrivatePtr driver, virDomainObjPtr vm,
         goto cleanup;
     }
 
+    vm->hasManagedSave = true;
+
     if (!vm->persistent) {
         virDomainRemoveInactive(&driver->domains, vm);
         vm = NULL;
@@ -2124,13 +2135,33 @@ cleanup:
     return ret;
 }
 
+static void
+libxlDomainManagedSaveLoad(void *payload,
+                           const void *n ATTRIBUTE_UNUSED,
+                           void *opaque)
+{
+    virDomainObjPtr vm = payload;
+    libxlDriverPrivatePtr driver = opaque;
+    char *name;
+
+    virDomainObjLock(vm);
+
+    if (!(name = libxlDomainManagedSavePath(driver, vm)))
+        goto cleanup;
+
+    vm->hasManagedSave = virFileExists(name);
+
+cleanup:
+    virDomainObjUnlock(vm);
+    VIR_FREE(name);
+}
+
 static int
 libxlDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
 {
     libxlDriverPrivatePtr driver = dom->conn->privateData;
     virDomainObjPtr vm = NULL;
     int ret = -1;
-    char *name = NULL;
 
     virCheckFlags(0, -1);
 
@@ -2144,14 +2175,9 @@ libxlDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
         goto cleanup;
     }
 
-    name = libxlDomainManagedSavePath(driver, vm);
-    if (name == NULL)
-        goto cleanup;
-
-    ret = virFileExists(name);
+    ret = vm->hasManagedSave;
 
 cleanup:
-    VIR_FREE(name);
     if (vm)
         virDomainObjUnlock(vm);
     libxlDriverUnlock(driver);
@@ -2183,6 +2209,7 @@ libxlDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags)
         goto cleanup;
 
     ret = unlink(name);
+    vm->hasManagedSave = false;
 
 cleanup:
     VIR_FREE(name);
index 32819c383be3d814136598a854283be9c2fec4de..3fd9803812aeffdc2547a41c4948dcb485e43cae 100644 (file)
@@ -139,6 +139,11 @@ static int qemuDomainObjStart(virConnectPtr conn,
 
 static int qemudDomainGetMaxVcpus(virDomainPtr dom);
 
+static void qemuDomainManagedSaveLoad(void *payload,
+                                      const void *n ATTRIBUTE_UNUSED,
+                                      void *opaque);
+
+
 struct qemud_driver *qemu_driver = NULL;
 
 
@@ -734,6 +739,9 @@ qemudStartup(int privileged) {
     virHashForEach(qemu_driver->domains.objs, qemuDomainSnapshotLoad,
                    qemu_driver->snapshotDir);
 
+    virHashForEach(qemu_driver->domains.objs, qemuDomainManagedSaveLoad,
+                   qemu_driver);
+
     qemu_driver->workerPool = virThreadPoolNew(0, 1, 0, processWatchdogEvent, qemu_driver);
     if (!qemu_driver->workerPool)
         goto error;
@@ -2729,6 +2737,7 @@ qemuDomainSaveInternal(struct qemud_driver *driver, virDomainPtr dom,
     }
 
     ret = 0;
+    vm->hasManagedSave = true;
 
     /* Shut it down */
     qemuProcessStop(driver, vm, VIR_DOMAIN_SHUTOFF_SAVED, 0);
@@ -2918,13 +2927,33 @@ cleanup:
     return ret;
 }
 
+static void
+qemuDomainManagedSaveLoad(void *payload,
+                          const void *n ATTRIBUTE_UNUSED,
+                          void *opaque)
+{
+    virDomainObjPtr vm = payload;
+    struct qemud_driver *driver = opaque;
+    char *name;
+
+    virDomainObjLock(vm);
+
+    if (!(name = qemuDomainManagedSavePath(driver, vm)))
+        goto cleanup;
+
+    vm->hasManagedSave = virFileExists(name);
+
+cleanup:
+    virDomainObjUnlock(vm);
+    VIR_FREE(name);
+}
+
 static int
 qemuDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
 {
     struct qemud_driver *driver = dom->conn->privateData;
     virDomainObjPtr vm = NULL;
     int ret = -1;
-    char *name = NULL;
 
     virCheckFlags(0, -1);
 
@@ -2938,14 +2967,9 @@ qemuDomainHasManagedSaveImage(virDomainPtr dom, unsigned int flags)
         goto cleanup;
     }
 
-    name = qemuDomainManagedSavePath(driver, vm);
-    if (name == NULL)
-        goto cleanup;
-
-    ret = virFileExists(name);
+    ret = vm->hasManagedSave;
 
 cleanup:
-    VIR_FREE(name);
     if (vm)
         virDomainObjUnlock(vm);
     qemuDriverUnlock(driver);
@@ -2977,6 +3001,7 @@ qemuDomainManagedSaveRemove(virDomainPtr dom, unsigned int flags)
         goto cleanup;
 
     ret = unlink(name);
+    vm->hasManagedSave = false;
 
 cleanup:
     VIR_FREE(name);
@@ -4820,8 +4845,13 @@ qemuDomainObjStart(virConnectPtr conn,
             ret = qemuDomainObjRestore(conn, driver, vm, managed_save,
                                        start_paused, bypass_cache);
 
-            if (ret == 0 && unlink(managed_save) < 0)
-                VIR_WARN("Failed to remove the managed state %s", managed_save);
+            if (ret == 0) {
+                if (unlink(managed_save) < 0)
+                    VIR_WARN("Failed to remove the managed state %s", managed_save);
+                else
+                    vm->hasManagedSave = false;
+            }
+
             if (ret > 0)
                 VIR_WARN("Ignoring incomplete managed state %s", managed_save);
             else