mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2024-11-05 04:41:20 +00:00
libxl: fix job handling across migration phases on src
The libxlDomainMigrationSrc* functions are a bit flawed in their handling of modify jobs. A job begins at the start of the begin phase but ends before the phase completes. No job is running for the remaining phases of migration on the source host. Change the logic to keep the job running after a successful begin phase, and end the job in the confirm phase. The job must also end in the perform phase in the case of error since confirm phase would not be executed. Signed-off-by: Jim Fehlig <jfehlig@suse.com> ACKed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
e39c66d3ce
commit
47da84e090
@ -399,6 +399,11 @@ libxlDomainMigrationSrcBegin(virConnectPtr conn,
|
|||||||
virDomainDefPtr def;
|
virDomainDefPtr def;
|
||||||
char *xml = NULL;
|
char *xml = NULL;
|
||||||
|
|
||||||
|
/*
|
||||||
|
* In the case of successful migration, a job is started here and
|
||||||
|
* terminated in the confirm phase. Errors in the begin or perform
|
||||||
|
* phase will also terminate the job.
|
||||||
|
*/
|
||||||
if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
|
if (libxlDomainObjBeginJob(driver, vm, LIBXL_JOB_MODIFY) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
@ -428,6 +433,9 @@ libxlDomainMigrationSrcBegin(virConnectPtr conn,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
|
|
||||||
xml = virDomainDefFormat(def, cfg->caps, VIR_DOMAIN_DEF_FORMAT_SECURE);
|
xml = virDomainDefFormat(def, cfg->caps, VIR_DOMAIN_DEF_FORMAT_SECURE);
|
||||||
|
/* Valid xml means success! EndJob in the confirm phase */
|
||||||
|
if (xml)
|
||||||
|
goto cleanup;
|
||||||
|
|
||||||
endjob:
|
endjob:
|
||||||
libxlDomainObjEndJob(driver, vm);
|
libxlDomainObjEndJob(driver, vm);
|
||||||
@ -1169,6 +1177,14 @@ libxlDomainMigrationSrcPerformP2P(libxlDriverPrivatePtr driver,
|
|||||||
ret = libxlDoMigrateSrcP2P(driver, vm, sconn, xmlin, dconn, dconnuri,
|
ret = libxlDoMigrateSrcP2P(driver, vm, sconn, xmlin, dconn, dconnuri,
|
||||||
dname, uri_str, flags);
|
dname, uri_str, flags);
|
||||||
|
|
||||||
|
if (ret < 0) {
|
||||||
|
/*
|
||||||
|
* Confirm phase will not be executed if perform fails. End the
|
||||||
|
* job started in begin phase.
|
||||||
|
*/
|
||||||
|
libxlDomainObjEndJob(driver, vm);
|
||||||
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
orig_err = virSaveLastError();
|
orig_err = virSaveLastError();
|
||||||
virObjectUnlock(vm);
|
virObjectUnlock(vm);
|
||||||
@ -1232,11 +1248,17 @@ libxlDomainMigrationSrcPerform(libxlDriverPrivatePtr driver,
|
|||||||
ret = libxlDoMigrateSrcSend(driver, vm, flags, sockfd);
|
ret = libxlDoMigrateSrcSend(driver, vm, flags, sockfd);
|
||||||
virObjectLock(vm);
|
virObjectLock(vm);
|
||||||
|
|
||||||
if (ret < 0)
|
if (ret < 0) {
|
||||||
virDomainLockProcessResume(driver->lockManager,
|
virDomainLockProcessResume(driver->lockManager,
|
||||||
"xen:///system",
|
"xen:///system",
|
||||||
vm,
|
vm,
|
||||||
priv->lockState);
|
priv->lockState);
|
||||||
|
/*
|
||||||
|
* Confirm phase will not be executed if perform fails. End the
|
||||||
|
* job started in begin phase.
|
||||||
|
*/
|
||||||
|
libxlDomainObjEndJob(driver, vm);
|
||||||
|
}
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
VIR_FORCE_CLOSE(sockfd);
|
VIR_FORCE_CLOSE(sockfd);
|
||||||
@ -1386,6 +1408,8 @@ libxlDomainMigrationSrcConfirm(libxlDriverPrivatePtr driver,
|
|||||||
ret = 0;
|
ret = 0;
|
||||||
|
|
||||||
cleanup:
|
cleanup:
|
||||||
|
/* EndJob for corresponding BeginJob in begin phase */
|
||||||
|
libxlDomainObjEndJob(driver, vm);
|
||||||
virObjectEventStateQueue(driver->domainEventState, event);
|
virObjectEventStateQueue(driver->domainEventState, event);
|
||||||
virObjectUnref(cfg);
|
virObjectUnref(cfg);
|
||||||
return ret;
|
return ret;
|
||||||
|
Loading…
Reference in New Issue
Block a user