qemu: blockjob: Save status XML when modifying job state

Now that block job data is stored in the status XML portion we need to
make sure that everything which changes the state also saves the status
XML. The job registering function is used while parsing the status XML
so in that case we need to skip the XML saving.

Signed-off-by: Peter Krempa <pkrempa@redhat.com>
Reviewed-by: Ján Tomko <jtomko@redhat.com>
This commit is contained in:
Peter Krempa 2019-05-15 10:58:42 +02:00
parent d3158852fa
commit 4cc4357f3e
6 changed files with 25 additions and 14 deletions

View File

@ -114,7 +114,8 @@ qemuBlockJobDataNew(qemuBlockJobType type,
int
qemuBlockJobRegister(qemuBlockJobDataPtr job,
virDomainObjPtr vm,
virDomainDiskDefPtr disk)
virDomainDiskDefPtr disk,
bool savestatus)
{
qemuDomainObjPrivatePtr priv = vm->privateData;
@ -128,6 +129,9 @@ qemuBlockJobRegister(qemuBlockJobDataPtr job,
QEMU_DOMAIN_DISK_PRIVATE(disk)->blockjob = virObjectRef(job);
}
if (savestatus)
qemuDomainSaveStatus(vm);
return 0;
}
@ -152,6 +156,8 @@ qemuBlockJobUnregister(qemuBlockJobDataPtr job,
/* this may remove the last reference of 'job' */
virHashRemoveEntry(priv->blockjobs, job->name);
qemuDomainSaveStatus(vm);
}
@ -174,7 +180,7 @@ qemuBlockJobDiskNew(virDomainObjPtr vm,
if (!(job = qemuBlockJobDataNew(type, jobname)))
return NULL;
if (qemuBlockJobRegister(job, vm, disk) < 0)
if (qemuBlockJobRegister(job, vm, disk, true) < 0)
return NULL;
VIR_RETURN_PTR(job);
@ -206,10 +212,13 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
* Mark @job as started in qemu.
*/
void
qemuBlockJobStarted(qemuBlockJobDataPtr job)
qemuBlockJobStarted(qemuBlockJobDataPtr job,
virDomainObjPtr vm)
{
if (job->state == QEMU_BLOCKJOB_STATE_NEW)
job->state = QEMU_BLOCKJOB_STATE_RUNNING;
qemuDomainSaveStatus(vm);
}

View File

@ -87,7 +87,8 @@ struct _qemuBlockJobData {
int
qemuBlockJobRegister(qemuBlockJobDataPtr job,
virDomainObjPtr vm,
virDomainDiskDefPtr disk)
virDomainDiskDefPtr disk,
bool savestatus)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
qemuBlockJobDataPtr
@ -107,8 +108,9 @@ qemuBlockJobDiskGetJob(virDomainDiskDefPtr disk)
ATTRIBUTE_NONNULL(1);
void
qemuBlockJobStarted(qemuBlockJobDataPtr job)
ATTRIBUTE_NONNULL(1);
qemuBlockJobStarted(qemuBlockJobDataPtr job,
virDomainObjPtr vm)
ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
bool
qemuBlockJobIsRunning(qemuBlockJobDataPtr job)

View File

@ -2748,7 +2748,7 @@ qemuDomainObjPrivateXMLParseBlockjobData(virDomainObjPtr vm,
job->errmsg = virXPathString("string(./errmsg)", ctxt);
job->invalidData = invalidData;
if (qemuBlockJobRegister(job, vm, disk) < 0)
if (qemuBlockJobRegister(job, vm, disk, false) < 0)
return -1;
return 0;

View File

@ -4704,7 +4704,7 @@ processBlockJobEvent(virQEMUDriverPtr driver,
if (!(job = qemuBlockJobDiskGetJob(disk))) {
if (!(job = qemuBlockJobDiskNew(vm, disk, type, diskAlias)))
goto endjob;
qemuBlockJobStarted(job);
job->state = QEMU_BLOCKJOB_STATE_RUNNING;
}
job->newstate = status;
@ -17100,7 +17100,7 @@ qemuDomainBlockPullCommon(virQEMUDriverPtr driver,
if (ret < 0)
goto endjob;
qemuBlockJobStarted(job);
qemuBlockJobStarted(job, vm);
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
VIR_WARN("Unable to save status on vm %s after state change",
@ -17676,11 +17676,11 @@ qemuDomainBlockCopyCommon(virDomainObjPtr vm,
}
/* Update vm in place to match changes. */
qemuBlockJobStarted(job);
need_unlink = false;
virStorageFileDeinit(mirror);
VIR_STEAL_PTR(disk->mirror, mirror);
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_COPY;
qemuBlockJobStarted(job, vm);
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
VIR_WARN("Unable to save status on vm %s after state change",
@ -18066,11 +18066,11 @@ qemuDomainBlockCommit(virDomainPtr dom,
goto endjob;
}
qemuBlockJobStarted(job);
if (mirror) {
VIR_STEAL_PTR(disk->mirror, mirror);
disk->mirrorJob = VIR_DOMAIN_BLOCK_JOB_TYPE_ACTIVE_COMMIT;
}
qemuBlockJobStarted(job, vm);
if (virDomainSaveStatus(driver->xmlopt, cfg->stateDir, vm, driver->caps) < 0)
VIR_WARN("Unable to save status on vm %s after block job",

View File

@ -946,7 +946,7 @@ qemuMigrationSrcNBDStorageCopyOne(virQEMUDriverPtr driver,
goto cleanup;
diskPriv->migrating = true;
qemuBlockJobStarted(job);
qemuBlockJobStarted(job, vm);
ret = 0;

View File

@ -7819,8 +7819,6 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
if (!(job = qemuBlockJobDiskNew(vm, disk, jobtype, jobname)))
return -1;
qemuBlockJobStarted(job);
if (disk->mirror) {
if (info->ready == 1 ||
(info->ready == -1 && info->end == info->cur)) {
@ -7849,6 +7847,8 @@ qemuProcessRefreshLegacyBlockjob(void *payload,
}
}
qemuBlockJobStarted(job, vm);
cleanup:
qemuBlockJobStartupFinalize(vm, job);