Re: [libvirt] [PATCH 6/6] Implement migration v3 protocol in QEMU driver

2011-02-10 Thread Eric Blake
On 02/09/2011 09:58 AM, Daniel P. Berrange wrote:
> Implement the v3 migration protocol, which has two extra
> steps, 'begin' on the source host and 'confirm' on the
> source host. All other methods also gain both input and
> output cookies to allow bi-directional data passing at
> all stages
> 
> * src/qemu/qemu_driver.c: Wire up migrate v3 APIs
> * src/qemu/qemu_migration.c, src/qemu/qemu_migration.h: Add
>   begin & confirm methods
> ---
>  src/qemu/qemu_driver.c|  318 +++-
>  src/qemu/qemu_migration.c |  141 ++--
>  src/qemu/qemu_migration.h |   16 ++-

ACK.

-- 
Eric Blake   [email protected]+1-801-349-2682
Libvirt virtualization library http://libvirt.org



signature.asc
Description: OpenPGP digital signature
--
libvir-list mailing list
[email protected]
https://www.redhat.com/mailman/listinfo/libvir-list

[libvirt] [PATCH 6/6] Implement migration v3 protocol in QEMU driver

2011-02-09 Thread Daniel P. Berrange
Implement the v3 migration protocol, which has two extra
steps, 'begin' on the source host and 'confirm' on the
source host. All other methods also gain both input and
output cookies to allow bi-directional data passing at
all stages

* src/qemu/qemu_driver.c: Wire up migrate v3 APIs
* src/qemu/qemu_migration.c, src/qemu/qemu_migration.h: Add
  begin & confirm methods
---
 src/qemu/qemu_driver.c|  318 +++-
 src/qemu/qemu_migration.c |  141 ++--
 src/qemu/qemu_migration.h |   16 ++-
 3 files changed, 454 insertions(+), 21 deletions(-)

diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 4f72c07..91caeea 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -866,6 +866,7 @@ qemudSupportsFeature (virConnectPtr conn ATTRIBUTE_UNUSED, 
int feature)
 {
 switch (feature) {
 case VIR_DRV_FEATURE_MIGRATION_V2:
+case VIR_DRV_FEATURE_MIGRATION_V3:
 case VIR_DRV_FEATURE_MIGRATION_P2P:
 return 1;
 default:
@@ -5343,7 +5344,9 @@ qemuDomainEventDeregisterAny(virConnectPtr conn,
 }
 
 
-/* Migration support. */
+/***
+ * Migration Protocol Version 2
+ ***/
 
 /* Prepare is the first step, and it runs on the destination host.
  *
@@ -5361,6 +5364,15 @@ qemudDomainMigratePrepareTunnel(virConnectPtr dconn,
 struct qemud_driver *driver = dconn->privateData;
 int ret = -1;
 
+virCheckFlags(VIR_MIGRATE_LIVE |
+  VIR_MIGRATE_PEER2PEER |
+  VIR_MIGRATE_TUNNELLED |
+  VIR_MIGRATE_PERSIST_DEST |
+  VIR_MIGRATE_UNDEFINE_SOURCE |
+  VIR_MIGRATE_PAUSED |
+  VIR_MIGRATE_NON_SHARED_DISK |
+  VIR_MIGRATE_NON_SHARED_INC, -1);
+
 if (!dom_xml) {
 qemuReportError(VIR_ERR_INTERNAL_ERROR,
 "%s", _("no domain XML passed"));
@@ -5480,7 +5492,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
 ret = qemuMigrationPerform(driver, dom->conn, vm,
uri, cookie, cookielen,
NULL, NULL, /* No output cookies in v2 */
-   flags, dname, resource);
+   flags, dname, resource, true);
 
 cleanup:
 qemuDriverUnlock(driver);
@@ -5537,6 +5549,296 @@ cleanup:
 }
 
 
+/***
+ * Migration Protocol Version 3
+ ***/
+
+static char *
+qemuDomainMigrateBegin3(virDomainPtr domain,
+char **cookieout,
+int *cookieoutlen,
+unsigned long flags,
+const char *dname ATTRIBUTE_UNUSED,
+unsigned long resource ATTRIBUTE_UNUSED)
+{
+struct qemud_driver *driver = domain->conn->privateData;
+virDomainObjPtr vm;
+char *xml = NULL;
+
+virCheckFlags(VIR_MIGRATE_LIVE |
+  VIR_MIGRATE_PEER2PEER |
+  VIR_MIGRATE_TUNNELLED |
+  VIR_MIGRATE_PERSIST_DEST |
+  VIR_MIGRATE_UNDEFINE_SOURCE |
+  VIR_MIGRATE_PAUSED |
+  VIR_MIGRATE_NON_SHARED_DISK |
+  VIR_MIGRATE_NON_SHARED_INC, NULL);
+
+qemuDriverLock(driver);
+vm = virDomainFindByUUID(&driver->domains, domain->uuid);
+if (!vm) {
+char uuidstr[VIR_UUID_STRING_BUFLEN];
+virUUIDFormat(domain->uuid, uuidstr);
+qemuReportError(VIR_ERR_NO_DOMAIN,
+_("no domain with matching uuid '%s'"), uuidstr);
+goto cleanup;
+}
+
+xml = qemuMigrationBegin(driver, vm,
+ cookieout, cookieoutlen);
+
+cleanup:
+qemuDriverUnlock(driver);
+return xml;
+}
+
+static int
+qemuDomainMigratePrepare3(virConnectPtr dconn,
+  const char *cookiein,
+  int cookieinlen,
+  char **cookieout,
+  int *cookieoutlen,
+  const char *uri_in,
+  char **uri_out,
+  unsigned long flags,
+  const char *dname,
+  unsigned long resource ATTRIBUTE_UNUSED,
+  const char *dom_xml)
+{
+struct qemud_driver *driver = dconn->privateData;
+int ret = -1;
+
+virCheckFlags(VIR_MIGRATE_LIVE |
+  VIR_MIGRATE_PEER2PEER |
+  VIR_MIGRATE_TUNNELLED |
+  VIR_MIGRATE_PERSIST_DEST |
+  VIR_MIGRATE_UNDEFINE_SOURCE |
+  VIR_MIGRATE_PAUSED |
+  VIR_MIGRATE_NON_SHARED_DISK |
+  VIR_MIGRATE_NON_SHARED_INC, -1);
+
+*uri_out = NULL;
+
+qemuDriverLock(driv