From 632be336898c9efef258e1f2d1c3df199a98a4aa Mon Sep 17 00:00:00 2001 From: Maximilian Wilhelm Date: Thu, 12 Nov 2009 16:04:43 +0100 Subject: [PATCH] Implement finer grained migration control for Xen * src/xen/xen_driver.c: Add support for VIR_MIGRATE_PERSIST_DEST flag * src/xen/xend_internal.c: Add support for VIR_MIGRATE_UNDEFINE_SOURCE flag * include/libvirt/virterror.h, src/util/virterror.c: Add new errorcode VIR_ERR_MIGRATE_PERSIST_FAILED --- include/libvirt/virterror.h | 2 ++ src/util/virterror.c | 6 ++++++ src/xen/xen_driver.c | 42 +++++++++++++++++++++++++++++++++++-- src/xen/xend_internal.c | 20 +++++++++++++++++- 4 files changed, 67 insertions(+), 3 deletions(-) diff --git a/include/libvirt/virterror.h b/include/libvirt/virterror.h index dfa23f2444..8548a8dd4b 100644 --- a/include/libvirt/virterror.h +++ b/include/libvirt/virterror.h @@ -172,6 +172,8 @@ typedef enum { VIR_ERR_NO_SECRET, /* secret not found */ VIR_ERR_CONFIG_UNSUPPORTED, /* unsupported configuration construct */ VIR_ERR_OPERATION_TIMEOUT, /* timeout occurred during operation */ + VIR_ERR_MIGRATE_PERSIST_FAILED, /* a migration worked, but making the + VM persist on the dest host failed */ } virErrorNumber; /** diff --git a/src/util/virterror.c b/src/util/virterror.c index 00d5b2c3b5..8b374ca66b 100644 --- a/src/util/virterror.c +++ b/src/util/virterror.c @@ -1101,6 +1101,12 @@ virErrorMsg(virErrorNumber error, const char *info) else errmsg = _("Timed out during operation: %s"); break; + case VIR_ERR_MIGRATE_PERSIST_FAILED: + if (info == NULL) + errmsg = _("Failed to make domain persistent after migration"); + else + errmsg = _("Failed to make domain persistent after migration: %s"); + break; } return (errmsg); } diff --git a/src/xen/xen_driver.c b/src/xen/xen_driver.c index d8c70879ac..80e81326ff 100644 --- a/src/xen/xen_driver.c +++ b/src/xen/xen_driver.c @@ -1301,9 +1301,47 @@ xenUnifiedDomainMigrateFinish (virConnectPtr dconn, const char *cookie ATTRIBUTE_UNUSED, int cookielen ATTRIBUTE_UNUSED, const char *uri ATTRIBUTE_UNUSED, - unsigned long flags ATTRIBUTE_UNUSED) + unsigned long flags) { - return xenUnifiedDomainLookupByName (dconn, dname); + virDomainPtr dom = NULL; + char *domain_xml = NULL; + virDomainPtr dom_new = NULL; + + dom = xenUnifiedDomainLookupByName (dconn, dname); + if (! dom) { + return NULL; + } + + if (flags & VIR_MIGRATE_PERSIST_DEST) { + domain_xml = xenDaemonDomainDumpXML (dom, 0, NULL); + if (! domain_xml) { + xenUnifiedError(dconn, VIR_ERR_MIGRATE_PERSIST_FAILED, + _("failed to get XML representation of migrated domain")); + goto failure; + } + + dom_new = xenDaemonDomainDefineXML (dconn, domain_xml); + if (! dom_new) { + xenUnifiedError (dconn, VIR_ERR_MIGRATE_PERSIST_FAILED, + _("failed to define domain on destination host")); + goto failure; + } + + /* Free additional reference added by Define */ + virDomainFree (dom_new); + } + + VIR_FREE (domain_xml); + + return dom; + + +failure: + virDomainFree (dom); + + VIR_FREE (domain_xml); + + return NULL; } static int diff --git a/src/xen/xend_internal.c b/src/xen/xend_internal.c index 6b9a1258cc..d61e9e699b 100644 --- a/src/xen/xend_internal.c +++ b/src/xen/xend_internal.c @@ -4396,6 +4396,8 @@ xenDaemonDomainMigratePerform (virDomainPtr domain, int ret; char *p, *hostname = NULL; + int undefined_source = 0; + /* Xen doesn't support renaming domains during migration. */ if (dname) { virXendError (conn, VIR_ERR_NO_SUPPORT, @@ -4414,11 +4416,24 @@ xenDaemonDomainMigratePerform (virDomainPtr domain, return -1; } - /* Check the flags. */ + /* + * Check the flags. + */ if ((flags & VIR_MIGRATE_LIVE)) { strcpy (live, "1"); flags &= ~VIR_MIGRATE_LIVE; } + + /* Undefine the VM on the source host after migration? */ + if (flags & VIR_MIGRATE_UNDEFINE_SOURCE) { + undefined_source = 1; + flags &= ~VIR_MIGRATE_UNDEFINE_SOURCE; + } + + /* Ignore the persist_dest flag here */ + if (flags & VIR_MIGRATE_PERSIST_DEST) + flags &= ~VIR_MIGRATE_PERSIST_DEST; + /* XXX we could easily do tunnelled & peer2peer migration too if we want to. support these... */ if (flags != 0) { @@ -4504,6 +4519,9 @@ xenDaemonDomainMigratePerform (virDomainPtr domain, NULL); VIR_FREE (hostname); + if (ret == 0 && undefined_source) + xenDaemonDomainUndefine (domain); + DEBUG0("migration done"); return ret;