From 28e96d720b4d426f4d41e7c6ef50dd4a52ca084f Mon Sep 17 00:00:00 2001 From: "Daniel P. Berrange" Date: Thu, 24 Jun 2010 14:58:36 -0400 Subject: [PATCH] Fix migration in text mode and shared storage migration in json mode The patches for shared storage migration were not correctly written for json mode. Thus the 'blk' and 'inc' parameters were never being set. In addition they didn't set the QEMU_MONITOR_MIGRATE_BACKGROUND so migration was synchronous. Due to multiple bugs in QEMU's JSON impl this wasn't noticed because it treated the sync migration requst as asynchronous anyway. Finally 'background' parameter was converted to take arbitrary flags but not renamed, and not all uses were changed to unsigned int. * src/qemu/qemu_driver.c: Set QEMU_MONITOR_MIGRATE_BACKGROUND in doNativeMigrate * src/qemu/qemu_monitor_json.c: Process QEMU_MONITOR_MIGRATE_NON_SHARED_DISK and QEMU_MONITOR_MIGRATE_NON_SHARED_INC flags * src/qemu/qemu_monitor.c, src/qemu/qemu_monitor.h, src/qemu/qemu_monitor_json.h, src/qemu/qemu_monitor_text.c, src/qemu/qemu_monitor_text.h: change 'int background' to 'unsigned int flags' in migration APIs. Add logging of flags parameter --- src/qemu/qemu_driver.c | 2 +- src/qemu/qemu_monitor.c | 40 ++++++++++++++++++------------------ src/qemu/qemu_monitor.h | 8 ++++---- src/qemu/qemu_monitor_json.c | 29 ++++++++++++++------------ src/qemu/qemu_monitor_json.h | 8 ++++---- src/qemu/qemu_monitor_text.c | 24 +++++++++++----------- src/qemu/qemu_monitor_text.h | 8 ++++---- 7 files changed, 61 insertions(+), 58 deletions(-) diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c index 6008c4e0b1..1257c70511 100644 --- a/src/qemu/qemu_driver.c +++ b/src/qemu/qemu_driver.c @@ -10590,7 +10590,7 @@ static int doNativeMigrate(struct qemud_driver *driver, int ret = -1; xmlURIPtr uribits = NULL; qemuDomainObjPrivatePtr priv = vm->privateData; - unsigned int background_flags = 0; + unsigned int background_flags = QEMU_MONITOR_MIGRATE_BACKGROUND; /* Issue the migrate command. */ if (STRPREFIX(uri, "tcp:") && !STRPREFIX(uri, "tcp://")) { diff --git a/src/qemu/qemu_monitor.c b/src/qemu/qemu_monitor.c index ea0351ea82..f428665f22 100644 --- a/src/qemu/qemu_monitor.c +++ b/src/qemu/qemu_monitor.c @@ -1299,13 +1299,13 @@ int qemuMonitorGetMigrationStatus(qemuMonitorPtr mon, int qemuMonitorMigrateToHost(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char *hostname, int port) { int ret; - DEBUG("mon=%p hostname=%s port=%d", - mon, hostname, port); + DEBUG("mon=%p hostname=%s port=%d flags=%u", + mon, hostname, port, flags); if (!mon) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", @@ -1314,20 +1314,20 @@ int qemuMonitorMigrateToHost(qemuMonitorPtr mon, } if (mon->json) - ret = qemuMonitorJSONMigrateToHost(mon, background, hostname, port); + ret = qemuMonitorJSONMigrateToHost(mon, flags, hostname, port); else - ret = qemuMonitorTextMigrateToHost(mon, background, hostname, port); + ret = qemuMonitorTextMigrateToHost(mon, flags, hostname, port); return ret; } int qemuMonitorMigrateToCommand(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char * const *argv) { int ret; - DEBUG("mon=%p argv=%p", - mon, argv); + DEBUG("mon=%p argv=%p flags=%u", + mon, argv, flags); if (!mon) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", @@ -1336,21 +1336,21 @@ int qemuMonitorMigrateToCommand(qemuMonitorPtr mon, } if (mon->json) - ret = qemuMonitorJSONMigrateToCommand(mon, background, argv); + ret = qemuMonitorJSONMigrateToCommand(mon, flags, argv); else - ret = qemuMonitorTextMigrateToCommand(mon, background, argv); + ret = qemuMonitorTextMigrateToCommand(mon, flags, argv); return ret; } int qemuMonitorMigrateToFile(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char * const *argv, const char *target, unsigned long long offset) { int ret; - DEBUG("mon=%p argv=%p target=%s offset=%llu", - mon, argv, target, offset); + DEBUG("mon=%p argv=%p target=%s offset=%llu flags=%u", + mon, argv, target, offset, flags); if (!mon) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", @@ -1366,19 +1366,19 @@ int qemuMonitorMigrateToFile(qemuMonitorPtr mon, } if (mon->json) - ret = qemuMonitorJSONMigrateToFile(mon, background, argv, target, offset); + ret = qemuMonitorJSONMigrateToFile(mon, flags, argv, target, offset); else - ret = qemuMonitorTextMigrateToFile(mon, background, argv, target, offset); + ret = qemuMonitorTextMigrateToFile(mon, flags, argv, target, offset); return ret; } int qemuMonitorMigrateToUnix(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char *unixfile) { int ret; - DEBUG("mon=%p, unixfile=%s", - mon, unixfile); + DEBUG("mon=%p, unixfile=%s flags=%u", + mon, unixfile, flags); if (!mon) { qemuReportError(VIR_ERR_INVALID_ARG, "%s", @@ -1387,9 +1387,9 @@ int qemuMonitorMigrateToUnix(qemuMonitorPtr mon, } if (mon->json) - ret = qemuMonitorJSONMigrateToUnix(mon, background, unixfile); + ret = qemuMonitorJSONMigrateToUnix(mon, flags, unixfile); else - ret = qemuMonitorTextMigrateToUnix(mon, background, unixfile); + ret = qemuMonitorTextMigrateToUnix(mon, flags, unixfile); return ret; } diff --git a/src/qemu/qemu_monitor.h b/src/qemu/qemu_monitor.h index b6a8f9f6c5..459ccb70bd 100644 --- a/src/qemu/qemu_monitor.h +++ b/src/qemu/qemu_monitor.h @@ -256,12 +256,12 @@ typedef enum { } QEMU_MONITOR_MIGRATE; int qemuMonitorMigrateToHost(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char *hostname, int port); int qemuMonitorMigrateToCommand(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char * const *argv); /* In general, BS is the smallest fundamental block size we can use to @@ -276,13 +276,13 @@ int qemuMonitorMigrateToCommand(qemuMonitorPtr mon, # define QEMU_MONITOR_MIGRATE_TO_FILE_TRANSFER_SIZE (1024llu * 1024) int qemuMonitorMigrateToFile(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char * const *argv, const char *target, unsigned long long offset); int qemuMonitorMigrateToUnix(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char *unixfile); int qemuMonitorMigrateCancel(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_monitor_json.c b/src/qemu/qemu_monitor_json.c index 40218aaf4e..01be86d258 100644 --- a/src/qemu/qemu_monitor_json.c +++ b/src/qemu/qemu_monitor_json.c @@ -1599,14 +1599,17 @@ int qemuMonitorJSONGetMigrationStatus(qemuMonitorPtr mon, static int qemuMonitorJSONMigrate(qemuMonitorPtr mon, - int background, + unsigned int flags, const char *uri) { int ret; - virJSONValuePtr cmd = qemuMonitorJSONMakeCommand("migrate", - "i:detach", background ? 1 : 0, - "s:uri", uri, - NULL); + virJSONValuePtr cmd = + qemuMonitorJSONMakeCommand("migrate", + "i:detach", flags & QEMU_MONITOR_MIGRATE_BACKGROUND ? 1 : 0, + "i:blk", flags & QEMU_MONITOR_MIGRATE_NON_SHARED_DISK ? 1 : 0, + "i:inc", flags & QEMU_MONITOR_MIGRATE_NON_SHARED_INC ? 1 : 0, + "s:uri", uri, + NULL); virJSONValuePtr reply = NULL; if (!cmd) @@ -1624,7 +1627,7 @@ static int qemuMonitorJSONMigrate(qemuMonitorPtr mon, int qemuMonitorJSONMigrateToHost(qemuMonitorPtr mon, - int background, + unsigned int flags, const char *hostname, int port) { @@ -1636,7 +1639,7 @@ int qemuMonitorJSONMigrateToHost(qemuMonitorPtr mon, return -1; } - ret = qemuMonitorJSONMigrate(mon, background, uri); + ret = qemuMonitorJSONMigrate(mon, flags, uri); VIR_FREE(uri); @@ -1645,7 +1648,7 @@ int qemuMonitorJSONMigrateToHost(qemuMonitorPtr mon, int qemuMonitorJSONMigrateToCommand(qemuMonitorPtr mon, - int background, + unsigned int flags, const char * const *argv) { char *argstr; @@ -1663,7 +1666,7 @@ int qemuMonitorJSONMigrateToCommand(qemuMonitorPtr mon, goto cleanup; } - ret = qemuMonitorJSONMigrate(mon, background, dest); + ret = qemuMonitorJSONMigrate(mon, flags, dest); cleanup: VIR_FREE(argstr); @@ -1672,7 +1675,7 @@ cleanup: } int qemuMonitorJSONMigrateToFile(qemuMonitorPtr mon, - int background, + unsigned int flags, const char * const *argv, const char *target, unsigned long long offset) @@ -1709,7 +1712,7 @@ int qemuMonitorJSONMigrateToFile(qemuMonitorPtr mon, goto cleanup; } - ret = qemuMonitorJSONMigrate(mon, background, dest); + ret = qemuMonitorJSONMigrate(mon, flags, dest); cleanup: VIR_FREE(safe_target); @@ -1719,7 +1722,7 @@ cleanup: } int qemuMonitorJSONMigrateToUnix(qemuMonitorPtr mon, - int background, + unsigned int flags, const char *unixfile) { char *dest = NULL; @@ -1730,7 +1733,7 @@ int qemuMonitorJSONMigrateToUnix(qemuMonitorPtr mon, return -1; } - ret = qemuMonitorJSONMigrate(mon, background, dest); + ret = qemuMonitorJSONMigrate(mon, flags, dest); VIR_FREE(dest); diff --git a/src/qemu/qemu_monitor_json.h b/src/qemu/qemu_monitor_json.h index c57821132e..6fa8d83549 100644 --- a/src/qemu/qemu_monitor_json.h +++ b/src/qemu/qemu_monitor_json.h @@ -97,22 +97,22 @@ int qemuMonitorJSONGetMigrationStatus(qemuMonitorPtr mon, unsigned long long *total); int qemuMonitorJSONMigrateToHost(qemuMonitorPtr mon, - int background, + unsigned int flags, const char *hostname, int port); int qemuMonitorJSONMigrateToCommand(qemuMonitorPtr mon, - int background, + unsigned int flags, const char * const *argv); int qemuMonitorJSONMigrateToFile(qemuMonitorPtr mon, - int background, + unsigned int flags, const char * const *argv, const char *target, unsigned long long offset); int qemuMonitorJSONMigrateToUnix(qemuMonitorPtr mon, - int background, + unsigned int flags, const char *unixfile); int qemuMonitorJSONMigrateCancel(qemuMonitorPtr mon); diff --git a/src/qemu/qemu_monitor_text.c b/src/qemu/qemu_monitor_text.c index c08696244f..569742a42d 100644 --- a/src/qemu/qemu_monitor_text.c +++ b/src/qemu/qemu_monitor_text.c @@ -1136,7 +1136,7 @@ cleanup: static int qemuMonitorTextMigrate(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char *dest) { char *cmd = NULL; @@ -1151,11 +1151,11 @@ static int qemuMonitorTextMigrate(qemuMonitorPtr mon, return -1; } - if (background & QEMU_MONITOR_MIGRATE_BACKGROUND) + if (flags & QEMU_MONITOR_MIGRATE_BACKGROUND) virBufferAddLit(&extra, " -d"); - if (background & QEMU_MONITOR_MIGRATE_NON_SHARED_DISK) + if (flags & QEMU_MONITOR_MIGRATE_NON_SHARED_DISK) virBufferAddLit(&extra, " -b"); - if (background & QEMU_MONITOR_MIGRATE_NON_SHARED_INC) + if (flags & QEMU_MONITOR_MIGRATE_NON_SHARED_INC) virBufferAddLit(&extra, " -i"); if (virBufferError(&extra)) { virBufferFreeAndReset(&extra); @@ -1202,7 +1202,7 @@ cleanup: } int qemuMonitorTextMigrateToHost(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char *hostname, int port) { @@ -1214,7 +1214,7 @@ int qemuMonitorTextMigrateToHost(qemuMonitorPtr mon, return -1; } - ret = qemuMonitorTextMigrate(mon, background, uri); + ret = qemuMonitorTextMigrate(mon, flags, uri); VIR_FREE(uri); @@ -1223,7 +1223,7 @@ int qemuMonitorTextMigrateToHost(qemuMonitorPtr mon, int qemuMonitorTextMigrateToCommand(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char * const *argv) { char *argstr; @@ -1241,7 +1241,7 @@ int qemuMonitorTextMigrateToCommand(qemuMonitorPtr mon, goto cleanup; } - ret = qemuMonitorTextMigrate(mon, background, dest); + ret = qemuMonitorTextMigrate(mon, flags, dest); cleanup: VIR_FREE(argstr); @@ -1250,7 +1250,7 @@ cleanup: } int qemuMonitorTextMigrateToFile(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char * const *argv, const char *target, unsigned long long offset) @@ -1287,7 +1287,7 @@ int qemuMonitorTextMigrateToFile(qemuMonitorPtr mon, goto cleanup; } - ret = qemuMonitorTextMigrate(mon, background, dest); + ret = qemuMonitorTextMigrate(mon, flags, dest); cleanup: VIR_FREE(safe_target); @@ -1297,7 +1297,7 @@ cleanup: } int qemuMonitorTextMigrateToUnix(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char *unixfile) { char *dest = NULL; @@ -1308,7 +1308,7 @@ int qemuMonitorTextMigrateToUnix(qemuMonitorPtr mon, return -1; } - ret = qemuMonitorTextMigrate(mon, background, dest); + ret = qemuMonitorTextMigrate(mon, flags, dest); VIR_FREE(dest); diff --git a/src/qemu/qemu_monitor_text.h b/src/qemu/qemu_monitor_text.h index 91eed84b06..9926d34723 100644 --- a/src/qemu/qemu_monitor_text.h +++ b/src/qemu/qemu_monitor_text.h @@ -95,22 +95,22 @@ int qemuMonitorTextGetMigrationStatus(qemuMonitorPtr mon, unsigned long long *total); int qemuMonitorTextMigrateToHost(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char *hostname, int port); int qemuMonitorTextMigrateToCommand(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char * const *argv); int qemuMonitorTextMigrateToFile(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char * const *argv, const char *target, unsigned long long offset); int qemuMonitorTextMigrateToUnix(qemuMonitorPtr mon, - unsigned int background, + unsigned int flags, const char *unixfile); int qemuMonitorTextMigrateCancel(qemuMonitorPtr mon);