This patch simply switches code from using VIR_DOMAIN_JOB_* to
introduced QEMU_DOMAIN_JOB_STATUS_*. Later this gives us freedom
to introduce states for postcopy and mirroring phases.
---
src/qemu/qemu_domain.c | 27 ++++++++++++++++++++--
src/qemu/qemu_domain.h | 11 ++++++++-
src/qemu/qemu_driver.c | 11 ++++-----
src/qemu/qemu_migration.c | 50 +++++++++++++++++++---------------------
src/qemu/qemu_migration_cookie.c | 2 +-
src/qemu/qemu_process.c | 2 +-
6 files changed, 66 insertions(+), 37 deletions(-)
diff --git a/src/qemu/qemu_domain.c b/src/qemu/qemu_domain.c
index 54d9425..0ae53ef 100644
--- a/src/qemu/qemu_domain.c
+++ b/src/qemu/qemu_domain.c
@@ -402,11 +402,34 @@ qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
return 0;
}
+static virDomainJobType
+qemuDomainJobStatusToType(qemuDomainJobStatus status)
+{
+ switch (status) {
+ case QEMU_DOMAIN_JOB_STATUS_NONE:
+ break;
+
+ case QEMU_DOMAIN_JOB_STATUS_ACTIVE:
+ return VIR_DOMAIN_JOB_UNBOUNDED;
+
+ case QEMU_DOMAIN_JOB_STATUS_COMPLETED:
+ return VIR_DOMAIN_JOB_COMPLETED;
+
+ case QEMU_DOMAIN_JOB_STATUS_FAILED:
+ return VIR_DOMAIN_JOB_FAILED;
+
+ case QEMU_DOMAIN_JOB_STATUS_CANCELED:
+ return VIR_DOMAIN_JOB_CANCELLED;
+ }
+
+ return VIR_DOMAIN_JOB_NONE;
+}
+
int
qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
virDomainJobInfoPtr info)
{
- info->type = jobInfo->type;
+ info->type = qemuDomainJobStatusToType(jobInfo->status);
info->timeElapsed = jobInfo->timeElapsed;
info->memTotal = jobInfo->stats.ram_total;
@@ -561,7 +584,7 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
stats->cpu_throttle_percentage) < 0)
goto error;
- *type = jobInfo->type;
+ *type = qemuDomainJobStatusToType(jobInfo->status);
*params = par;
*nparams = npar;
return 0;
diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
index caf1ebe..a5791bf 100644
--- a/src/qemu/qemu_domain.h
+++ b/src/qemu/qemu_domain.h
@@ -99,10 +99,19 @@ typedef enum {
} qemuDomainAsyncJob;
VIR_ENUM_DECL(qemuDomainAsyncJob)
+typedef enum {
+ QEMU_DOMAIN_JOB_STATUS_NONE = 0,
+ QEMU_DOMAIN_JOB_STATUS_ACTIVE,
+ QEMU_DOMAIN_JOB_STATUS_COMPLETED,
+ QEMU_DOMAIN_JOB_STATUS_FAILED,
+ QEMU_DOMAIN_JOB_STATUS_CANCELED,
+} qemuDomainJobStatus;
+
typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
struct _qemuDomainJobInfo {
- virDomainJobType type;
+ qemuDomainJobStatus status;
+
unsigned long long started; /* When the async job started */
unsigned long long stopped; /* When the domain's CPUs were stopped */
unsigned long long sent; /* When the source sent status info to the
diff --git a/src/qemu/qemu_driver.c b/src/qemu/qemu_driver.c
index 388af4f..c5cca07 100644
--- a/src/qemu/qemu_driver.c
+++ b/src/qemu/qemu_driver.c
@@ -3156,7 +3156,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
goto endjob;
}
- priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
+ priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_ACTIVE;
/* Pause */
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
@@ -12781,14 +12781,13 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver,
info = priv->job.current;
if (!info) {
- jobInfo->type = VIR_DOMAIN_JOB_NONE;
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_NONE;
ret = 0;
goto cleanup;
}
*jobInfo = *info;
- if (jobInfo->type == VIR_DOMAIN_JOB_BOUNDED ||
- jobInfo->type == VIR_DOMAIN_JOB_UNBOUNDED) {
+ if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE) {
if (fetch)
ret = qemuMigrationFetchJobStatus(driver, vm, QEMU_ASYNC_JOB_NONE,
jobInfo);
@@ -12823,7 +12822,7 @@ qemuDomainGetJobInfo(virDomainPtr dom,
if (qemuDomainGetJobStatsInternal(driver, vm, false, &jobInfo) < 0)
goto cleanup;
- if (jobInfo.type == VIR_DOMAIN_JOB_NONE) {
+ if (jobInfo.status == QEMU_DOMAIN_JOB_STATUS_NONE) {
memset(info, 0, sizeof(*info));
info->type = VIR_DOMAIN_JOB_NONE;
ret = 0;
@@ -12864,7 +12863,7 @@ qemuDomainGetJobStats(virDomainPtr dom,
if (qemuDomainGetJobStatsInternal(driver, vm, completed, &jobInfo) < 0)
goto cleanup;
- if (jobInfo.type == VIR_DOMAIN_JOB_NONE) {
+ if (jobInfo.status == QEMU_DOMAIN_JOB_STATUS_NONE) {
*type = VIR_DOMAIN_JOB_NONE;
*params = NULL;
*nparams = 0;
diff --git a/src/qemu/qemu_migration.c b/src/qemu/qemu_migration.c
index d8222fe..e9a3fd0 100644
--- a/src/qemu/qemu_migration.c
+++ b/src/qemu/qemu_migration.c
@@ -946,7 +946,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
goto cleanup;
if (priv->job.abortJob) {
- priv->job.current->type = VIR_DOMAIN_JOB_CANCELLED;
+ priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_CANCELED;
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
_("canceled by client"));
@@ -1315,19 +1315,19 @@ qemuMigrationUpdateJobType(qemuDomainJobInfoPtr jobInfo)
{
switch ((qemuMonitorMigrationStatus) jobInfo->stats.status) {
case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
- jobInfo->type = VIR_DOMAIN_JOB_COMPLETED;
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
break;
case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
- jobInfo->type = VIR_DOMAIN_JOB_NONE;
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_NONE;
break;
case QEMU_MONITOR_MIGRATION_STATUS_ERROR:
- jobInfo->type = VIR_DOMAIN_JOB_FAILED;
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
break;
case QEMU_MONITOR_MIGRATION_STATUS_CANCELLED:
- jobInfo->type = VIR_DOMAIN_JOB_CANCELLED;
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_CANCELED;
break;
case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
@@ -1414,32 +1414,30 @@ qemuMigrationCheckJobStatus(virQEMUDriverPtr driver,
else if (qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
return -1;
- switch (jobInfo->type) {
- case VIR_DOMAIN_JOB_NONE:
+ switch (jobInfo->status) {
+ case QEMU_DOMAIN_JOB_STATUS_NONE:
virReportError(VIR_ERR_OPERATION_FAILED, _("%s: %s"),
qemuMigrationJobName(vm), _("is not active"));
return -1;
- case VIR_DOMAIN_JOB_FAILED:
+ case QEMU_DOMAIN_JOB_STATUS_FAILED:
virReportError(VIR_ERR_OPERATION_FAILED, _("%s: %s"),
qemuMigrationJobName(vm), _("unexpectedly failed"));
return -1;
- case VIR_DOMAIN_JOB_CANCELLED:
+ case QEMU_DOMAIN_JOB_STATUS_CANCELED:
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
qemuMigrationJobName(vm), _("canceled by client"));
return -1;
- case VIR_DOMAIN_JOB_COMPLETED:
+ case QEMU_DOMAIN_JOB_STATUS_COMPLETED:
/* Fetch statistics of a completed migration */
if (events && updateJobStats &&
qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
return -1;
break;
- case VIR_DOMAIN_JOB_BOUNDED:
- case VIR_DOMAIN_JOB_UNBOUNDED:
- case VIR_DOMAIN_JOB_LAST:
+ case QEMU_DOMAIN_JOB_STATUS_ACTIVE:
break;
}
return 0;
@@ -1497,7 +1495,7 @@ qemuMigrationCompleted(virQEMUDriverPtr driver,
* will continue waiting until the migrate state changes to completed.
*/
if (flags & QEMU_MIGRATION_COMPLETED_POSTCOPY &&
- jobInfo->type == VIR_DOMAIN_JOB_UNBOUNDED &&
+ jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE &&
jobInfo->stats.status == QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY) {
VIR_DEBUG("Migration switched to post-copy");
if (updateStats &&
@@ -1506,18 +1504,18 @@ qemuMigrationCompleted(virQEMUDriverPtr driver,
return 1;
}
- if (jobInfo->type == VIR_DOMAIN_JOB_COMPLETED)
+ if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_COMPLETED)
return 1;
else
return 0;
error:
- if (jobInfo->type == VIR_DOMAIN_JOB_UNBOUNDED) {
+ if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE) {
/* The migration was aborted by us rather than QEMU itself. */
- jobInfo->type = VIR_DOMAIN_JOB_FAILED;
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
return -2;
- } else if (jobInfo->type == VIR_DOMAIN_JOB_COMPLETED) {
- jobInfo->type = VIR_DOMAIN_JOB_FAILED;
+ } else if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_COMPLETED) {
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
return -1;
} else {
return -1;
@@ -1542,7 +1540,7 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver,
flags |= QEMU_MIGRATION_COMPLETED_UPDATE_STATS;
- jobInfo->type = VIR_DOMAIN_JOB_UNBOUNDED;
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_ACTIVE;
while ((rv = qemuMigrationCompleted(driver, vm, asyncJob,
dconn, flags)) != 1) {
if (rv < 0)
@@ -1550,7 +1548,7 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver,
if (events) {
if (virDomainObjWait(vm) < 0) {
- jobInfo->type = VIR_DOMAIN_JOB_FAILED;
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
return -2;
}
} else {
@@ -3719,7 +3717,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
* as this is a critical section so we are guaranteed
* priv->job.abortJob will not change */
ignore_value(qemuDomainObjExitMonitor(driver, vm));
- priv->job.current->type = VIR_DOMAIN_JOB_CANCELLED;
+ priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_CANCELED;
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
_("canceled by client"));
@@ -3853,8 +3851,8 @@ qemuMigrationRun(virQEMUDriverPtr driver,
ignore_value(virTimeMillisNow(&priv->job.completed->sent));
}
- if (priv->job.current->type == VIR_DOMAIN_JOB_UNBOUNDED &&
!inPostCopy)
- priv->job.current->type = VIR_DOMAIN_JOB_FAILED;
+ if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE &&
!inPostCopy)
+ priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
cookieFlags |= QEMU_MIGRATION_COOKIE_NETWORK |
QEMU_MIGRATION_COOKIE_STATS;
@@ -3896,7 +3894,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
goto cleanup;
cancelPostCopy:
- priv->job.current->type = VIR_DOMAIN_JOB_FAILED;
+ priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
if (inPostCopy)
goto cancel;
else
@@ -5607,7 +5605,7 @@ qemuMigrationJobStart(virQEMUDriverPtr driver,
JOB_MASK(QEMU_JOB_MIGRATION_OP)));
}
- priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
+ priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_ACTIVE;
return 0;
}
diff --git a/src/qemu/qemu_migration_cookie.c b/src/qemu/qemu_migration_cookie.c
index ae56569..afe8682 100644
--- a/src/qemu/qemu_migration_cookie.c
+++ b/src/qemu/qemu_migration_cookie.c
@@ -953,7 +953,7 @@ qemuMigrationCookieStatisticsXMLParse(xmlXPathContextPtr ctxt)
goto cleanup;
stats = &jobInfo->stats;
- jobInfo->type = VIR_DOMAIN_JOB_COMPLETED;
+ jobInfo->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
virXPathULongLong("string(./started[1])", ctxt, &jobInfo->started);
virXPathULongLong("string(./stopped[1])", ctxt, &jobInfo->stopped);
diff --git a/src/qemu/qemu_process.c b/src/qemu/qemu_process.c
index 5e119a2..1f1e2dc 100644
--- a/src/qemu/qemu_process.c
+++ b/src/qemu/qemu_process.c
@@ -4151,7 +4151,7 @@ qemuProcessBeginJob(virQEMUDriverPtr driver,
return -1;
qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
- priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
+ priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_ACTIVE;
return 0;
}
--
1.8.3.1