job: refactor progress to separate object

We need it in separate to pass to the block-copy object in the next
commit.

Cc: qemu-stable@nongnu.org
Signed-off-by: Vladimir Sementsov-Ogievskiy <vsementsov@virtuozzo.com>
Reviewed-by: Andrey Shinkevich <andrey.shinkevich@virtuozzo.com>
Reviewed-by: Max Reitz <mreitz@redhat.com>
Message-Id: <20200311103004.7649-2-vsementsov@virtuozzo.com>
Signed-off-by: Max Reitz <mreitz@redhat.com>
This commit is contained in:
Vladimir Sementsov-Ogievskiy 2020-03-11 13:29:56 +03:00 committed by Max Reitz
parent e7266570f2
commit 01fe1ca945
6 changed files with 76 additions and 25 deletions

View File

@ -299,8 +299,8 @@ BlockJobInfo *block_job_query(BlockJob *job, Error **errp)
info->device = g_strdup(job->job.id); info->device = g_strdup(job->job.id);
info->busy = atomic_read(&job->job.busy); info->busy = atomic_read(&job->job.busy);
info->paused = job->job.pause_count > 0; info->paused = job->job.pause_count > 0;
info->offset = job->job.progress_current; info->offset = job->job.progress.current;
info->len = job->job.progress_total; info->len = job->job.progress.total;
info->speed = job->speed; info->speed = job->speed;
info->io_status = job->iostatus; info->io_status = job->iostatus;
info->ready = job_is_ready(&job->job), info->ready = job_is_ready(&job->job),
@ -330,8 +330,8 @@ static void block_job_event_cancelled(Notifier *n, void *opaque)
qapi_event_send_block_job_cancelled(job_type(&job->job), qapi_event_send_block_job_cancelled(job_type(&job->job),
job->job.id, job->job.id,
job->job.progress_total, job->job.progress.total,
job->job.progress_current, job->job.progress.current,
job->speed); job->speed);
} }
@ -350,8 +350,8 @@ static void block_job_event_completed(Notifier *n, void *opaque)
qapi_event_send_block_job_completed(job_type(&job->job), qapi_event_send_block_job_completed(job_type(&job->job),
job->job.id, job->job.id,
job->job.progress_total, job->job.progress.total,
job->job.progress_current, job->job.progress.current,
job->speed, job->speed,
!!msg, !!msg,
msg); msg);
@ -379,8 +379,8 @@ static void block_job_event_ready(Notifier *n, void *opaque)
qapi_event_send_block_job_ready(job_type(&job->job), qapi_event_send_block_job_ready(job_type(&job->job),
job->job.id, job->job.id,
job->job.progress_total, job->job.progress.total,
job->job.progress_current, job->job.progress.current,
job->speed); job->speed);
} }

View File

@ -28,6 +28,7 @@
#include "qapi/qapi-types-job.h" #include "qapi/qapi-types-job.h"
#include "qemu/queue.h" #include "qemu/queue.h"
#include "qemu/progress_meter.h"
#include "qemu/coroutine.h" #include "qemu/coroutine.h"
#include "block/aio.h" #include "block/aio.h"
@ -117,15 +118,7 @@ typedef struct Job {
/** True if this job should automatically dismiss itself */ /** True if this job should automatically dismiss itself */
bool auto_dismiss; bool auto_dismiss;
/** ProgressMeter progress;
* Current progress. The unit is arbitrary as long as the ratio between
* progress_current and progress_total represents the estimated percentage
* of work already done.
*/
int64_t progress_current;
/** Estimated progress_current value at the completion of the job */
int64_t progress_total;
/** /**
* Return code from @run and/or @prepare callback(s). * Return code from @run and/or @prepare callback(s).

View File

@ -0,0 +1,58 @@
/*
* Helper functionality for some process progress tracking.
*
* Copyright (c) 2011 IBM Corp.
* Copyright (c) 2012, 2018 Red Hat, Inc.
* Copyright (c) 2020 Virtuozzo International GmbH
*
* Permission is hereby granted, free of charge, to any person obtaining a copy
* of this software and associated documentation files (the "Software"), to deal
* in the Software without restriction, including without limitation the rights
* to use, copy, modify, merge, publish, distribute, sublicense, and/or sell
* copies of the Software, and to permit persons to whom the Software is
* furnished to do so, subject to the following conditions:
*
* The above copyright notice and this permission notice shall be included in
* all copies or substantial portions of the Software.
*
* THE SOFTWARE IS PROVIDED "AS IS", WITHOUT WARRANTY OF ANY KIND, EXPRESS OR
* IMPLIED, INCLUDING BUT NOT LIMITED TO THE WARRANTIES OF MERCHANTABILITY,
* FITNESS FOR A PARTICULAR PURPOSE AND NONINFRINGEMENT. IN NO EVENT SHALL
* THE AUTHORS OR COPYRIGHT HOLDERS BE LIABLE FOR ANY CLAIM, DAMAGES OR OTHER
* LIABILITY, WHETHER IN AN ACTION OF CONTRACT, TORT OR OTHERWISE, ARISING FROM,
* OUT OF OR IN CONNECTION WITH THE SOFTWARE OR THE USE OR OTHER DEALINGS IN
* THE SOFTWARE.
*/
#ifndef QEMU_PROGRESS_METER_H
#define QEMU_PROGRESS_METER_H
typedef struct ProgressMeter {
/**
* Current progress. The unit is arbitrary as long as the ratio between
* current and total represents the estimated percentage
* of work already done.
*/
uint64_t current;
/** Estimated current value at the completion of the process */
uint64_t total;
} ProgressMeter;
static inline void progress_work_done(ProgressMeter *pm, uint64_t done)
{
pm->current += done;
}
static inline void progress_set_remaining(ProgressMeter *pm, uint64_t remaining)
{
pm->total = pm->current + remaining;
}
static inline void progress_increase_remaining(ProgressMeter *pm,
uint64_t delta)
{
pm->total += delta;
}
#endif /* QEMU_PROGRESS_METER_H */

View File

@ -143,8 +143,8 @@ static JobInfo *job_query_single(Job *job, Error **errp)
.id = g_strdup(job->id), .id = g_strdup(job->id),
.type = job_type(job), .type = job_type(job),
.status = job->status, .status = job->status,
.current_progress = job->progress_current, .current_progress = job->progress.current,
.total_progress = job->progress_total, .total_progress = job->progress.total,
.has_error = !!job->err, .has_error = !!job->err,
.error = job->err ? \ .error = job->err ? \
g_strdup(error_get_pretty(job->err)) : NULL, g_strdup(error_get_pretty(job->err)) : NULL,

6
job.c
View File

@ -369,17 +369,17 @@ void job_unref(Job *job)
void job_progress_update(Job *job, uint64_t done) void job_progress_update(Job *job, uint64_t done)
{ {
job->progress_current += done; progress_work_done(&job->progress, done);
} }
void job_progress_set_remaining(Job *job, uint64_t remaining) void job_progress_set_remaining(Job *job, uint64_t remaining)
{ {
job->progress_total = job->progress_current + remaining; progress_set_remaining(&job->progress, remaining);
} }
void job_progress_increase_remaining(Job *job, uint64_t delta) void job_progress_increase_remaining(Job *job, uint64_t delta)
{ {
job->progress_total += delta; progress_increase_remaining(&job->progress, delta);
} }
void job_event_cancelled(Job *job) void job_event_cancelled(Job *job)

View File

@ -884,9 +884,9 @@ static void run_block_job(BlockJob *job, Error **errp)
do { do {
float progress = 0.0f; float progress = 0.0f;
aio_poll(aio_context, true); aio_poll(aio_context, true);
if (job->job.progress_total) { if (job->job.progress.total) {
progress = (float)job->job.progress_current / progress = (float)job->job.progress.current /
job->job.progress_total * 100.f; job->job.progress.total * 100.f;
} }
qemu_progress_print(progress, 0); qemu_progress_print(progress, 0);
} while (!job_is_ready(&job->job) && !job_is_completed(&job->job)); } while (!job_is_ready(&job->job) && !job_is_completed(&job->job));