|
|
9119d9 |
From f4a492f7751e066548cd63d2bc56fd0260c7b32b Mon Sep 17 00:00:00 2001
|
|
|
9119d9 |
Message-Id: <f4a492f7751e066548cd63d2bc56fd0260c7b32b@dist-git>
|
|
|
9119d9 |
From: Jiri Denemark <jdenemar@redhat.com>
|
|
|
9119d9 |
Date: Thu, 21 Aug 2014 15:08:39 +0200
|
|
|
9119d9 |
Subject: [PATCH] Refactor job statistics
|
|
|
9119d9 |
|
|
|
9119d9 |
Job statistics data were tracked in several structures and variables.
|
|
|
9119d9 |
Let's make a new qemuDomainJobInfo structure which can be used as a
|
|
|
9119d9 |
single source of statistics data as a preparation for storing data about
|
|
|
9119d9 |
completed a job.
|
|
|
9119d9 |
|
|
|
9119d9 |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
9119d9 |
(cherry picked from commit 6fcddfcd8f25bc23018a1fc2e37ebca375f7f1c3)
|
|
|
9119d9 |
|
|
|
9119d9 |
https://bugzilla.redhat.com/show_bug.cgi?id=1063724
|
|
|
9119d9 |
Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
|
|
|
9119d9 |
---
|
|
|
9119d9 |
src/qemu/qemu_domain.c | 157 ++++++++++++++++++++++++++++++++++++++++++++--
|
|
|
9119d9 |
src/qemu/qemu_domain.h | 28 ++++++++-
|
|
|
9119d9 |
src/qemu/qemu_driver.c | 119 ++++-------------------------------
|
|
|
9119d9 |
src/qemu/qemu_migration.c | 72 ++++++++-------------
|
|
|
9119d9 |
4 files changed, 217 insertions(+), 159 deletions(-)
|
|
|
9119d9 |
|
|
|
9119d9 |
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
|
|
|
9119d9 |
index 306ff10..7b54306 100644
|
|
|
9119d9 |
--- a/src/qemu/qemu_domain.c
|
|
|
9119d9 |
+++ b/src/qemu/qemu_domain.c
|
|
|
9119d9 |
@@ -163,11 +163,9 @@ qemuDomainObjResetAsyncJob(qemuDomainObjPrivatePtr priv)
|
|
|
9119d9 |
job->asyncOwner = 0;
|
|
|
9119d9 |
job->phase = 0;
|
|
|
9119d9 |
job->mask = QEMU_JOB_DEFAULT_MASK;
|
|
|
9119d9 |
- job->start = 0;
|
|
|
9119d9 |
job->dump_memory_only = false;
|
|
|
9119d9 |
job->asyncAbort = false;
|
|
|
9119d9 |
- memset(&job->status, 0, sizeof(job->status));
|
|
|
9119d9 |
- memset(&job->info, 0, sizeof(job->info));
|
|
|
9119d9 |
+ VIR_FREE(job->current);
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
void
|
|
|
9119d9 |
@@ -200,6 +198,7 @@ qemuDomainObjTransferJob(virDomainObjPtr obj)
|
|
|
9119d9 |
static void
|
|
|
9119d9 |
qemuDomainObjFreeJob(qemuDomainObjPrivatePtr priv)
|
|
|
9119d9 |
{
|
|
|
9119d9 |
+ VIR_FREE(priv->job.current);
|
|
|
9119d9 |
virCondDestroy(&priv->job.cond);
|
|
|
9119d9 |
virCondDestroy(&priv->job.asyncCond);
|
|
|
9119d9 |
}
|
|
|
9119d9 |
@@ -211,6 +210,150 @@ qemuDomainTrackJob(qemuDomainJob job)
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
|
|
|
9119d9 |
+int
|
|
|
9119d9 |
+qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
|
|
|
9119d9 |
+{
|
|
|
9119d9 |
+ unsigned long long now;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (!jobInfo->started)
|
|
|
9119d9 |
+ return 0;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (virTimeMillisNow(&now) < 0)
|
|
|
9119d9 |
+ return -1;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ jobInfo->timeElapsed = now - jobInfo->started;
|
|
|
9119d9 |
+ return 0;
|
|
|
9119d9 |
+}
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+int
|
|
|
9119d9 |
+qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
|
|
|
9119d9 |
+ virDomainJobInfoPtr info)
|
|
|
9119d9 |
+{
|
|
|
9119d9 |
+ info->timeElapsed = jobInfo->timeElapsed;
|
|
|
9119d9 |
+ info->timeRemaining = jobInfo->timeRemaining;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ info->memTotal = jobInfo->status.ram_total;
|
|
|
9119d9 |
+ info->memRemaining = jobInfo->status.ram_remaining;
|
|
|
9119d9 |
+ info->memProcessed = jobInfo->status.ram_transferred;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ info->fileTotal = jobInfo->status.disk_total;
|
|
|
9119d9 |
+ info->fileRemaining = jobInfo->status.disk_remaining;
|
|
|
9119d9 |
+ info->fileProcessed = jobInfo->status.disk_transferred;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ info->dataTotal = info->memTotal + info->fileTotal;
|
|
|
9119d9 |
+ info->dataRemaining = info->memRemaining + info->fileRemaining;
|
|
|
9119d9 |
+ info->dataProcessed = info->memProcessed + info->fileProcessed;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ return 0;
|
|
|
9119d9 |
+}
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+int
|
|
|
9119d9 |
+qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
|
|
|
9119d9 |
+ int *type,
|
|
|
9119d9 |
+ virTypedParameterPtr *params,
|
|
|
9119d9 |
+ int *nparams)
|
|
|
9119d9 |
+{
|
|
|
9119d9 |
+ qemuMonitorMigrationStatus *status = &jobInfo->status;
|
|
|
9119d9 |
+ virTypedParameterPtr par = NULL;
|
|
|
9119d9 |
+ int maxpar = 0;
|
|
|
9119d9 |
+ int npar = 0;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_TIME_ELAPSED,
|
|
|
9119d9 |
+ jobInfo->timeElapsed) < 0)
|
|
|
9119d9 |
+ goto error;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (jobInfo->type == VIR_DOMAIN_JOB_BOUNDED &&
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_TIME_REMAINING,
|
|
|
9119d9 |
+ jobInfo->timeRemaining) < 0)
|
|
|
9119d9 |
+ goto error;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (status->downtime_set &&
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_DOWNTIME,
|
|
|
9119d9 |
+ status->downtime) < 0)
|
|
|
9119d9 |
+ goto error;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_DATA_TOTAL,
|
|
|
9119d9 |
+ status->ram_total +
|
|
|
9119d9 |
+ status->disk_total) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_DATA_PROCESSED,
|
|
|
9119d9 |
+ status->ram_transferred +
|
|
|
9119d9 |
+ status->disk_transferred) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_DATA_REMAINING,
|
|
|
9119d9 |
+ status->ram_remaining +
|
|
|
9119d9 |
+ status->disk_remaining) < 0)
|
|
|
9119d9 |
+ goto error;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_MEMORY_TOTAL,
|
|
|
9119d9 |
+ status->ram_total) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_MEMORY_PROCESSED,
|
|
|
9119d9 |
+ status->ram_transferred) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_MEMORY_REMAINING,
|
|
|
9119d9 |
+ status->ram_remaining) < 0)
|
|
|
9119d9 |
+ goto error;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (status->ram_duplicate_set) {
|
|
|
9119d9 |
+ if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_MEMORY_CONSTANT,
|
|
|
9119d9 |
+ status->ram_duplicate) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_MEMORY_NORMAL,
|
|
|
9119d9 |
+ status->ram_normal) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_MEMORY_NORMAL_BYTES,
|
|
|
9119d9 |
+ status->ram_normal_bytes) < 0)
|
|
|
9119d9 |
+ goto error;
|
|
|
9119d9 |
+ }
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_DISK_TOTAL,
|
|
|
9119d9 |
+ status->disk_total) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_DISK_PROCESSED,
|
|
|
9119d9 |
+ status->disk_transferred) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_DISK_REMAINING,
|
|
|
9119d9 |
+ status->disk_remaining) < 0)
|
|
|
9119d9 |
+ goto error;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ if (status->xbzrle_set) {
|
|
|
9119d9 |
+ if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_COMPRESSION_CACHE,
|
|
|
9119d9 |
+ status->xbzrle_cache_size) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_COMPRESSION_BYTES,
|
|
|
9119d9 |
+ status->xbzrle_bytes) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_COMPRESSION_PAGES,
|
|
|
9119d9 |
+ status->xbzrle_pages) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_COMPRESSION_CACHE_MISSES,
|
|
|
9119d9 |
+ status->xbzrle_cache_miss) < 0 ||
|
|
|
9119d9 |
+ virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
+ VIR_DOMAIN_JOB_COMPRESSION_OVERFLOW,
|
|
|
9119d9 |
+ status->xbzrle_overflow) < 0)
|
|
|
9119d9 |
+ goto error;
|
|
|
9119d9 |
+ }
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ *type = jobInfo->type;
|
|
|
9119d9 |
+ *params = par;
|
|
|
9119d9 |
+ *nparams = npar;
|
|
|
9119d9 |
+ return 0;
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ error:
|
|
|
9119d9 |
+ virTypedParamsFree(par, npar);
|
|
|
9119d9 |
+ return -1;
|
|
|
9119d9 |
+}
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+
|
|
|
9119d9 |
static void *
|
|
|
9119d9 |
qemuDomainObjPrivateAlloc(void)
|
|
|
9119d9 |
{
|
|
|
9119d9 |
@@ -1071,7 +1214,7 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
|
|
|
9119d9 |
unsigned long long then;
|
|
|
9119d9 |
bool nested = job == QEMU_JOB_ASYNC_NESTED;
|
|
|
9119d9 |
virQEMUDriverConfigPtr cfg = virQEMUDriverGetConfig(driver);
|
|
|
9119d9 |
- int ret;
|
|
|
9119d9 |
+ int ret = -1;
|
|
|
9119d9 |
|
|
|
9119d9 |
VIR_DEBUG("Starting %s: %s (async=%s vm=%p name=%s)",
|
|
|
9119d9 |
job == QEMU_JOB_ASYNC ? "async job" : "job",
|
|
|
9119d9 |
@@ -1127,9 +1270,11 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
|
|
|
9119d9 |
qemuDomainAsyncJobTypeToString(asyncJob),
|
|
|
9119d9 |
obj, obj->def->name);
|
|
|
9119d9 |
qemuDomainObjResetAsyncJob(priv);
|
|
|
9119d9 |
+ if (VIR_ALLOC(priv->job.current) < 0)
|
|
|
9119d9 |
+ goto cleanup;
|
|
|
9119d9 |
priv->job.asyncJob = asyncJob;
|
|
|
9119d9 |
priv->job.asyncOwner = virThreadSelfID();
|
|
|
9119d9 |
- priv->job.start = now;
|
|
|
9119d9 |
+ priv->job.current->started = now;
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
if (qemuDomainTrackJob(job))
|
|
|
9119d9 |
@@ -1163,6 +1308,8 @@ qemuDomainObjBeginJobInternal(virQEMUDriverPtr driver,
|
|
|
9119d9 |
virReportSystemError(errno,
|
|
|
9119d9 |
"%s", _("cannot acquire job mutex"));
|
|
|
9119d9 |
}
|
|
|
9119d9 |
+
|
|
|
9119d9 |
+ cleanup:
|
|
|
9119d9 |
priv->jobs_queued--;
|
|
|
9119d9 |
virObjectUnref(obj);
|
|
|
9119d9 |
virObjectUnref(cfg);
|
|
|
9119d9 |
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
|
|
|
9119d9 |
index f353d90..99c7d6a 100644
|
|
|
9119d9 |
--- a/src/qemu/qemu_domain.h
|
|
|
9119d9 |
+++ b/src/qemu/qemu_domain.h
|
|
|
9119d9 |
@@ -100,6 +100,18 @@ typedef enum {
|
|
|
9119d9 |
} qemuDomainAsyncJob;
|
|
|
9119d9 |
VIR_ENUM_DECL(qemuDomainAsyncJob)
|
|
|
9119d9 |
|
|
|
9119d9 |
+typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
|
|
|
9119d9 |
+typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
|
|
|
9119d9 |
+struct _qemuDomainJobInfo {
|
|
|
9119d9 |
+ virDomainJobType type;
|
|
|
9119d9 |
+ unsigned long long started; /* When the async job started */
|
|
|
9119d9 |
+ /* Computed values */
|
|
|
9119d9 |
+ unsigned long long timeElapsed;
|
|
|
9119d9 |
+ unsigned long long timeRemaining;
|
|
|
9119d9 |
+ /* Raw values from QEMU */
|
|
|
9119d9 |
+ qemuMonitorMigrationStatus status;
|
|
|
9119d9 |
+};
|
|
|
9119d9 |
+
|
|
|
9119d9 |
struct qemuDomainJobObj {
|
|
|
9119d9 |
virCond cond; /* Use to coordinate jobs */
|
|
|
9119d9 |
qemuDomainJob active; /* Currently running job */
|
|
|
9119d9 |
@@ -110,10 +122,8 @@ struct qemuDomainJobObj {
|
|
|
9119d9 |
unsigned long long asyncOwner; /* Thread which set current async job */
|
|
|
9119d9 |
int phase; /* Job phase (mainly for migrations) */
|
|
|
9119d9 |
unsigned long long mask; /* Jobs allowed during async job */
|
|
|
9119d9 |
- unsigned long long start; /* When the async job started */
|
|
|
9119d9 |
bool dump_memory_only; /* use dump-guest-memory to do dump */
|
|
|
9119d9 |
- qemuMonitorMigrationStatus status; /* Raw async job progress data */
|
|
|
9119d9 |
- virDomainJobInfo info; /* Processed async job progress data */
|
|
|
9119d9 |
+ qemuDomainJobInfoPtr current; /* async job progress data */
|
|
|
9119d9 |
bool asyncAbort; /* abort of async job requested */
|
|
|
9119d9 |
};
|
|
|
9119d9 |
|
|
|
9119d9 |
@@ -378,4 +388,16 @@ bool qemuDomainDefCheckABIStability(virQEMUDriverPtr driver,
|
|
|
9119d9 |
bool qemuDomainAgentAvailable(qemuDomainObjPrivatePtr priv,
|
|
|
9119d9 |
bool reportError);
|
|
|
9119d9 |
|
|
|
9119d9 |
+int qemuDomainJobInfoUpdateTime(qemuDomainJobInfoPtr jobInfo)
|
|
|
9119d9 |
+ ATTRIBUTE_NONNULL(1);
|
|
|
9119d9 |
+int qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
|
|
|
9119d9 |
+ virDomainJobInfoPtr info)
|
|
|
9119d9 |
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2);
|
|
|
9119d9 |
+int qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
|
|
|
9119d9 |
+ int *type,
|
|
|
9119d9 |
+ virTypedParameterPtr *params,
|
|
|
9119d9 |
+ int *nparams)
|
|
|
9119d9 |
+ ATTRIBUTE_NONNULL(1) ATTRIBUTE_NONNULL(2)
|
|
|
9119d9 |
+ ATTRIBUTE_NONNULL(3) ATTRIBUTE_NONNULL(4);
|
|
|
9119d9 |
+
|
|
|
9119d9 |
#endif /* __QEMU_DOMAIN_H__ */
|
|
|
9119d9 |
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
|
|
|
9119d9 |
index 53baced..6640a29 100644
|
|
|
9119d9 |
--- a/src/qemu/qemu_driver.c
|
|
|
9119d9 |
+++ b/src/qemu/qemu_driver.c
|
|
|
9119d9 |
@@ -2655,15 +2655,13 @@ qemuDomainGetControlInfo(virDomainPtr dom,
|
|
|
9119d9 |
if (priv->monError) {
|
|
|
9119d9 |
info->state = VIR_DOMAIN_CONTROL_ERROR;
|
|
|
9119d9 |
} else if (priv->job.active) {
|
|
|
9119d9 |
- if (!priv->monStart) {
|
|
|
9119d9 |
+ if (virTimeMillisNow(&info->stateTime) < 0)
|
|
|
9119d9 |
+ goto cleanup;
|
|
|
9119d9 |
+ if (priv->job.current) {
|
|
|
9119d9 |
info->state = VIR_DOMAIN_CONTROL_JOB;
|
|
|
9119d9 |
- if (virTimeMillisNow(&info->stateTime) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
- info->stateTime -= priv->job.start;
|
|
|
9119d9 |
+ info->stateTime -= priv->job.current->started;
|
|
|
9119d9 |
} else {
|
|
|
9119d9 |
info->state = VIR_DOMAIN_CONTROL_OCCUPIED;
|
|
|
9119d9 |
- if (virTimeMillisNow(&info->stateTime) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
info->stateTime -= priv->monStart;
|
|
|
9119d9 |
}
|
|
|
9119d9 |
} else {
|
|
|
9119d9 |
@@ -3110,8 +3108,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
|
|
|
9119d9 |
goto endjob;
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
- memset(&priv->job.info, 0, sizeof(priv->job.info));
|
|
|
9119d9 |
- priv->job.info.type = VIR_DOMAIN_JOB_UNBOUNDED;
|
|
|
9119d9 |
+ priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
|
|
|
9119d9 |
|
|
|
9119d9 |
/* Pause */
|
|
|
9119d9 |
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
|
|
|
9119d9 |
@@ -3460,6 +3457,7 @@ static int qemuDumpToFd(virQEMUDriverPtr driver, virDomainObjPtr vm,
|
|
|
9119d9 |
fd) < 0)
|
|
|
9119d9 |
return -1;
|
|
|
9119d9 |
|
|
|
9119d9 |
+ VIR_FREE(priv->job.current);
|
|
|
9119d9 |
priv->job.dump_memory_only = true;
|
|
|
9119d9 |
|
|
|
9119d9 |
if (qemuDomainObjEnterMonitorAsync(driver, vm, asyncJob) < 0)
|
|
|
9119d9 |
@@ -11624,17 +11622,15 @@ static int qemuDomainGetJobInfo(virDomainPtr dom,
|
|
|
9119d9 |
goto cleanup;
|
|
|
9119d9 |
|
|
|
9119d9 |
if (virDomainObjIsActive(vm)) {
|
|
|
9119d9 |
- if (priv->job.asyncJob && !priv->job.dump_memory_only) {
|
|
|
9119d9 |
- memcpy(info, &priv->job.info, sizeof(*info));
|
|
|
9119d9 |
-
|
|
|
9119d9 |
+ if (priv->job.current) {
|
|
|
9119d9 |
/* Refresh elapsed time again just to ensure it
|
|
|
9119d9 |
* is fully updated. This is primarily for benefit
|
|
|
9119d9 |
* of incoming migration which we don't currently
|
|
|
9119d9 |
* monitor actively in the background thread
|
|
|
9119d9 |
*/
|
|
|
9119d9 |
- if (virTimeMillisNow(&info->timeElapsed) < 0)
|
|
|
9119d9 |
+ if (qemuDomainJobInfoUpdateTime(priv->job.current) < 0 ||
|
|
|
9119d9 |
+ qemuDomainJobInfoToInfo(priv->job.current, info) < 0)
|
|
|
9119d9 |
goto cleanup;
|
|
|
9119d9 |
- info->timeElapsed -= priv->job.start;
|
|
|
9119d9 |
} else {
|
|
|
9119d9 |
memset(info, 0, sizeof(*info));
|
|
|
9119d9 |
info->type = VIR_DOMAIN_JOB_NONE;
|
|
|
9119d9 |
@@ -11663,9 +11659,6 @@ qemuDomainGetJobStats(virDomainPtr dom,
|
|
|
9119d9 |
{
|
|
|
9119d9 |
virDomainObjPtr vm;
|
|
|
9119d9 |
qemuDomainObjPrivatePtr priv;
|
|
|
9119d9 |
- virTypedParameterPtr par = NULL;
|
|
|
9119d9 |
- int maxpar = 0;
|
|
|
9119d9 |
- int npar = 0;
|
|
|
9119d9 |
int ret = -1;
|
|
|
9119d9 |
|
|
|
9119d9 |
virCheckFlags(0, -1);
|
|
|
9119d9 |
@@ -11684,7 +11677,7 @@ qemuDomainGetJobStats(virDomainPtr dom,
|
|
|
9119d9 |
goto cleanup;
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
- if (!priv->job.asyncJob || priv->job.dump_memory_only) {
|
|
|
9119d9 |
+ if (!priv->job.current) {
|
|
|
9119d9 |
*type = VIR_DOMAIN_JOB_NONE;
|
|
|
9119d9 |
*params = NULL;
|
|
|
9119d9 |
*nparams = 0;
|
|
|
9119d9 |
@@ -11697,102 +11690,16 @@ qemuDomainGetJobStats(virDomainPtr dom,
|
|
|
9119d9 |
* of incoming migration which we don't currently
|
|
|
9119d9 |
* monitor actively in the background thread
|
|
|
9119d9 |
*/
|
|
|
9119d9 |
- if (virTimeMillisNow(&priv->job.info.timeElapsed) < 0)
|
|
|
9119d9 |
+ if (qemuDomainJobInfoUpdateTime(priv->job.current) < 0 ||
|
|
|
9119d9 |
+ qemuDomainJobInfoToParams(priv->job.current,
|
|
|
9119d9 |
+ type, params, nparams) < 0)
|
|
|
9119d9 |
goto cleanup;
|
|
|
9119d9 |
- priv->job.info.timeElapsed -= priv->job.start;
|
|
|
9119d9 |
|
|
|
9119d9 |
- if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_TIME_ELAPSED,
|
|
|
9119d9 |
- priv->job.info.timeElapsed) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- if (priv->job.info.type == VIR_DOMAIN_JOB_BOUNDED &&
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_TIME_REMAINING,
|
|
|
9119d9 |
- priv->job.info.timeRemaining) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- if (priv->job.status.downtime_set &&
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_DOWNTIME,
|
|
|
9119d9 |
- priv->job.status.downtime) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_DATA_TOTAL,
|
|
|
9119d9 |
- priv->job.info.dataTotal) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_DATA_PROCESSED,
|
|
|
9119d9 |
- priv->job.info.dataProcessed) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_DATA_REMAINING,
|
|
|
9119d9 |
- priv->job.info.dataRemaining) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_MEMORY_TOTAL,
|
|
|
9119d9 |
- priv->job.info.memTotal) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_MEMORY_PROCESSED,
|
|
|
9119d9 |
- priv->job.info.memProcessed) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_MEMORY_REMAINING,
|
|
|
9119d9 |
- priv->job.info.memRemaining) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- if (priv->job.status.ram_duplicate_set) {
|
|
|
9119d9 |
- if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_MEMORY_CONSTANT,
|
|
|
9119d9 |
- priv->job.status.ram_duplicate) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_MEMORY_NORMAL,
|
|
|
9119d9 |
- priv->job.status.ram_normal) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_MEMORY_NORMAL_BYTES,
|
|
|
9119d9 |
- priv->job.status.ram_normal_bytes) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
- }
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_DISK_TOTAL,
|
|
|
9119d9 |
- priv->job.info.fileTotal) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_DISK_PROCESSED,
|
|
|
9119d9 |
- priv->job.info.fileProcessed) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_DISK_REMAINING,
|
|
|
9119d9 |
- priv->job.info.fileRemaining) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- if (priv->job.status.xbzrle_set) {
|
|
|
9119d9 |
- if (virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_COMPRESSION_CACHE,
|
|
|
9119d9 |
- priv->job.status.xbzrle_cache_size) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_COMPRESSION_BYTES,
|
|
|
9119d9 |
- priv->job.status.xbzrle_bytes) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_COMPRESSION_PAGES,
|
|
|
9119d9 |
- priv->job.status.xbzrle_pages) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_COMPRESSION_CACHE_MISSES,
|
|
|
9119d9 |
- priv->job.status.xbzrle_cache_miss) < 0 ||
|
|
|
9119d9 |
- virTypedParamsAddULLong(&par, &npar, &maxpar,
|
|
|
9119d9 |
- VIR_DOMAIN_JOB_COMPRESSION_OVERFLOW,
|
|
|
9119d9 |
- priv->job.status.xbzrle_overflow) < 0)
|
|
|
9119d9 |
- goto cleanup;
|
|
|
9119d9 |
- }
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- *type = priv->job.info.type;
|
|
|
9119d9 |
- *params = par;
|
|
|
9119d9 |
- *nparams = npar;
|
|
|
9119d9 |
ret = 0;
|
|
|
9119d9 |
|
|
|
9119d9 |
cleanup:
|
|
|
9119d9 |
if (vm)
|
|
|
9119d9 |
virObjectUnlock(vm);
|
|
|
9119d9 |
- if (ret < 0)
|
|
|
9119d9 |
- virTypedParamsFree(par, npar);
|
|
|
9119d9 |
return ret;
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
|
|
|
9119d9 |
index 2726512..066cc97 100644
|
|
|
9119d9 |
--- a/src/qemu/qemu_migration.c
|
|
|
9119d9 |
+++ b/src/qemu/qemu_migration.c
|
|
|
9119d9 |
@@ -1723,8 +1723,9 @@ qemuMigrationUpdateJobStatus(virQEMUDriverPtr driver,
|
|
|
9119d9 |
qemuDomainAsyncJob asyncJob)
|
|
|
9119d9 |
{
|
|
|
9119d9 |
qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
9119d9 |
- int ret;
|
|
|
9119d9 |
qemuMonitorMigrationStatus status;
|
|
|
9119d9 |
+ qemuDomainJobInfoPtr jobInfo;
|
|
|
9119d9 |
+ int ret;
|
|
|
9119d9 |
|
|
|
9119d9 |
memset(&status, 0, sizeof(status));
|
|
|
9119d9 |
|
|
|
9119d9 |
@@ -1738,62 +1739,40 @@ qemuMigrationUpdateJobStatus(virQEMUDriverPtr driver,
|
|
|
9119d9 |
|
|
|
9119d9 |
qemuDomainObjExitMonitor(driver, vm);
|
|
|
9119d9 |
|
|
|
9119d9 |
- priv->job.status = status;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- if (ret < 0 || virTimeMillisNow(&priv->job.info.timeElapsed) < 0)
|
|
|
9119d9 |
+ if (ret < 0 ||
|
|
|
9119d9 |
+ qemuDomainJobInfoUpdateTime(priv->job.current) < 0)
|
|
|
9119d9 |
return -1;
|
|
|
9119d9 |
|
|
|
9119d9 |
- priv->job.info.timeElapsed -= priv->job.start;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
ret = -1;
|
|
|
9119d9 |
- switch (priv->job.status.status) {
|
|
|
9119d9 |
- case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
|
|
|
9119d9 |
- priv->job.info.type = VIR_DOMAIN_JOB_NONE;
|
|
|
9119d9 |
- virReportError(VIR_ERR_OPERATION_FAILED,
|
|
|
9119d9 |
- _("%s: %s"), job, _("is not active"));
|
|
|
9119d9 |
- break;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
+ jobInfo = priv->job.current;
|
|
|
9119d9 |
+ switch (status.status) {
|
|
|
9119d9 |
+ case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
|
|
|
9119d9 |
+ jobInfo->type = VIR_DOMAIN_JOB_COMPLETED;
|
|
|
9119d9 |
+ /* fall through */
|
|
|
9119d9 |
case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
|
|
|
9119d9 |
- ret = 0;
|
|
|
9119d9 |
- break;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
case QEMU_MONITOR_MIGRATION_STATUS_ACTIVE:
|
|
|
9119d9 |
- priv->job.info.fileTotal = priv->job.status.disk_total;
|
|
|
9119d9 |
- priv->job.info.fileRemaining = priv->job.status.disk_remaining;
|
|
|
9119d9 |
- priv->job.info.fileProcessed = priv->job.status.disk_transferred;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- priv->job.info.memTotal = priv->job.status.ram_total;
|
|
|
9119d9 |
- priv->job.info.memRemaining = priv->job.status.ram_remaining;
|
|
|
9119d9 |
- priv->job.info.memProcessed = priv->job.status.ram_transferred;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
- priv->job.info.dataTotal =
|
|
|
9119d9 |
- priv->job.status.ram_total + priv->job.status.disk_total;
|
|
|
9119d9 |
- priv->job.info.dataRemaining =
|
|
|
9119d9 |
- priv->job.status.ram_remaining + priv->job.status.disk_remaining;
|
|
|
9119d9 |
- priv->job.info.dataProcessed =
|
|
|
9119d9 |
- priv->job.status.ram_transferred +
|
|
|
9119d9 |
- priv->job.status.disk_transferred;
|
|
|
9119d9 |
-
|
|
|
9119d9 |
ret = 0;
|
|
|
9119d9 |
break;
|
|
|
9119d9 |
|
|
|
9119d9 |
- case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
|
|
|
9119d9 |
- priv->job.info.type = VIR_DOMAIN_JOB_COMPLETED;
|
|
|
9119d9 |
- ret = 0;
|
|
|
9119d9 |
+ case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
|
|
|
9119d9 |
+ jobInfo->type = VIR_DOMAIN_JOB_NONE;
|
|
|
9119d9 |
+ virReportError(VIR_ERR_OPERATION_FAILED,
|
|
|
9119d9 |
+ _("%s: %s"), job, _("is not active"));
|
|
|
9119d9 |
break;
|
|
|
9119d9 |
|
|
|
9119d9 |
case QEMU_MONITOR_MIGRATION_STATUS_ERROR:
|
|
|
9119d9 |
- priv->job.info.type = VIR_DOMAIN_JOB_FAILED;
|
|
|
9119d9 |
+ jobInfo->type = VIR_DOMAIN_JOB_FAILED;
|
|
|
9119d9 |
virReportError(VIR_ERR_OPERATION_FAILED,
|
|
|
9119d9 |
_("%s: %s"), job, _("unexpectedly failed"));
|
|
|
9119d9 |
break;
|
|
|
9119d9 |
|
|
|
9119d9 |
case QEMU_MONITOR_MIGRATION_STATUS_CANCELLED:
|
|
|
9119d9 |
- priv->job.info.type = VIR_DOMAIN_JOB_CANCELLED;
|
|
|
9119d9 |
+ jobInfo->type = VIR_DOMAIN_JOB_CANCELLED;
|
|
|
9119d9 |
virReportError(VIR_ERR_OPERATION_ABORTED,
|
|
|
9119d9 |
_("%s: %s"), job, _("canceled by client"));
|
|
|
9119d9 |
break;
|
|
|
9119d9 |
}
|
|
|
9119d9 |
+ jobInfo->status = status;
|
|
|
9119d9 |
|
|
|
9119d9 |
return ret;
|
|
|
9119d9 |
}
|
|
|
9119d9 |
@@ -1803,11 +1782,14 @@ qemuMigrationUpdateJobStatus(virQEMUDriverPtr driver,
|
|
|
9119d9 |
* QEMU reports failed migration.
|
|
|
9119d9 |
*/
|
|
|
9119d9 |
static int
|
|
|
9119d9 |
-qemuMigrationWaitForCompletion(virQEMUDriverPtr driver, virDomainObjPtr vm,
|
|
|
9119d9 |
+qemuMigrationWaitForCompletion(virQEMUDriverPtr driver,
|
|
|
9119d9 |
+ virDomainObjPtr vm,
|
|
|
9119d9 |
qemuDomainAsyncJob asyncJob,
|
|
|
9119d9 |
- virConnectPtr dconn, bool abort_on_error)
|
|
|
9119d9 |
+ virConnectPtr dconn,
|
|
|
9119d9 |
+ bool abort_on_error)
|
|
|
9119d9 |
{
|
|
|
9119d9 |
qemuDomainObjPrivatePtr priv = vm->privateData;
|
|
|
9119d9 |
+ qemuDomainJobInfoPtr jobInfo = priv->job.current;
|
|
|
9119d9 |
const char *job;
|
|
|
9119d9 |
int pauseReason;
|
|
|
9119d9 |
|
|
|
9119d9 |
@@ -1825,9 +1807,9 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver, virDomainObjPtr vm,
|
|
|
9119d9 |
job = _("job");
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
- priv->job.info.type = VIR_DOMAIN_JOB_UNBOUNDED;
|
|
|
9119d9 |
+ jobInfo->type = VIR_DOMAIN_JOB_UNBOUNDED;
|
|
|
9119d9 |
|
|
|
9119d9 |
- while (priv->job.info.type == VIR_DOMAIN_JOB_UNBOUNDED) {
|
|
|
9119d9 |
+ while (jobInfo->type == VIR_DOMAIN_JOB_UNBOUNDED) {
|
|
|
9119d9 |
/* Poll every 50ms for progress & to allow cancellation */
|
|
|
9119d9 |
struct timespec ts = { .tv_sec = 0, .tv_nsec = 50 * 1000 * 1000ull };
|
|
|
9119d9 |
|
|
|
9119d9 |
@@ -1856,13 +1838,13 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver, virDomainObjPtr vm,
|
|
|
9119d9 |
virObjectLock(vm);
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
- if (priv->job.info.type == VIR_DOMAIN_JOB_COMPLETED) {
|
|
|
9119d9 |
+ if (jobInfo->type == VIR_DOMAIN_JOB_COMPLETED) {
|
|
|
9119d9 |
return 0;
|
|
|
9119d9 |
- } else if (priv->job.info.type == VIR_DOMAIN_JOB_UNBOUNDED) {
|
|
|
9119d9 |
+ } else if (jobInfo->type == VIR_DOMAIN_JOB_UNBOUNDED) {
|
|
|
9119d9 |
/* The migration was aborted by us rather than QEMU itself so let's
|
|
|
9119d9 |
* update the job type and notify the caller to send migrate_cancel.
|
|
|
9119d9 |
*/
|
|
|
9119d9 |
- priv->job.info.type = VIR_DOMAIN_JOB_FAILED;
|
|
|
9119d9 |
+ jobInfo->type = VIR_DOMAIN_JOB_FAILED;
|
|
|
9119d9 |
return -2;
|
|
|
9119d9 |
} else {
|
|
|
9119d9 |
return -1;
|
|
|
9119d9 |
@@ -4914,7 +4896,7 @@ qemuMigrationJobStart(virQEMUDriverPtr driver,
|
|
|
9119d9 |
JOB_MASK(QEMU_JOB_MIGRATION_OP)));
|
|
|
9119d9 |
}
|
|
|
9119d9 |
|
|
|
9119d9 |
- priv->job.info.type = VIR_DOMAIN_JOB_UNBOUNDED;
|
|
|
9119d9 |
+ priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
|
|
|
9119d9 |
|
|
|
9119d9 |
return 0;
|
|
|
9119d9 |
}
|
|
|
9119d9 |
--
|
|
|
9119d9 |
2.1.0
|
|
|
9119d9 |
|