On Mon, Oct 03, 2011 at 04:07:24PM +0200, Michal Privoznik wrote:
This patch implements previous extension in qemu driver.
That is, during prepare phase check for every source to be accessible.
If not, but marked as optional, simply VIR_FREE the source.
Moreover, if migration is persistent, we must check inactive xml,
which is transfered at the finish phase, as well.
---
src/qemu/qemu_migration.c | 51 +++++++++++++++++++++++++++++++++++++++++++-
1 files changed, 49 insertions(+), 2 deletions(-)
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index 1122dab..4aa2532 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -1039,6 +1039,48 @@ cleanup:
return rv;
}
+/* qemuCheckDisksPresence:
+ * @def domain definition
+ *
+ * Iterate over domain disks and check if source exists.
+ * If not and:
+ * - it's marked as optional, free() it.
+ * - it's marked as required, throw an error.
+ *
+ * Returns 0 on success (all remaining disks/sources exist
+ * or have been dropped),
+ * -1 on failure.
+ */
+static int
+qemuCheckDisksPresence(virDomainDefPtr def) {
+ int ret = -1;
+ int i;
+ virDomainDiskDefPtr disk;
+
+ for (i = 0; i < def->ndisks; i++) {
+ disk = def->disks[i];
+
+ if (virFileExists(disk->src)) {
+ if (disk->migration.optional == VIR_DOMAIN_DEVICE_MIGRATION_OPT_DROP)
+ VIR_FREE(disk->src);
+
+ continue;
+ }
This is not going to play nice with RHEVM, where images are stored on
a root squashing NFS server, where libvirtd has no visibility, but
QEMU can access.
At the very least you need to run this check in a separate process
which is running as the QEMU user/group ID.
+
+ if (disk->migration.optional == VIR_DOMAIN_DEVICE_MIGRATION_OPT_REQ) {
+ qemuReportError(VIR_ERR_NO_SOURCE,
+ _("no such file %s"),
+ disk->src);
+ goto cleanup;
+ }
+
+ VIR_FREE(disk->src);
+ }
+
+ ret = 0;
+cleanup:
+ return ret;
+}
/* Prepare is the first step, and it runs on the destination host.
*/
@@ -1087,6 +1129,9 @@ qemuMigrationPrepareAny(struct qemud_driver *driver,
if (virDomainObjIsDuplicate(&driver->domains, def, 1) < 0)
goto cleanup;
+ if (qemuCheckDisksPresence(def) < 0)
+ goto cleanup;
+
if (!(vm = virDomainAssignDef(driver->caps,
&driver->domains,
def, true))) {
@@ -2579,9 +2624,11 @@ qemuMigrationFinish(struct qemud_driver *driver,
if (vm->persistent)
newVM = 0;
vm->persistent = 1;
- if (mig->persistent)
+ if (mig->persistent) {
+ if (qemuCheckDisksPresence(mig->persistent) < 0)
+ goto endjob;
What's the point in checking here ? You've already checked at te
start of migration, and if it has gone away since then, it is too
late for this check todo anything useful
Daniel
--
|:
http://berrange.com -o-
http://www.flickr.com/photos/dberrange/ :|
|:
http://libvirt.org -o-
http://virt-manager.org :|
|:
http://autobuild.org -o-
http://search.cpan.org/~danberr/ :|
|:
http://entangle-photo.org -o-
http://live.gnome.org/gtk-vnc :|