On Thu, 2009-09-24 at 16:00 +0100, Daniel P. Berrange wrote:
* src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h: Add new API
qemuMonitorMigrateToHost() for doing TCP migration
* src/qemu/qemu_driver.c: Convert to use qemuMonitorMigrateToHost().
Also handle proper URIs (tcp:// as well as tcp:)
---
src/qemu/qemu_driver.c | 40 ++++++++++++-----------------
src/qemu/qemu_monitor_text.c | 56 ++++++++++++++++++++++++++++++++++++++++++
src/qemu/qemu_monitor_text.h | 4 +++
3 files changed, 77 insertions(+), 23 deletions(-)
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index a6300c9..f234639 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -6494,12 +6494,10 @@ qemudDomainMigratePerform (virDomainPtr dom,
struct qemud_driver *driver = dom->conn->privateData;
virDomainObjPtr vm;
virDomainEventPtr event = NULL;
- char *safe_uri;
- char cmd[HOST_NAME_MAX+50];
- char *info = NULL;
int ret = -1;
int paused = 0;
int status;
+ xmlURIPtr uribits = NULL;
unsigned long long transferred, remaining, total;
qemuDriverLock(driver);
@@ -6537,34 +6535,29 @@ qemudDomainMigratePerform (virDomainPtr dom,
goto cleanup;
/* Issue the migrate command. */
- safe_uri = qemudEscapeMonitorArg (uri);
- if (!safe_uri) {
- virReportOOMError (dom->conn);
- goto cleanup;
+ if (STRPREFIX(uri, "tcp:") && !STRPREFIX(uri, "tcp://"))
{
+ char *tmpuri;
+ if (virAsprintf(&tmpuri, "tcp://%s", uri +
strlen("tcp:")) < 0) {
+ virReportOOMError(dom->conn);
+ goto cleanup;
+ }
+ uribits = xmlParseURI(tmpuri);
+ VIR_FREE(tmpuri);
+ } else {
+ uribits = xmlParseURI(uri);
This is all new stuff and there's no explanation in the ChangeLog; not
sure why you're so keen to split up the URI only to re-construct it
again
It looks okay, though, just made it harder to review the patch
}
- snprintf (cmd, sizeof cmd, "migrate \"%s\"", safe_uri);
- VIR_FREE (safe_uri);
-
- if (qemudMonitorCommand (vm, cmd, &info) < 0) {
- qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
- "%s", _("migrate operation failed"));
+ if (!uribits) {
+ qemudReportError(dom->conn, dom, NULL, VIR_ERR_INTERNAL_ERROR,
+ _("cannot parse URI %s"), uri);
goto cleanup;
}
- DEBUG ("%s: migrate reply: %s", vm->def->name, info);
-
- /* Now check for "fail" in the output string */
- if (strstr(info, "fail") != NULL) {
- qemudReportError (dom->conn, dom, NULL, VIR_ERR_OPERATION_FAILED,
- _("migrate failed: %s"), info);
+ if (qemuMonitorMigrateToHost(vm, uribits->server, uribits->port) < 0)
goto cleanup;
- }
/* it is also possible that the migrate didn't fail initially, but
* rather failed later on. Check the output of "info migrate"
*/
- VIR_FREE(info);
-
if (qemuMonitorGetMigrationStatus(vm, &status,
&transferred,
&remaining,
@@ -6608,7 +6601,8 @@ cleanup:
VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
}
- VIR_FREE(info);
+ if (uribits)
+ xmlFreeURI(uribits);
if (vm)
virDomainObjUnlock(vm);
if (event)
diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c
index 0b746b9..4f8d72e 100644
--- a/src/qemu/qemu_monitor_text.c
+++ b/src/qemu/qemu_monitor_text.c
@@ -1088,3 +1088,59 @@ cleanup:
VIR_FREE(reply);
return ret;
}
+
+
+static int qemuMonitorMigrate(const virDomainObjPtr vm,
+ const char *dest)
+{
+ char *cmd = NULL;
+ char *info = NULL;
+ int ret = -1;
+
+ if (virAsprintf(&cmd, "migrate %s", cmd) < 0) {
Should be passing dest here
Fixed in the next patch, but would be good to get it right for
bisectability
Otherwise, ACK
Cheers,
Mark.