提交 bbe60aac 编写于 作者: J Jiri Denemark

qemu: Store original migration params in job

Any job which touches migration parameters will first store their
original values (i.e., QEMU defaults) to qemuDomainJobObj to make it
easier to reset them back once the job finishes.
Signed-off-by: NJiri Denemark <jdenemar@redhat.com>
Reviewed-by: NJán Tomko <jtomko@redhat.com>
上级 e16f8539
...@@ -336,6 +336,8 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv) ...@@ -336,6 +336,8 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
job->dumpCompleted = false; job->dumpCompleted = false;
VIR_FREE(job->error); VIR_FREE(job->error);
VIR_FREE(job->current); VIR_FREE(job->current);
qemuMigrationParamsFree(job->migParams);
job->migParams = NULL;
} }
void void
...@@ -350,6 +352,7 @@ qemuDomainObjRestoreJob(virDomainObjPtr obj, ...@@ -350,6 +352,7 @@ qemuDomainObjRestoreJob(virDomainObjPtr obj,
job->asyncJob = priv->job.asyncJob; job->asyncJob = priv->job.asyncJob;
job->asyncOwner = priv->job.asyncOwner; job->asyncOwner = priv->job.asyncOwner;
job->phase = priv->job.phase; job->phase = priv->job.phase;
VIR_STEAL_PTR(job->migParams, priv->job.migParams);
qemuDomainObjResetJob(priv); qemuDomainObjResetJob(priv);
qemuDomainObjResetAsyncJob(priv); qemuDomainObjResetAsyncJob(priv);
......
...@@ -34,6 +34,7 @@ ...@@ -34,6 +34,7 @@
# include "qemu_agent.h" # include "qemu_agent.h"
# include "qemu_conf.h" # include "qemu_conf.h"
# include "qemu_capabilities.h" # include "qemu_capabilities.h"
# include "qemu_migration_params.h"
# include "virmdev.h" # include "virmdev.h"
# include "virchrdev.h" # include "virchrdev.h"
# include "virobject.h" # include "virobject.h"
...@@ -177,6 +178,8 @@ struct qemuDomainJobObj { ...@@ -177,6 +178,8 @@ struct qemuDomainJobObj {
bool postcopyEnabled; /* post-copy migration was enabled */ bool postcopyEnabled; /* post-copy migration was enabled */
char *error; /* job event completion error */ char *error; /* job event completion error */
bool dumpCompleted; /* dump completed */ bool dumpCompleted; /* dump completed */
qemuMigrationParamsPtr migParams;
}; };
typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver, typedef void (*qemuDomainCleanupCallback)(virQEMUDriverPtr driver,
......
...@@ -2448,6 +2448,9 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver, ...@@ -2448,6 +2448,9 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
dataFD[1] = -1; /* 'st' owns the FD now & will close it */ dataFD[1] = -1; /* 'st' owns the FD now & will close it */
} }
if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN) < 0)
goto stopjob;
if (qemuMigrationParamsSetCompression(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN, if (qemuMigrationParamsSetCompression(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
compression, migParams) < 0) compression, migParams) < 0)
goto stopjob; goto stopjob;
...@@ -4597,6 +4600,9 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver, ...@@ -4597,6 +4600,9 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
qemuMigrationSrcStoreDomainState(vm); qemuMigrationSrcStoreDomainState(vm);
if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
goto endjob;
if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) { if ((flags & (VIR_MIGRATE_TUNNELLED | VIR_MIGRATE_PEER2PEER))) {
ret = qemuMigrationSrcPerformPeer2Peer(driver, conn, vm, xmlin, persist_xml, ret = qemuMigrationSrcPerformPeer2Peer(driver, conn, vm, xmlin, persist_xml,
dconnuri, uri, graphicsuri, listenAddress, dconnuri, uri, graphicsuri, listenAddress,
...@@ -4700,6 +4706,9 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver, ...@@ -4700,6 +4706,9 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver,
virCloseCallbacksUnset(driver->closeCallbacks, vm, virCloseCallbacksUnset(driver->closeCallbacks, vm,
qemuMigrationSrcCleanup); qemuMigrationSrcCleanup);
if (qemuMigrationParamsCheck(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT) < 0)
goto endjob;
ret = qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri, cookiein, cookieinlen, ret = qemuMigrationSrcPerformNative(driver, vm, persist_xml, uri, cookiein, cookieinlen,
cookieout, cookieoutlen, cookieout, cookieoutlen,
flags, resource, NULL, graphicsuri, flags, resource, NULL, graphicsuri,
......
...@@ -428,6 +428,44 @@ qemuMigrationParamsResetTLS(virQEMUDriverPtr driver, ...@@ -428,6 +428,44 @@ qemuMigrationParamsResetTLS(virQEMUDriverPtr driver,
} }
/**
* qemuMigrationParamsCheck:
*
* Check supported migration parameters and keep their original values in
* qemuDomainJobObj so that we can properly reset them at the end of migration.
*/
int
qemuMigrationParamsCheck(virQEMUDriverPtr driver,
virDomainObjPtr vm,
int asyncJob)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
qemuMigrationParamsPtr origParams = NULL;
int ret = -1;
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
return -1;
if (!(origParams = qemuMigrationParamsNew()))
goto cleanup;
if (qemuMonitorGetMigrationParams(priv->mon, &origParams->params) < 0)
goto cleanup;
ret = 0;
cleanup:
if (qemuDomainObjExitMonitor(driver, vm) < 0)
ret = -1;
if (ret == 0)
VIR_STEAL_PTR(priv->job.migParams, origParams);
qemuMigrationParamsFree(origParams);
return ret;
}
/* /*
* qemuMigrationParamsReset: * qemuMigrationParamsReset:
* *
......
...@@ -100,6 +100,11 @@ qemuMigrationParamsSetCompression(virQEMUDriverPtr driver, ...@@ -100,6 +100,11 @@ qemuMigrationParamsSetCompression(virQEMUDriverPtr driver,
qemuMigrationCompressionPtr compression, qemuMigrationCompressionPtr compression,
qemuMigrationParamsPtr migParams); qemuMigrationParamsPtr migParams);
int
qemuMigrationParamsCheck(virQEMUDriverPtr driver,
virDomainObjPtr vm,
int asyncJob);
void void
qemuMigrationParamsReset(virQEMUDriverPtr driver, qemuMigrationParamsReset(virQEMUDriverPtr driver,
virDomainObjPtr vm, virDomainObjPtr vm,
......
Markdown is supported
0% .
You are about to add 0 people to the discussion. Proceed with caution.
先完成此消息的编辑!
想要评论请 注册