[GSoC][PATCH v2 1/6] qemu_domain: Added `qemuDomainJobInfo` to domainJob's `privateData`

Erik Skultety eskultet at redhat.com
Tue Aug 18 07:56:02 UTC 2020


On Mon, Aug 17, 2020 at 10:37:16AM +0530, Prathamesh Chavan wrote:
> As `qemuDomainJobInfo` had attributes specific to qemu hypervisor's
> jobs, we moved the attribute `current` and `completed` from
> `qemuDomainJobObj` to its `privateData` structure.
> 
> In this process, two callback functions: `setJobInfoOperation`
> and `currentJobInfoInit` were introduced to qemuDomainJob's
> callback structure.
> 
> Signed-off-by: Prathamesh Chavan <pc44800 at gmail.com>
> ---
>  src/qemu/qemu_backup.c           |  22 +-
>  src/qemu/qemu_domain.c           | 498 +++++++++++++++++++++++++++++++
>  src/qemu/qemu_domain.h           |  74 +++++
>  src/qemu/qemu_domainjob.c        | 483 +-----------------------------
>  src/qemu/qemu_domainjob.h        |  81 +----
>  src/qemu/qemu_driver.c           |  49 +--
>  src/qemu/qemu_migration.c        |  62 ++--
>  src/qemu/qemu_migration_cookie.c |   8 +-
>  src/qemu/qemu_process.c          |  32 +-
>  9 files changed, 680 insertions(+), 629 deletions(-)
> 
> diff --git a/src/qemu/qemu_backup.c b/src/qemu/qemu_backup.c
> index a402730d38..1822c6f267 100644
> --- a/src/qemu/qemu_backup.c
> +++ b/src/qemu/qemu_backup.c
> @@ -529,20 +529,21 @@ qemuBackupJobTerminate(virDomainObjPtr vm,
>  
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
> +    qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
>      size_t i;
>  
> -    qemuDomainJobInfoUpdateTime(priv->job.current);
> +    qemuDomainJobInfoUpdateTime(jobPriv->current);
>  
> -    g_clear_pointer(&priv->job.completed, qemuDomainJobInfoFree);
> -    priv->job.completed = qemuDomainJobInfoCopy(priv->job.current);
> +    g_clear_pointer(&jobPriv->completed, qemuDomainJobInfoFree);
> +    jobPriv->completed = qemuDomainJobInfoCopy(jobPriv->current);
>  
> -    priv->job.completed->stats.backup.total = priv->backup->push_total;
> -    priv->job.completed->stats.backup.transferred = priv->backup->push_transferred;
> -    priv->job.completed->stats.backup.tmp_used = priv->backup->pull_tmp_used;
> -    priv->job.completed->stats.backup.tmp_total = priv->backup->pull_tmp_total;
> +    jobPriv->completed->stats.backup.total = priv->backup->push_total;
> +    jobPriv->completed->stats.backup.transferred = priv->backup->push_transferred;
> +    jobPriv->completed->stats.backup.tmp_used = priv->backup->pull_tmp_used;
> +    jobPriv->completed->stats.backup.tmp_total = priv->backup->pull_tmp_total;
>  
> -    priv->job.completed->status = jobstatus;
> -    priv->job.completed->errmsg = g_strdup(priv->backup->errmsg);
> +    jobPriv->completed->status = jobstatus;
> +    jobPriv->completed->errmsg = g_strdup(priv->backup->errmsg);
>  
>      qemuDomainEventEmitJobCompleted(priv->driver, vm);
>  
> @@ -694,6 +695,7 @@ qemuBackupBegin(virDomainObjPtr vm,
>                  unsigned int flags)
>  {
>      qemuDomainObjPrivatePtr priv = vm->privateData;
> +    qemuDomainJobPrivatePtr jobPriv = priv->job.privateData;
>      g_autoptr(virQEMUDriverConfig) cfg = virQEMUDriverGetConfig(priv->driver);
>      g_autoptr(virDomainBackupDef) def = NULL;
>      g_autofree char *suffix = NULL;
> @@ -745,7 +747,7 @@ qemuBackupBegin(virDomainObjPtr vm,
>      qemuDomainObjSetAsyncJobMask(vm, (QEMU_JOB_DEFAULT_MASK |
>                                        JOB_MASK(QEMU_JOB_SUSPEND) |
>                                        JOB_MASK(QEMU_JOB_MODIFY)));
> -    priv->job.current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_BACKUP;
> +    jobPriv->current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_BACKUP;
>  
>      if (!virDomainObjIsActive(vm)) {
>          virReportError(VIR_ERR_OPERATION_UNSUPPORTED, "%s",

You could perform changes such as the ones ^above in a separate patch, while...

[snip]

> +
> +
> +int
> +qemuDomainJobInfoToInfo(qemuDomainJobInfoPtr jobInfo,
> +                        virDomainJobInfoPtr info)
> +{
> +    info->type = qemuDomainJobStatusToType(jobInfo->status);
> +    info->timeElapsed = jobInfo->timeElapsed;
> +
> +    switch (jobInfo->statsType) {
> +    case QEMU_DOMAIN_JOB_STATS_TYPE_MIGRATION:
> +        info->memTotal = jobInfo->stats.mig.ram_total;
> +        info->memRemaining = jobInfo->stats.mig.ram_remaining;
> +        info->memProcessed = jobInfo->stats.mig.ram_transferred;
> +        info->fileTotal = jobInfo->stats.mig.disk_total +
> +                          jobInfo->mirrorStats.total;
> +        info->fileRemaining = jobInfo->stats.mig.disk_remaining +
> +                              (jobInfo->mirrorStats.total -
> +                               jobInfo->mirrorStats.transferred);
> +        info->fileProcessed = jobInfo->stats.mig.disk_transferred +
> +                              jobInfo->mirrorStats.transferred;
> +        break;
> +
> +    case QEMU_DOMAIN_JOB_STATS_TYPE_SAVEDUMP:
> +        info->memTotal = jobInfo->stats.mig.ram_total;
> +        info->memRemaining = jobInfo->stats.mig.ram_remaining;
> +        info->memProcessed = jobInfo->stats.mig.ram_transferred;
> +        break;
> +
> +    case QEMU_DOMAIN_JOB_STATS_TYPE_MEMDUMP:
> +        info->memTotal = jobInfo->stats.dump.total;
> +        info->memProcessed = jobInfo->stats.dump.completed;
> +        info->memRemaining = info->memTotal - info->memProcessed;
> +        break;
> +
> +    case QEMU_DOMAIN_JOB_STATS_TYPE_BACKUP:
> +        info->fileTotal = jobInfo->stats.backup.total;
> +        info->fileProcessed = jobInfo->stats.backup.transferred;
> +        info->fileRemaining = info->fileTotal - info->fileProcessed;
> +        break;
> +
> +    case QEMU_DOMAIN_JOB_STATS_TYPE_NONE:
> +        break;
> +    }
> +
> +    info->dataTotal = info->memTotal + info->fileTotal;
> +    info->dataRemaining = info->memRemaining + info->fileRemaining;
> +    info->dataProcessed = info->memProcessed + info->fileProcessed;
> +
> +    return 0;
> +}

...moving helper functions like ^this one in the current patch, if...

[snip]

> diff --git a/src/qemu/qemu_domain.h b/src/qemu/qemu_domain.h
> index 3a1bcbbfa3..386ae17272 100644
> --- a/src/qemu/qemu_domain.h
> +++ b/src/qemu/qemu_domain.h
> @@ -483,6 +483,52 @@ struct _qemuDomainXmlNsDef {
>      char **capsdel;
>  };
>  
> +typedef struct _qemuDomainMirrorStats qemuDomainMirrorStats;
> +typedef qemuDomainMirrorStats *qemuDomainMirrorStatsPtr;
> +struct _qemuDomainMirrorStats {
> +    unsigned long long transferred;
> +    unsigned long long total;
> +};
> +
> +typedef struct _qemuDomainBackupStats qemuDomainBackupStats;
> +struct _qemuDomainBackupStats {
> +    unsigned long long transferred;
> +    unsigned long long total;
> +    unsigned long long tmp_used;
> +    unsigned long long tmp_total;
> +};
> +
> +typedef struct _qemuDomainJobInfo qemuDomainJobInfo;
> +typedef qemuDomainJobInfo *qemuDomainJobInfoPtr;
> +struct _qemuDomainJobInfo {
> +    qemuDomainJobStatus status;
> +    virDomainJobOperation operation;
> +    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
> +                                destination (only for migrations). */
> +    unsigned long long received; /* When the destination host received status
> +                                    info from the source (migrations only). */
> +    /* Computed values */
> +    unsigned long long timeElapsed;
> +    long long timeDelta; /* delta = received - sent, i.e., the difference
> +                            between the source and the destination time plus
> +                            the time between the end of Perform phase on the
> +                            source and the beginning of Finish phase on the
> +                            destination. */
> +    bool timeDeltaSet;
> +    /* Raw values from QEMU */
> +    qemuDomainJobStatsType statsType;
> +    union {
> +        qemuMonitorMigrationStats mig;
> +        qemuMonitorDumpStats dump;
> +        qemuDomainBackupStats backup;
> +    } stats;
> +    qemuDomainMirrorStats mirrorStats;
> +
> +    char *errmsg; /* optional error message for failed completed jobs */
> +};
> +

...you keep ^these structures in qemu_domainjob.h in patch 1, as qemu_domain.h
includes qemu_domainjob.h, so all the functions that you'd move would have the
symbol.
Then, in patch 2 you'd move the structures themselves and perform changes like
the ones below for example.

> @@ -3330,7 +3333,7 @@ qemuDomainSaveInternal(virQEMUDriverPtr driver,
>          goto endjob;
>      }
>  
> -    priv->job.current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_SAVEDUMP;
> +    jobPriv->current->statsType = QEMU_DOMAIN_JOB_STATS_TYPE_SAVEDUMP;
>  
>      /* Pause */
>      if (virDomainObjGetState(vm, NULL) == VIR_DOMAIN_RUNNING) {
> @@ -3715,7 +3718,7 @@ qemuDumpWaitForCompletion(virDomainObjPtr vm)
>              return -1;
>      }
>  
> -    if (priv->job.current->stats.dump.status == QEMU_MONITOR_DUMP_STATUS_FAILED) {
> +    if (jobPriv->current->stats.dump.status == QEMU_MONITOR_DUMP_STATUS_FAILED) {
>          if (priv->job.error)
>              virReportError(VIR_ERR_OPERATION_FAILED,
>                             _("memory-only dump failed: %s"),

Regards,
Erik




More information about the libvir-list mailing list