job->owner = priv->job.owner;
job->asyncJob = priv->job.asyncJob;
job->asyncOwner = priv->job.asyncOwner;
+ job->asyncStarted = priv->job.asyncStarted;
job->phase = priv->job.phase;
job->privateData = g_steal_pointer(&priv->job.privateData);
job->apiFlags = priv->job.apiFlags;
qemuDomainObjRestoreAsyncJob(virDomainObj *vm,
virDomainAsyncJob asyncJob,
int phase,
+ unsigned long long started,
virDomainJobOperation operation,
qemuDomainJobStatsType statsType,
virDomainJobStatus status,
{
qemuDomainObjPrivate *priv = vm->privateData;
qemuDomainJobObj *job = &priv->job;
- unsigned long long now;
VIR_DEBUG("Restoring %s async job for domain %s",
virDomainAsyncJobTypeToString(asyncJob), vm->def->name);
- ignore_value(virTimeMillisNow(&now));
+ if (started == 0)
+ ignore_value(virTimeMillisNow(&started));
job->jobsQueued++;
job->asyncJob = asyncJob;
job->phase = phase;
job->asyncOwnerAPI = g_strdup(virThreadJobGet());
- job->asyncStarted = now;
+ job->asyncStarted = started;
qemuDomainObjSetAsyncJobMask(vm, allowedJobs);
qemuDomainJobSetStatsType(priv->job.current, statsType);
job->current->operation = operation;
job->current->status = status;
- job->current->started = now;
+ job->current->started = started;
}
priv->job.phase));
}
- if (priv->job.asyncJob != VIR_ASYNC_JOB_NONE)
+ if (priv->job.asyncJob != VIR_ASYNC_JOB_NONE) {
virBufferAsprintf(&attrBuf, " flags='0x%lx'", priv->job.apiFlags);
+ virBufferAsprintf(&attrBuf, " asyncStarted='%llu'", priv->job.asyncStarted);
+ }
if (priv->job.cb &&
priv->job.cb->formatJob(&childBuf, &priv->job, vm) < 0)
}
VIR_FREE(tmp);
}
+
+ if (virXPathULongLong("string(@asyncStarted)", ctxt,
+ &priv->job.asyncStarted) == -2) {
+ virReportError(VIR_ERR_INTERNAL_ERROR, "%s",
+ _("Invalid async job start"));
+ return -1;
+ }
}
if (virXPathULongHex("string(@flags)", ctxt, &priv->job.apiFlags) == -2) {
allowedJobs = VIR_JOB_DEFAULT_MASK | JOB_MASK(VIR_JOB_MIGRATION_OP);
}
- qemuDomainObjRestoreAsyncJob(vm, job->asyncJob, job->phase, op,
+ qemuDomainObjRestoreAsyncJob(vm, job->asyncJob, job->phase,
+ job->asyncStarted, op,
QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION,
VIR_DOMAIN_JOB_STATUS_PAUSED,
allowedJobs);
case VIR_ASYNC_JOB_BACKUP:
/* Restore the config of the async job which is not persisted */
qemuDomainObjRestoreAsyncJob(vm, VIR_ASYNC_JOB_BACKUP, 0,
+ job->asyncStarted,
VIR_DOMAIN_JOB_OPERATION_BACKUP,
QEMU_DOMAIN_JOB_STATS_TYPE_BACKUP,
VIR_DOMAIN_JOB_STATUS_ACTIVE,