提交 1853bd9d 编写于 作者: D Daniel P. Berrange

Fix error propagation in finish method for v3 migration

Even when failing to start CPUs, the finish method was returning
a success result. Fix this so that the QEMU process is killed
off when finish fails under v3 protocol. Also rename the
killOnFinish boolean to 'v3proto' to make it clearer that this
is a tunable based on the migration protocol version

* src/qemu/qemu_driver.c: Update for API change
* src/qemu/qemu_migration.c, src/qemu/qemu_migration.h: Kill
  VM in qemuMigrationFinish if failing to start CPUs
上级 b3367103
...@@ -5981,7 +5981,7 @@ qemudDomainMigratePerform (virDomainPtr dom, ...@@ -5981,7 +5981,7 @@ qemudDomainMigratePerform (virDomainPtr dom,
ret = qemuMigrationPerform(driver, dom->conn, vm, ret = qemuMigrationPerform(driver, dom->conn, vm,
NULL, dconnuri, uri, cookie, cookielen, NULL, dconnuri, uri, cookie, cookielen,
NULL, NULL, /* No output cookies in v2 */ NULL, NULL, /* No output cookies in v2 */
flags, dname, resource, true); flags, dname, resource, false);
cleanup: cleanup:
qemuDriverUnlock(driver); qemuDriverUnlock(driver);
...@@ -6030,7 +6030,7 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn, ...@@ -6030,7 +6030,7 @@ qemudDomainMigrateFinish2 (virConnectPtr dconn,
*/ */
dom = qemuMigrationFinish(driver, dconn, vm, dom = qemuMigrationFinish(driver, dconn, vm,
NULL, 0, NULL, NULL, /* No cookies */ NULL, 0, NULL, NULL, /* No cookies */
flags, retcode); flags, retcode, false);
cleanup: cleanup:
if (orig_err) { if (orig_err) {
...@@ -6232,7 +6232,7 @@ qemuDomainMigratePerform3(virDomainPtr dom, ...@@ -6232,7 +6232,7 @@ qemuDomainMigratePerform3(virDomainPtr dom,
ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin, ret = qemuMigrationPerform(driver, dom->conn, vm, xmlin,
dconnuri, uri, cookiein, cookieinlen, dconnuri, uri, cookiein, cookieinlen,
cookieout, cookieoutlen, cookieout, cookieoutlen,
flags, dname, resource, false); flags, dname, resource, true);
cleanup: cleanup:
qemuDriverUnlock(driver); qemuDriverUnlock(driver);
...@@ -6281,7 +6281,7 @@ qemuDomainMigrateFinish3(virConnectPtr dconn, ...@@ -6281,7 +6281,7 @@ qemuDomainMigrateFinish3(virConnectPtr dconn,
*newdom = qemuMigrationFinish(driver, dconn, vm, *newdom = qemuMigrationFinish(driver, dconn, vm,
cookiein, cookieinlen, cookiein, cookieinlen,
cookieout, cookieoutlen, cookieout, cookieoutlen,
flags, cancelled); flags, cancelled, true);
ret = 0; ret = 0;
......
...@@ -2047,7 +2047,7 @@ int qemuMigrationPerform(struct qemud_driver *driver, ...@@ -2047,7 +2047,7 @@ int qemuMigrationPerform(struct qemud_driver *driver,
unsigned long flags, unsigned long flags,
const char *dname, const char *dname,
unsigned long resource, unsigned long resource,
bool killOnFinish) bool v3proto)
{ {
virDomainEventPtr event = NULL; virDomainEventPtr event = NULL;
int ret = -1; int ret = -1;
...@@ -2092,8 +2092,13 @@ int qemuMigrationPerform(struct qemud_driver *driver, ...@@ -2092,8 +2092,13 @@ int qemuMigrationPerform(struct qemud_driver *driver,
goto endjob; goto endjob;
} }
/* Clean up the source domain. */ /*
if (killOnFinish) { * In v3 protocol, the source VM is not killed off until the
* confirm step.
*/
if (v3proto) {
resume = 0;
} else {
qemuProcessStop(driver, vm, 1, VIR_DOMAIN_SHUTOFF_MIGRATED); qemuProcessStop(driver, vm, 1, VIR_DOMAIN_SHUTOFF_MIGRATED);
qemuAuditDomainStop(vm, "migrated"); qemuAuditDomainStop(vm, "migrated");
resume = 0; resume = 0;
...@@ -2193,7 +2198,8 @@ qemuMigrationFinish(struct qemud_driver *driver, ...@@ -2193,7 +2198,8 @@ qemuMigrationFinish(struct qemud_driver *driver,
char **cookieout, char **cookieout,
int *cookieoutlen, int *cookieoutlen,
unsigned long flags, unsigned long flags,
int retcode) int retcode,
bool v3proto)
{ {
virDomainPtr dom = NULL; virDomainPtr dom = NULL;
virDomainEventPtr event = NULL; virDomainEventPtr event = NULL;
...@@ -2257,7 +2263,6 @@ qemuMigrationFinish(struct qemud_driver *driver, ...@@ -2257,7 +2263,6 @@ qemuMigrationFinish(struct qemud_driver *driver,
event = NULL; event = NULL;
} }
dom = virGetDomain (dconn, vm->def->name, vm->def->uuid);
if (!(flags & VIR_MIGRATE_PAUSED)) { if (!(flags & VIR_MIGRATE_PAUSED)) {
/* run 'cont' on the destination, which allows migration on qemu /* run 'cont' on the destination, which allows migration on qemu
...@@ -2266,6 +2271,26 @@ qemuMigrationFinish(struct qemud_driver *driver, ...@@ -2266,6 +2271,26 @@ qemuMigrationFinish(struct qemud_driver *driver,
*/ */
if (qemuProcessStartCPUs(driver, vm, dconn, if (qemuProcessStartCPUs(driver, vm, dconn,
VIR_DOMAIN_RUNNING_MIGRATED) < 0) { VIR_DOMAIN_RUNNING_MIGRATED) < 0) {
/*
* In v3 protocol, the source VM is still available to
* restart during confirm() step, so we kill it off
* now.
* In v2 protocol, the source is dead, so we leave
* target in paused state, in case admin can fix
* things up
*/
if (v3proto) {
qemuProcessStop(driver, vm, 1, VIR_DOMAIN_SHUTOFF_FAILED);
qemuAuditDomainStop(vm, "failed");
event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_STOPPED,
VIR_DOMAIN_EVENT_STOPPED_FAILED);
if (!vm->persistent) {
if (qemuDomainObjEndJob(vm) > 0)
virDomainRemoveInactive(&driver->domains, vm);
vm = NULL;
}
}
if (virGetLastError() == NULL) if (virGetLastError() == NULL)
qemuReportError(VIR_ERR_INTERNAL_ERROR, qemuReportError(VIR_ERR_INTERNAL_ERROR,
"%s", _("resume operation failed")); "%s", _("resume operation failed"));
...@@ -2273,6 +2298,8 @@ qemuMigrationFinish(struct qemud_driver *driver, ...@@ -2273,6 +2298,8 @@ qemuMigrationFinish(struct qemud_driver *driver,
} }
} }
dom = virGetDomain (dconn, vm->def->name, vm->def->uuid);
event = virDomainEventNewFromObj(vm, event = virDomainEventNewFromObj(vm,
VIR_DOMAIN_EVENT_RESUMED, VIR_DOMAIN_EVENT_RESUMED,
VIR_DOMAIN_EVENT_RESUMED_MIGRATED); VIR_DOMAIN_EVENT_RESUMED_MIGRATED);
......
...@@ -72,7 +72,7 @@ int qemuMigrationPerform(struct qemud_driver *driver, ...@@ -72,7 +72,7 @@ int qemuMigrationPerform(struct qemud_driver *driver,
unsigned long flags, unsigned long flags,
const char *dname, const char *dname,
unsigned long resource, unsigned long resource,
bool killOnFinish); bool v3proto);
virDomainPtr qemuMigrationFinish(struct qemud_driver *driver, virDomainPtr qemuMigrationFinish(struct qemud_driver *driver,
virConnectPtr dconn, virConnectPtr dconn,
...@@ -82,7 +82,8 @@ virDomainPtr qemuMigrationFinish(struct qemud_driver *driver, ...@@ -82,7 +82,8 @@ virDomainPtr qemuMigrationFinish(struct qemud_driver *driver,
char **cookieout, char **cookieout,
int *cookieoutlen, int *cookieoutlen,
unsigned long flags, unsigned long flags,
int retcode); int retcode,
bool v3proto);
int qemuMigrationConfirm(struct qemud_driver *driver, int qemuMigrationConfirm(struct qemud_driver *driver,
virConnectPtr conn, virConnectPtr conn,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册