mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-02-22 19:32:19 +00:00
qemu_domainjob: introduce privateData
for qemuDomainJob
To remove dependecy of `qemuDomainJob` on job specific paramters, a `privateData` pointer is introduced. To handle it, structure of callback functions is also introduced. Signed-off-by: Prathamesh Chavan <pc44800@gmail.com> Signed-off-by: Michal Privoznik <mprivozn@redhat.com> Reviewed-by: Michal Privoznik <mprivozn@redhat.com>
This commit is contained in:
parent
a9f1ac3a97
commit
aca37c3fb2
@ -88,6 +88,74 @@ VIR_ENUM_IMPL(qemuDomainNamespace,
|
||||
"mount",
|
||||
);
|
||||
|
||||
|
||||
static void *
|
||||
qemuJobAllocPrivate(void)
|
||||
{
|
||||
return g_new0(qemuDomainJobPrivate, 1);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
qemuJobFreePrivate(void *opaque)
|
||||
{
|
||||
qemuDomainJobPrivatePtr priv = opaque;
|
||||
|
||||
if (!priv)
|
||||
return;
|
||||
|
||||
qemuMigrationParamsFree(priv->migParams);
|
||||
VIR_FREE(priv);
|
||||
}
|
||||
|
||||
|
||||
static void
|
||||
qemuJobResetPrivate(void *opaque)
|
||||
{
|
||||
qemuDomainJobPrivatePtr priv = opaque;
|
||||
|
||||
priv->spiceMigration = false;
|
||||
priv->spiceMigrated = false;
|
||||
priv->dumpCompleted = false;
|
||||
qemuMigrationParamsFree(priv->migParams);
|
||||
priv->migParams = NULL;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuDomainFormatJobPrivate(virBufferPtr buf,
|
||||
qemuDomainJobObjPtr job)
|
||||
{
|
||||
qemuDomainJobPrivatePtr priv = job->privateData;
|
||||
|
||||
if (priv->migParams)
|
||||
qemuMigrationParamsFormat(buf, priv->migParams);
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static int
|
||||
qemuDomainParseJobPrivate(xmlXPathContextPtr ctxt,
|
||||
qemuDomainJobObjPtr job)
|
||||
{
|
||||
qemuDomainJobPrivatePtr priv = job->privateData;
|
||||
|
||||
if (qemuMigrationParamsParse(ctxt, &priv->migParams) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
static qemuDomainObjPrivateJobCallbacks qemuPrivateJobCallbacks = {
|
||||
.allocJobPrivate = qemuJobAllocPrivate,
|
||||
.freeJobPrivate = qemuJobFreePrivate,
|
||||
.resetJobPrivate = qemuJobResetPrivate,
|
||||
.formatJob = qemuDomainFormatJobPrivate,
|
||||
.parseJob = qemuDomainParseJobPrivate,
|
||||
};
|
||||
|
||||
/**
|
||||
* qemuDomainObjFromDomain:
|
||||
* @domain: Domain pointer that has to be looked up
|
||||
@ -1585,7 +1653,7 @@ qemuDomainObjPrivateAlloc(void *opaque)
|
||||
if (VIR_ALLOC(priv) < 0)
|
||||
return NULL;
|
||||
|
||||
if (qemuDomainObjInitJob(&priv->job) < 0) {
|
||||
if (qemuDomainObjInitJob(&priv->job, &qemuPrivateJobCallbacks) < 0) {
|
||||
virReportSystemError(errno, "%s",
|
||||
_("Unable to init qemu driver mutexes"));
|
||||
goto error;
|
||||
|
@ -492,6 +492,16 @@ struct _qemuDomainXmlNsDef {
|
||||
char **capsdel;
|
||||
};
|
||||
|
||||
typedef struct _qemuDomainJobPrivate qemuDomainJobPrivate;
|
||||
typedef qemuDomainJobPrivate *qemuDomainJobPrivatePtr;
|
||||
struct _qemuDomainJobPrivate {
|
||||
bool spiceMigration; /* we asked for spice migration and we
|
||||
* should wait for it to finish */
|
||||
bool spiceMigrated; /* spice migration completed */
|
||||
bool dumpCompleted; /* dump completed */
|
||||
qemuMigrationParamsPtr migParams;
|
||||
};
|
||||
|
||||
int qemuDomainObjStartWorker(virDomainObjPtr dom);
|
||||
void qemuDomainObjStopWorker(virDomainObjPtr dom);
|
||||
|
||||
|
@ -161,14 +161,22 @@ qemuDomainEventEmitJobCompleted(virQEMUDriverPtr driver,
|
||||
|
||||
|
||||
int
|
||||
qemuDomainObjInitJob(qemuDomainJobObjPtr job)
|
||||
qemuDomainObjInitJob(qemuDomainJobObjPtr job,
|
||||
qemuDomainObjPrivateJobCallbacksPtr cb)
|
||||
{
|
||||
memset(job, 0, sizeof(*job));
|
||||
job->cb = cb;
|
||||
|
||||
if (virCondInit(&job->cond) < 0)
|
||||
if (!(job->privateData = job->cb->allocJobPrivate()))
|
||||
return -1;
|
||||
|
||||
if (virCondInit(&job->cond) < 0) {
|
||||
job->cb->freeJobPrivate(job->privateData);
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (virCondInit(&job->asyncCond) < 0) {
|
||||
job->cb->freeJobPrivate(job->privateData);
|
||||
virCondDestroy(&job->cond);
|
||||
return -1;
|
||||
}
|
||||
@ -207,17 +215,13 @@ qemuDomainObjResetAsyncJob(qemuDomainJobObjPtr job)
|
||||
job->phase = 0;
|
||||
job->mask = QEMU_JOB_DEFAULT_MASK;
|
||||
job->abortJob = false;
|
||||
job->spiceMigration = false;
|
||||
job->spiceMigrated = false;
|
||||
job->dumpCompleted = false;
|
||||
VIR_FREE(job->error);
|
||||
g_clear_pointer(&job->current, qemuDomainJobInfoFree);
|
||||
qemuMigrationParamsFree(job->migParams);
|
||||
job->migParams = NULL;
|
||||
job->cb->resetJobPrivate(job->privateData);
|
||||
job->apiFlags = 0;
|
||||
}
|
||||
|
||||
void
|
||||
int
|
||||
qemuDomainObjRestoreJob(virDomainObjPtr obj,
|
||||
qemuDomainJobObjPtr job)
|
||||
{
|
||||
@ -229,11 +233,16 @@ qemuDomainObjRestoreJob(virDomainObjPtr obj,
|
||||
job->asyncJob = priv->job.asyncJob;
|
||||
job->asyncOwner = priv->job.asyncOwner;
|
||||
job->phase = priv->job.phase;
|
||||
job->migParams = g_steal_pointer(&priv->job.migParams);
|
||||
job->privateData = g_steal_pointer(&priv->job.privateData);
|
||||
job->apiFlags = priv->job.apiFlags;
|
||||
|
||||
if (!(priv->job.privateData = priv->job.cb->allocJobPrivate()))
|
||||
return -1;
|
||||
job->cb = priv->job.cb;
|
||||
|
||||
qemuDomainObjResetJob(&priv->job);
|
||||
qemuDomainObjResetAsyncJob(&priv->job);
|
||||
return 0;
|
||||
}
|
||||
|
||||
void
|
||||
@ -241,6 +250,7 @@ qemuDomainObjFreeJob(qemuDomainJobObjPtr job)
|
||||
{
|
||||
qemuDomainObjResetJob(job);
|
||||
qemuDomainObjResetAsyncJob(job);
|
||||
job->cb->freeJobPrivate(job->privateData);
|
||||
g_clear_pointer(&job->current, qemuDomainJobInfoFree);
|
||||
g_clear_pointer(&job->completed, qemuDomainJobInfoFree);
|
||||
virCondDestroy(&job->cond);
|
||||
@ -1239,14 +1249,14 @@ qemuDomainObjPrivateXMLFormatNBDMigration(virBufferPtr buf,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf,
|
||||
virDomainObjPtr vm)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobObjPtr jobObj = &priv->job;
|
||||
g_auto(virBuffer) attrBuf = VIR_BUFFER_INITIALIZER;
|
||||
g_auto(virBuffer) childBuf = VIR_BUFFER_INIT_CHILD(buf);
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJob job = priv->job.active;
|
||||
|
||||
if (!qemuDomainTrackJob(job))
|
||||
@ -1273,8 +1283,8 @@ qemuDomainObjPrivateXMLFormatJob(virBufferPtr buf,
|
||||
qemuDomainObjPrivateXMLFormatNBDMigration(&childBuf, vm) < 0)
|
||||
return -1;
|
||||
|
||||
if (priv->job.migParams)
|
||||
qemuMigrationParamsFormat(&childBuf, priv->job.migParams);
|
||||
if (jobObj->cb->formatJob(&childBuf, jobObj) < 0)
|
||||
return -1;
|
||||
|
||||
virXMLFormatElement(buf, "job", &attrBuf, &childBuf);
|
||||
|
||||
@ -1366,12 +1376,12 @@ qemuDomainObjPrivateXMLParseJobNBD(virDomainObjPtr vm,
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
||||
int
|
||||
qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm,
|
||||
xmlXPathContextPtr ctxt)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobObjPtr job = &priv->job;
|
||||
VIR_XPATH_NODE_AUTORESTORE(ctxt);
|
||||
g_autofree char *tmp = NULL;
|
||||
|
||||
@ -1420,7 +1430,7 @@ qemuDomainObjPrivateXMLParseJob(virDomainObjPtr vm,
|
||||
if (qemuDomainObjPrivateXMLParseJobNBD(vm, ctxt) < 0)
|
||||
return -1;
|
||||
|
||||
if (qemuMigrationParamsParse(ctxt, &priv->job.migParams) < 0)
|
||||
if (job->cb->parseJob(ctxt, job) < 0)
|
||||
return -1;
|
||||
|
||||
return 0;
|
||||
|
@ -19,7 +19,7 @@
|
||||
#pragma once
|
||||
|
||||
#include <glib-object.h>
|
||||
#include "qemu_migration_params.h"
|
||||
#include "qemu_monitor.h"
|
||||
|
||||
#define JOB_MASK(job) (job == 0 ? 0 : 1 << (job - 1))
|
||||
#define QEMU_JOB_DEFAULT_MASK \
|
||||
@ -156,6 +156,25 @@ qemuDomainJobInfoCopy(qemuDomainJobInfoPtr info);
|
||||
|
||||
typedef struct _qemuDomainJobObj qemuDomainJobObj;
|
||||
typedef qemuDomainJobObj *qemuDomainJobObjPtr;
|
||||
|
||||
typedef void *(*qemuDomainObjPrivateJobAlloc)(void);
|
||||
typedef void (*qemuDomainObjPrivateJobFree)(void *);
|
||||
typedef void (*qemuDomainObjPrivateJobReset)(void *);
|
||||
typedef int (*qemuDomainObjPrivateJobFormat)(virBufferPtr,
|
||||
qemuDomainJobObjPtr);
|
||||
typedef int (*qemuDomainObjPrivateJobParse)(xmlXPathContextPtr,
|
||||
qemuDomainJobObjPtr);
|
||||
|
||||
typedef struct _qemuDomainObjPrivateJobCallbacks qemuDomainObjPrivateJobCallbacks;
|
||||
typedef qemuDomainObjPrivateJobCallbacks *qemuDomainObjPrivateJobCallbacksPtr;
|
||||
struct _qemuDomainObjPrivateJobCallbacks {
|
||||
qemuDomainObjPrivateJobAlloc allocJobPrivate;
|
||||
qemuDomainObjPrivateJobFree freeJobPrivate;
|
||||
qemuDomainObjPrivateJobReset resetJobPrivate;
|
||||
qemuDomainObjPrivateJobFormat formatJob;
|
||||
qemuDomainObjPrivateJobParse parseJob;
|
||||
};
|
||||
|
||||
struct _qemuDomainJobObj {
|
||||
virCond cond; /* Use to coordinate jobs */
|
||||
|
||||
@ -182,14 +201,11 @@ struct _qemuDomainJobObj {
|
||||
qemuDomainJobInfoPtr current; /* async job progress data */
|
||||
qemuDomainJobInfoPtr completed; /* statistics data of a recently completed job */
|
||||
bool abortJob; /* abort of the job requested */
|
||||
bool spiceMigration; /* we asked for spice migration and we
|
||||
* should wait for it to finish */
|
||||
bool spiceMigrated; /* spice migration completed */
|
||||
char *error; /* job event completion error */
|
||||
bool dumpCompleted; /* dump completed */
|
||||
|
||||
qemuMigrationParamsPtr migParams;
|
||||
unsigned long apiFlags; /* flags passed to the API which started the async job */
|
||||
|
||||
void *privateData; /* job specific collection of data */
|
||||
qemuDomainObjPrivateJobCallbacksPtr cb;
|
||||
};
|
||||
|
||||
const char *qemuDomainAsyncJobPhaseToString(qemuDomainAsyncJob job,
|
||||
@ -234,8 +250,8 @@ void qemuDomainObjSetJobPhase(virQEMUDriverPtr driver,
|
||||
int phase);
|
||||
void qemuDomainObjSetAsyncJobMask(virDomainObjPtr obj,
|
||||
unsigned long long allowedJobs);
|
||||
void qemuDomainObjRestoreJob(virDomainObjPtr obj,
|
||||
qemuDomainJobObjPtr job);
|
||||
int qemuDomainObjRestoreJob(virDomainObjPtr obj,
|
||||
qemuDomainJobObjPtr job);
|
||||
void qemuDomainObjDiscardAsyncJob(virQEMUDriverPtr driver,
|
||||
virDomainObjPtr obj);
|
||||
void qemuDomainObjReleaseAsyncJob(virDomainObjPtr obj);
|
||||
@ -264,7 +280,9 @@ bool qemuDomainTrackJob(qemuDomainJob job);
|
||||
|
||||
void qemuDomainObjFreeJob(qemuDomainJobObjPtr job);
|
||||
|
||||
int qemuDomainObjInitJob(qemuDomainJobObjPtr job);
|
||||
int
|
||||
qemuDomainObjInitJob(qemuDomainJobObjPtr job,
|
||||
qemuDomainObjPrivateJobCallbacksPtr cb);
|
||||
|
||||
bool qemuDomainJobAllowed(qemuDomainJobObjPtr jobs, qemuDomainJob newJob);
|
||||
|
||||
|
@ -3701,9 +3701,10 @@ static int
|
||||
qemuDumpWaitForCompletion(virDomainObjPtr vm)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
|
||||
VIR_DEBUG("Waiting for dump completion");
|
||||
while (!priv->job.dumpCompleted && !priv->job.abortJob) {
|
||||
while (!jobPriv->dumpCompleted && !priv->job.abortJob) {
|
||||
if (virDomainObjWait(vm) < 0)
|
||||
return -1;
|
||||
}
|
||||
|
@ -1422,12 +1422,13 @@ static int
|
||||
qemuMigrationSrcWaitForSpice(virDomainObjPtr vm)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
|
||||
if (!priv->job.spiceMigration)
|
||||
if (!jobPriv->spiceMigration)
|
||||
return 0;
|
||||
|
||||
VIR_DEBUG("Waiting for SPICE to finish migration");
|
||||
while (!priv->job.spiceMigrated && !priv->job.abortJob) {
|
||||
while (!jobPriv->spiceMigrated && !priv->job.abortJob) {
|
||||
if (virDomainObjWait(vm) < 0)
|
||||
return -1;
|
||||
}
|
||||
@ -1856,9 +1857,11 @@ qemuMigrationSrcGraphicsRelocate(virQEMUDriverPtr driver,
|
||||
|
||||
if (qemuDomainObjEnterMonitorAsync(driver, vm,
|
||||
QEMU_ASYNC_JOB_MIGRATION_OUT) == 0) {
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
|
||||
ret = qemuMonitorGraphicsRelocate(priv->mon, type, listenAddress,
|
||||
port, tlsPort, tlsSubject);
|
||||
priv->job.spiceMigration = !ret;
|
||||
jobPriv->spiceMigration = !ret;
|
||||
if (qemuDomainObjExitMonitor(driver, vm) < 0)
|
||||
ret = -1;
|
||||
}
|
||||
@ -1993,6 +1996,7 @@ qemuMigrationSrcCleanup(virDomainObjPtr vm,
|
||||
{
|
||||
virQEMUDriverPtr driver = opaque;
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
|
||||
VIR_DEBUG("vm=%s, conn=%p, asyncJob=%s, phase=%s",
|
||||
vm->def->name, conn,
|
||||
@ -2018,7 +2022,7 @@ qemuMigrationSrcCleanup(virDomainObjPtr vm,
|
||||
" domain was successfully started on destination or not",
|
||||
vm->def->name);
|
||||
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||
priv->job.migParams, priv->job.apiFlags);
|
||||
jobPriv->migParams, priv->job.apiFlags);
|
||||
/* clear the job and let higher levels decide what to do */
|
||||
qemuDomainObjDiscardAsyncJob(driver, vm);
|
||||
break;
|
||||
@ -2382,6 +2386,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
|
||||
int dataFD[2] = { -1, -1 };
|
||||
qemuDomainObjPrivatePtr priv = NULL;
|
||||
qemuMigrationCookiePtr mig = NULL;
|
||||
qemuDomainJobPrivatePtr jobPriv = NULL;
|
||||
bool tunnel = !!st;
|
||||
g_autofree char *xmlout = NULL;
|
||||
unsigned int cookieFlags;
|
||||
@ -2505,6 +2510,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
|
||||
*def = NULL;
|
||||
|
||||
priv = vm->privateData;
|
||||
jobPriv = priv->job.privateData;
|
||||
priv->origname = g_strdup(origname);
|
||||
|
||||
if (taint_hook) {
|
||||
@ -2710,7 +2716,7 @@ qemuMigrationDstPrepareAny(virQEMUDriverPtr driver,
|
||||
|
||||
stopjob:
|
||||
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
|
||||
priv->job.migParams, priv->job.apiFlags);
|
||||
jobPriv->migParams, priv->job.apiFlags);
|
||||
|
||||
if (stopProcess) {
|
||||
unsigned int stopFlags = VIR_QEMU_PROCESS_STOP_MIGRATED;
|
||||
@ -2979,6 +2985,7 @@ qemuMigrationSrcConfirmPhase(virQEMUDriverPtr driver,
|
||||
virObjectEventPtr event;
|
||||
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
qemuDomainJobInfoPtr jobInfo = NULL;
|
||||
|
||||
VIR_DEBUG("driver=%p, vm=%p, cookiein=%s, cookieinlen=%d, "
|
||||
@ -3064,7 +3071,7 @@ qemuMigrationSrcConfirmPhase(virQEMUDriverPtr driver,
|
||||
qemuMigrationSrcRestoreDomainState(driver, vm);
|
||||
|
||||
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||
priv->job.migParams, priv->job.apiFlags);
|
||||
jobPriv->migParams, priv->job.apiFlags);
|
||||
|
||||
if (virDomainObjSave(vm, driver->xmlopt, cfg->stateDir) < 0)
|
||||
VIR_WARN("Failed to save status on vm %s", vm->def->name);
|
||||
@ -4642,6 +4649,7 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
|
||||
virErrorPtr orig_err = NULL;
|
||||
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
|
||||
if (qemuMigrationJobStart(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||
flags) < 0)
|
||||
@ -4699,7 +4707,7 @@ qemuMigrationSrcPerformJob(virQEMUDriverPtr driver,
|
||||
*/
|
||||
if (!v3proto && ret < 0)
|
||||
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||
priv->job.migParams, priv->job.apiFlags);
|
||||
jobPriv->migParams, priv->job.apiFlags);
|
||||
|
||||
qemuMigrationSrcRestoreDomainState(driver, vm);
|
||||
|
||||
@ -4740,6 +4748,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver,
|
||||
unsigned long resource)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
int ret = -1;
|
||||
|
||||
/* If we didn't start the job in the begin phase, start it now. */
|
||||
@ -4774,7 +4783,7 @@ qemuMigrationSrcPerformPhase(virQEMUDriverPtr driver,
|
||||
endjob:
|
||||
if (ret < 0) {
|
||||
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_OUT,
|
||||
priv->job.migParams, priv->job.apiFlags);
|
||||
jobPriv->migParams, priv->job.apiFlags);
|
||||
qemuMigrationJobFinish(driver, vm);
|
||||
} else {
|
||||
qemuMigrationJobContinue(vm);
|
||||
@ -4973,6 +4982,7 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver,
|
||||
virErrorPtr orig_err = NULL;
|
||||
int cookie_flags = 0;
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
||||
unsigned short port;
|
||||
unsigned long long timeReceived = 0;
|
||||
@ -5226,7 +5236,7 @@ qemuMigrationDstFinish(virQEMUDriverPtr driver,
|
||||
}
|
||||
|
||||
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_MIGRATION_IN,
|
||||
priv->job.migParams, priv->job.apiFlags);
|
||||
jobPriv->migParams, priv->job.apiFlags);
|
||||
|
||||
qemuMigrationJobFinish(driver, vm);
|
||||
if (!virDomainObjIsActive(vm))
|
||||
|
@ -950,6 +950,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
|
||||
qemuMigrationParamsPtr migParams)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
g_autoptr(virJSONValue) tlsProps = NULL;
|
||||
g_autoptr(virJSONValue) secProps = NULL;
|
||||
g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(driver);
|
||||
@ -961,7 +962,7 @@ qemuMigrationParamsEnableTLS(virQEMUDriverPtr driver,
|
||||
return -1;
|
||||
}
|
||||
|
||||
if (!priv->job.migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set) {
|
||||
if (!jobPriv->migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set) {
|
||||
virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",
|
||||
_("TLS migration is not supported with this "
|
||||
"QEMU binary"));
|
||||
@ -1025,8 +1026,9 @@ qemuMigrationParamsDisableTLS(virDomainObjPtr vm,
|
||||
qemuMigrationParamsPtr migParams)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
|
||||
if (!priv->job.migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set)
|
||||
if (!jobPriv->migParams->params[QEMU_MIGRATION_PARAM_TLS_CREDS].set)
|
||||
return 0;
|
||||
|
||||
if (qemuMigrationParamsSetString(migParams,
|
||||
@ -1150,6 +1152,7 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
|
||||
virBitmapPtr remoteCaps)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv = vm->privateData;
|
||||
qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
|
||||
qemuMigrationCapability cap;
|
||||
qemuMigrationParty party;
|
||||
size_t i;
|
||||
@ -1203,7 +1206,7 @@ qemuMigrationParamsCheck(virQEMUDriverPtr driver,
|
||||
* to ask QEMU for their current settings.
|
||||
*/
|
||||
|
||||
return qemuMigrationParamsFetch(driver, vm, asyncJob, &priv->job.migParams);
|
||||
return qemuMigrationParamsFetch(driver, vm, asyncJob, &jobPriv->migParams);
|
||||
}
|
||||
|
||||
|
||||
|
@ -1608,6 +1608,7 @@ qemuProcessHandleSpiceMigrated(qemuMonitorPtr mon G_GNUC_UNUSED,
|
||||
void *opaque G_GNUC_UNUSED)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv;
|
||||
qemuDomainJobPrivatePtr jobPriv;
|
||||
|
||||
virObjectLock(vm);
|
||||
|
||||
@ -1615,12 +1616,13 @@ qemuProcessHandleSpiceMigrated(qemuMonitorPtr mon G_GNUC_UNUSED,
|
||||
vm, vm->def->name);
|
||||
|
||||
priv = vm->privateData;
|
||||
jobPriv = priv->job.privateData;
|
||||
if (priv->job.asyncJob != QEMU_ASYNC_JOB_MIGRATION_OUT) {
|
||||
VIR_DEBUG("got SPICE_MIGRATE_COMPLETED event without a migration job");
|
||||
goto cleanup;
|
||||
}
|
||||
|
||||
priv->job.spiceMigrated = true;
|
||||
jobPriv->spiceMigrated = true;
|
||||
virDomainObjBroadcast(vm);
|
||||
|
||||
cleanup:
|
||||
@ -1720,6 +1722,7 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon G_GNUC_UNUSED,
|
||||
void *opaque G_GNUC_UNUSED)
|
||||
{
|
||||
qemuDomainObjPrivatePtr priv;
|
||||
qemuDomainJobPrivatePtr jobPriv;
|
||||
|
||||
virObjectLock(vm);
|
||||
|
||||
@ -1727,11 +1730,12 @@ qemuProcessHandleDumpCompleted(qemuMonitorPtr mon G_GNUC_UNUSED,
|
||||
vm, vm->def->name, stats, NULLSTR(error));
|
||||
|
||||
priv = vm->privateData;
|
||||
jobPriv = priv->job.privateData;
|
||||
if (priv->job.asyncJob == QEMU_ASYNC_JOB_NONE) {
|
||||
VIR_DEBUG("got DUMP_COMPLETED event without a dump_completed job");
|
||||
goto cleanup;
|
||||
}
|
||||
priv->job.dumpCompleted = true;
|
||||
jobPriv->dumpCompleted = true;
|
||||
priv->job.current->stats.dump = *stats;
|
||||
priv->job.error = g_strdup(error);
|
||||
|
||||
@ -3411,6 +3415,8 @@ qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver,
|
||||
virDomainState state,
|
||||
int reason)
|
||||
{
|
||||
|
||||
qemuDomainJobPrivatePtr jobPriv = job->privateData;
|
||||
bool postcopy = (state == VIR_DOMAIN_PAUSED &&
|
||||
reason == VIR_DOMAIN_PAUSED_POSTCOPY_FAILED) ||
|
||||
(state == VIR_DOMAIN_RUNNING &&
|
||||
@ -3459,7 +3465,7 @@ qemuProcessRecoverMigrationIn(virQEMUDriverPtr driver,
|
||||
}
|
||||
|
||||
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_NONE,
|
||||
job->migParams, job->apiFlags);
|
||||
jobPriv->migParams, job->apiFlags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
@ -3471,6 +3477,7 @@ qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver,
|
||||
int reason,
|
||||
unsigned int *stopFlags)
|
||||
{
|
||||
qemuDomainJobPrivatePtr jobPriv = job->privateData;
|
||||
bool postcopy = state == VIR_DOMAIN_PAUSED &&
|
||||
(reason == VIR_DOMAIN_PAUSED_POSTCOPY ||
|
||||
reason == VIR_DOMAIN_PAUSED_POSTCOPY_FAILED);
|
||||
@ -3554,7 +3561,7 @@ qemuProcessRecoverMigrationOut(virQEMUDriverPtr driver,
|
||||
}
|
||||
|
||||
qemuMigrationParamsReset(driver, vm, QEMU_ASYNC_JOB_NONE,
|
||||
job->migParams, job->apiFlags);
|
||||
jobPriv->migParams, job->apiFlags);
|
||||
return 0;
|
||||
}
|
||||
|
||||
|
Loading…
x
Reference in New Issue
Block a user