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
This commit is contained in:
Daniel P. Berrange 2010-06-24 14:58:36 -04:00
parent 755b53f946
commit 28e96d720b
7 changed files with 61 additions and 58 deletions

View File

@ -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://")) {

View File

@ -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;
}

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);

View File

@ -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);