[libvirt] [PATCH 3/5] qemu: migration: Skip cache=none check for disks which are storage-migrated

Peter Krempa pkrempa at redhat.com
Fri Apr 7 15:50:14 UTC 2017


Since the disks are copied by qemu, there's no need to enforce
cache=none. Thankfully the code that added qemuMigrateDisk did not break
existing configs, since if you don't select any disk to migrate
explicitly the code behaves sanely.

The logic for determining whether a disk should be migrated is
open-coded since using qemuMigrateDisk twice would be semantically
incorrect.
---
 src/qemu/qemu_migration.c | 57 ++++++++++++++++++++++++++++-------------------
 1 file changed, 34 insertions(+), 23 deletions(-)

diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index d8222fe3b..5bd45137c 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1126,9 +1126,14 @@ qemuMigrationIsAllowed(virQEMUDriverPtr driver,
 static bool
 qemuMigrationIsSafe(virDomainDefPtr def,
                     size_t nmigrate_disks,
-                    const char **migrate_disks)
+                    const char **migrate_disks,
+                    unsigned int flags)
+
 {
+    bool storagemigration = flags & (VIR_MIGRATE_NON_SHARED_DISK |
+                                     VIR_MIGRATE_NON_SHARED_INC);
     size_t i;
+    int rc;

     for (i = 0; i < def->ndisks; i++) {
         virDomainDiskDefPtr disk = def->disks[i];
@@ -1136,29 +1141,35 @@ qemuMigrationIsSafe(virDomainDefPtr def,

         /* Our code elsewhere guarantees shared disks are either readonly (in
          * which case cache mode doesn't matter) or used with cache=none */
-        if (qemuMigrateDisk(disk, nmigrate_disks, migrate_disks) &&
-            disk->cachemode != VIR_DOMAIN_DISK_CACHE_DISABLE) {
-            int rc;
+        if (virStorageSourceIsEmpty(disk->src) ||
+            disk->src->readonly ||
+            disk->src->shared ||
+            disk->cachemode == VIR_DOMAIN_DISK_CACHE_DISABLE)
+            continue;

-            if (virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_FILE) {
-                if ((rc = virFileIsSharedFS(src)) < 0)
-                    return false;
-                else if (rc == 0)
-                    continue;
-                if ((rc = virStorageFileIsClusterFS(src)) < 0)
-                    return false;
-                else if (rc == 1)
-                    continue;
-            } else if (disk->src->type == VIR_STORAGE_TYPE_NETWORK &&
-                       disk->src->protocol == VIR_STORAGE_NET_PROTOCOL_RBD) {
-                continue;
-            }
+        /* disks which are migrated by qemu are safe too */
+        if (storagemigration &&
+            qemuMigrateDisk(disk, nmigrate_disks, migrate_disks))
+            continue;

-            virReportError(VIR_ERR_MIGRATE_UNSAFE, "%s",
-                           _("Migration may lead to data corruption if disks"
-                             " use cache != none"));
-            return false;
+        if (virDomainDiskGetType(disk) == VIR_STORAGE_TYPE_FILE) {
+            if ((rc = virFileIsSharedFS(src)) < 0)
+                return false;
+            else if (rc == 0)
+                continue;
+            if ((rc = virStorageFileIsClusterFS(src)) < 0)
+                return false;
+            else if (rc == 1)
+                continue;
+        } else if (disk->src->type == VIR_STORAGE_TYPE_NETWORK &&
+                   disk->src->protocol == VIR_STORAGE_NET_PROTOCOL_RBD) {
+            continue;
         }
+
+        virReportError(VIR_ERR_MIGRATE_UNSAFE, "%s",
+                       _("Migration may lead to data corruption if disks"
+                         " use cache != none"));
+        return false;
     }

     return true;
@@ -1915,7 +1926,7 @@ qemuMigrationBeginPhase(virQEMUDriverPtr driver,
         goto cleanup;

     if (!(flags & VIR_MIGRATE_UNSAFE) &&
-        !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks))
+        !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks, flags))
         goto cleanup;

     if (flags & VIR_MIGRATE_POSTCOPY &&
@@ -4773,7 +4784,7 @@ qemuMigrationPerformJob(virQEMUDriverPtr driver,
         goto endjob;

     if (!(flags & VIR_MIGRATE_UNSAFE) &&
-        !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks))
+        !qemuMigrationIsSafe(vm->def, nmigrate_disks, migrate_disks, flags))
         goto endjob;

     qemuMigrationStoreDomainState(vm);
-- 
2.12.2




More information about the libvir-list mailing list