mirror of
https://gitlab.com/libvirt/libvirt.git
synced 2025-03-07 17:28:15 +00:00
qemu: introduce qemu domain job status
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. Signed-off-by: Jiri Denemark <jdenemar@redhat.com>
This commit is contained in:
parent
16bf7619b8
commit
751a1c7f0a
@ -412,11 +412,34 @@ qemuDomainJobInfoUpdateDowntime(qemuDomainJobInfoPtr jobInfo)
|
|||||||
return 0;
|
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
|
int
|
||||||
qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
|
qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
|
||||||
virDomainJobInfoPtr info)
|
virDomainJobInfoPtr info)
|
||||||
{
|
{
|
||||||
info->type = jobInfo->type;
|
info->type = qemuDomainJobStatusToType(jobInfo->status);
|
||||||
info->timeElapsed = jobInfo->timeElapsed;
|
info->timeElapsed = jobInfo->timeElapsed;
|
||||||
|
|
||||||
info->memTotal = jobInfo->stats.ram_total;
|
info->memTotal = jobInfo->stats.ram_total;
|
||||||
@ -576,7 +599,7 @@ qemuDomainJobInfoToParams(qemuDomainJobInfoPtr jobInfo,
|
|||||||
stats->cpu_throttle_percentage) < 0)
|
stats->cpu_throttle_percentage) < 0)
|
||||||
goto error;
|
goto error;
|
||||||
|
|
||||||
*type = jobInfo->type;
|
*type = qemuDomainJobStatusToType(jobInfo->status);
|
||||||
*params = par;
|
*params = par;
|
||||||
*nparams = npar;
|
*nparams = npar;
|
||||||
return 0;
|
return 0;
|
||||||
|
@ -99,10 +99,18 @@ typedef enum {
|
|||||||
} qemuDomainAsyncJob;
|
} qemuDomainAsyncJob;
|
||||||
VIR_ENUM_DECL(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 struct _qemuDomainJobInfo qemuDomainJobInfo;
|
||||||
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
|
typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
|
||||||
struct _qemuDomainJobInfo {
|
struct _qemuDomainJobInfo {
|
||||||
virDomainJobType type;
|
qemuDomainJobStatus status;
|
||||||
virDomainJobOperation operation;
|
virDomainJobOperation operation;
|
||||||
unsigned long long started; /* When the async job started */
|
unsigned long long started; /* When the async job started */
|
||||||
unsigned long long stopped; /* When the domain's CPUs were stopped */
|
unsigned long long stopped; /* When the domain's CPUs were stopped */
|
||||||
|
@ -3310,7 +3310,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver, virDomainPtr dom,
|
|||||||
goto endjob;
|
goto endjob;
|
||||||
}
|
}
|
||||||
|
|
||||||
priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
|
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_ACTIVE;
|
||||||
|
|
||||||
/* Pause */
|
/* Pause */
|
||||||
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
|
if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
|
||||||
@ -13012,13 +13012,13 @@ qemuDomainGetJobStatsInternal(virQEMUDriverPtr driver,
|
|||||||
info = priv->job.current;
|
info = priv->job.current;
|
||||||
|
|
||||||
if (!info) {
|
if (!info) {
|
||||||
jobInfo->type = VIR_DOMAIN_JOB_NONE;
|
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_NONE;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
}
|
}
|
||||||
*jobInfo = *info;
|
*jobInfo = *info;
|
||||||
|
|
||||||
if (jobInfo->type == VIR_DOMAIN_JOB_UNBOUNDED) {
|
if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE) {
|
||||||
if (fetch)
|
if (fetch)
|
||||||
ret = qemuMigrationFetchJobStatus(driver, vm, QEMU_ASYNC_JOB_NONE,
|
ret = qemuMigrationFetchJobStatus(driver, vm, QEMU_ASYNC_JOB_NONE,
|
||||||
jobInfo);
|
jobInfo);
|
||||||
@ -13053,7 +13053,7 @@ qemuDomainGetJobInfo(virDomainPtr dom,
|
|||||||
if (qemuDomainGetJobStatsInternal(driver, vm, false, &jobInfo) < 0)
|
if (qemuDomainGetJobStatsInternal(driver, vm, false, &jobInfo) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (jobInfo.type == VIR_DOMAIN_JOB_NONE) {
|
if (jobInfo.status == QEMU_DOMAIN_JOB_STATUS_NONE) {
|
||||||
memset(info, 0, sizeof(*info));
|
memset(info, 0, sizeof(*info));
|
||||||
info->type = VIR_DOMAIN_JOB_NONE;
|
info->type = VIR_DOMAIN_JOB_NONE;
|
||||||
ret = 0;
|
ret = 0;
|
||||||
@ -13094,7 +13094,7 @@ qemuDomainGetJobStats(virDomainPtr dom,
|
|||||||
if (qemuDomainGetJobStatsInternal(driver, vm, completed, &jobInfo) < 0)
|
if (qemuDomainGetJobStatsInternal(driver, vm, completed, &jobInfo) < 0)
|
||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (jobInfo.type == VIR_DOMAIN_JOB_NONE) {
|
if (jobInfo.status == QEMU_DOMAIN_JOB_STATUS_NONE) {
|
||||||
*type = VIR_DOMAIN_JOB_NONE;
|
*type = VIR_DOMAIN_JOB_NONE;
|
||||||
*params = NULL;
|
*params = NULL;
|
||||||
*nparams = 0;
|
*nparams = 0;
|
||||||
|
@ -966,7 +966,7 @@ qemuMigrationDriveMirror(virQEMUDriverPtr driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
if (priv->job.abortJob) {
|
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"),
|
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
|
||||||
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
|
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
|
||||||
_("canceled by client"));
|
_("canceled by client"));
|
||||||
@ -1347,19 +1347,19 @@ qemuMigrationUpdateJobType(qemuDomainJobInfoPtr jobInfo)
|
|||||||
{
|
{
|
||||||
switch ((qemuMonitorMigrationStatus) jobInfo->stats.status) {
|
switch ((qemuMonitorMigrationStatus) jobInfo->stats.status) {
|
||||||
case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
|
case QEMU_MONITOR_MIGRATION_STATUS_COMPLETED:
|
||||||
jobInfo->type = VIR_DOMAIN_JOB_COMPLETED;
|
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_COMPLETED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
|
case QEMU_MONITOR_MIGRATION_STATUS_INACTIVE:
|
||||||
jobInfo->type = VIR_DOMAIN_JOB_NONE;
|
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_NONE;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QEMU_MONITOR_MIGRATION_STATUS_ERROR:
|
case QEMU_MONITOR_MIGRATION_STATUS_ERROR:
|
||||||
jobInfo->type = VIR_DOMAIN_JOB_FAILED;
|
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QEMU_MONITOR_MIGRATION_STATUS_CANCELLED:
|
case QEMU_MONITOR_MIGRATION_STATUS_CANCELLED:
|
||||||
jobInfo->type = VIR_DOMAIN_JOB_CANCELLED;
|
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_CANCELED;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
|
case QEMU_MONITOR_MIGRATION_STATUS_SETUP:
|
||||||
@ -1446,32 +1446,30 @@ qemuMigrationCheckJobStatus(virQEMUDriverPtr driver,
|
|||||||
else if (qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
|
else if (qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
switch (jobInfo->type) {
|
switch (jobInfo->status) {
|
||||||
case VIR_DOMAIN_JOB_NONE:
|
case QEMU_DOMAIN_JOB_STATUS_NONE:
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED, _("%s: %s"),
|
virReportError(VIR_ERR_OPERATION_FAILED, _("%s: %s"),
|
||||||
qemuMigrationJobName(vm), _("is not active"));
|
qemuMigrationJobName(vm), _("is not active"));
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
case VIR_DOMAIN_JOB_FAILED:
|
case QEMU_DOMAIN_JOB_STATUS_FAILED:
|
||||||
virReportError(VIR_ERR_OPERATION_FAILED, _("%s: %s"),
|
virReportError(VIR_ERR_OPERATION_FAILED, _("%s: %s"),
|
||||||
qemuMigrationJobName(vm), _("unexpectedly failed"));
|
qemuMigrationJobName(vm), _("unexpectedly failed"));
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
case VIR_DOMAIN_JOB_CANCELLED:
|
case QEMU_DOMAIN_JOB_STATUS_CANCELED:
|
||||||
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
|
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
|
||||||
qemuMigrationJobName(vm), _("canceled by client"));
|
qemuMigrationJobName(vm), _("canceled by client"));
|
||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
case VIR_DOMAIN_JOB_COMPLETED:
|
case QEMU_DOMAIN_JOB_STATUS_COMPLETED:
|
||||||
/* Fetch statistics of a completed migration */
|
/* Fetch statistics of a completed migration */
|
||||||
if (events && updateJobStats &&
|
if (events && updateJobStats &&
|
||||||
qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
|
qemuMigrationUpdateJobStatus(driver, vm, asyncJob) < 0)
|
||||||
return -1;
|
return -1;
|
||||||
break;
|
break;
|
||||||
|
|
||||||
case VIR_DOMAIN_JOB_BOUNDED:
|
case QEMU_DOMAIN_JOB_STATUS_ACTIVE:
|
||||||
case VIR_DOMAIN_JOB_UNBOUNDED:
|
|
||||||
case VIR_DOMAIN_JOB_LAST:
|
|
||||||
break;
|
break;
|
||||||
}
|
}
|
||||||
return 0;
|
return 0;
|
||||||
@ -1529,7 +1527,7 @@ qemuMigrationCompleted(virQEMUDriverPtr driver,
|
|||||||
* will continue waiting until the migrate state changes to completed.
|
* will continue waiting until the migrate state changes to completed.
|
||||||
*/
|
*/
|
||||||
if (flags & QEMU_MIGRATION_COMPLETED_POSTCOPY &&
|
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) {
|
jobInfo->stats.status == QEMU_MONITOR_MIGRATION_STATUS_POSTCOPY) {
|
||||||
VIR_DEBUG("Migration switched to post-copy");
|
VIR_DEBUG("Migration switched to post-copy");
|
||||||
if (updateStats &&
|
if (updateStats &&
|
||||||
@ -1538,18 +1536,18 @@ qemuMigrationCompleted(virQEMUDriverPtr driver,
|
|||||||
return 1;
|
return 1;
|
||||||
}
|
}
|
||||||
|
|
||||||
if (jobInfo->type == VIR_DOMAIN_JOB_COMPLETED)
|
if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_COMPLETED)
|
||||||
return 1;
|
return 1;
|
||||||
else
|
else
|
||||||
return 0;
|
return 0;
|
||||||
|
|
||||||
error:
|
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. */
|
/* 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;
|
return -2;
|
||||||
} else if (jobInfo->type == VIR_DOMAIN_JOB_COMPLETED) {
|
} else if (jobInfo->status == QEMU_DOMAIN_JOB_STATUS_COMPLETED) {
|
||||||
jobInfo->type = VIR_DOMAIN_JOB_FAILED;
|
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
|
||||||
return -1;
|
return -1;
|
||||||
} else {
|
} else {
|
||||||
return -1;
|
return -1;
|
||||||
@ -1574,7 +1572,7 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
flags |= QEMU_MIGRATION_COMPLETED_UPDATE_STATS;
|
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,
|
while ((rv = qemuMigrationCompleted(driver, vm, asyncJob,
|
||||||
dconn, flags)) != 1) {
|
dconn, flags)) != 1) {
|
||||||
if (rv < 0)
|
if (rv < 0)
|
||||||
@ -1582,7 +1580,7 @@ qemuMigrationWaitForCompletion(virQEMUDriverPtr driver,
|
|||||||
|
|
||||||
if (events) {
|
if (events) {
|
||||||
if (virDomainObjWait(vm) < 0) {
|
if (virDomainObjWait(vm) < 0) {
|
||||||
jobInfo->type = VIR_DOMAIN_JOB_FAILED;
|
jobInfo->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
|
||||||
return -2;
|
return -2;
|
||||||
}
|
}
|
||||||
} else {
|
} else {
|
||||||
@ -3756,7 +3754,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
* as this is a critical section so we are guaranteed
|
* as this is a critical section so we are guaranteed
|
||||||
* priv->job.abortJob will not change */
|
* priv->job.abortJob will not change */
|
||||||
ignore_value(qemuDomainObjExitMonitor(driver, vm));
|
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"),
|
virReportError(VIR_ERR_OPERATION_ABORTED, _("%s: %s"),
|
||||||
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
|
qemuDomainAsyncJobTypeToString(priv->job.asyncJob),
|
||||||
_("canceled by client"));
|
_("canceled by client"));
|
||||||
@ -3890,8 +3888,8 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
ignore_value(virTimeMillisNow(&priv->job.completed->sent));
|
ignore_value(virTimeMillisNow(&priv->job.completed->sent));
|
||||||
}
|
}
|
||||||
|
|
||||||
if (priv->job.current->type == VIR_DOMAIN_JOB_UNBOUNDED && !inPostCopy)
|
if (priv->job.current->status == QEMU_DOMAIN_JOB_STATUS_ACTIVE && !inPostCopy)
|
||||||
priv->job.current->type = VIR_DOMAIN_JOB_FAILED;
|
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
|
||||||
|
|
||||||
cookieFlags |= QEMU_MIGRATION_COOKIE_NETWORK |
|
cookieFlags |= QEMU_MIGRATION_COOKIE_NETWORK |
|
||||||
QEMU_MIGRATION_COOKIE_STATS;
|
QEMU_MIGRATION_COOKIE_STATS;
|
||||||
@ -3933,7 +3931,7 @@ qemuMigrationRun(virQEMUDriverPtr driver,
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
cancelPostCopy:
|
cancelPostCopy:
|
||||||
priv->job.current->type = VIR_DOMAIN_JOB_FAILED;
|
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_FAILED;
|
||||||
if (inPostCopy)
|
if (inPostCopy)
|
||||||
goto cancel;
|
goto cancel;
|
||||||
else
|
else
|
||||||
@ -5652,7 +5650,7 @@ qemuMigrationJobStart(virQEMUDriverPtr driver,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
qemuDomainObjSetAsyncJobMask(vm, mask);
|
qemuDomainObjSetAsyncJobMask(vm, mask);
|
||||||
priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
|
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_ACTIVE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
@ -974,7 +974,7 @@ qemuMigrationCookieStatisticsXMLParse(xmlXPathContextPtr ctxt)
|
|||||||
goto cleanup;
|
goto cleanup;
|
||||||
|
|
||||||
stats = &jobInfo->stats;
|
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(./started[1])", ctxt, &jobInfo->started);
|
||||||
virXPathULongLong("string(./stopped[1])", ctxt, &jobInfo->stopped);
|
virXPathULongLong("string(./stopped[1])", ctxt, &jobInfo->stopped);
|
||||||
|
@ -4000,7 +4000,7 @@ qemuProcessBeginJob(virQEMUDriverPtr driver,
|
|||||||
return -1;
|
return -1;
|
||||||
|
|
||||||
qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
|
qemuDomainObjSetAsyncJobMask(vm, QEMU_JOB_NONE);
|
||||||
priv->job.current->type = VIR_DOMAIN_JOB_UNBOUNDED;
|
priv->job.current->status = QEMU_DOMAIN_JOB_STATUS_ACTIVE;
|
||||||
|
|
||||||
return 0;
|
return 0;
|
||||||
}
|
}
|
||||||
|
Loading…
x
Reference in New Issue
Block a user