diff mbox

[v5,08/12] qemu-img: Enable progress output for commit

Message ID 1397771992-31126-9-git-send-email-mreitz@redhat.com
State New
Headers show

Commit Message

Max Reitz April 17, 2014, 9:59 p.m. UTC
Implement progress output for the commit command by querying the
progress of the block job.

Signed-off-by: Max Reitz <mreitz@redhat.com>
---
 qemu-img-cmds.hx |  4 ++--
 qemu-img.c       | 24 ++++++++++++++++++++++--
 qemu-img.texi    |  2 +-
 3 files changed, 25 insertions(+), 5 deletions(-)

Comments

Eric Blake April 22, 2014, 3:23 p.m. UTC | #1
On 04/17/2014 03:59 PM, Max Reitz wrote:
> Implement progress output for the commit command by querying the
> progress of the block job.
> 
> Signed-off-by: Max Reitz <mreitz@redhat.com>
> ---
>  qemu-img-cmds.hx |  4 ++--
>  qemu-img.c       | 24 ++++++++++++++++++++++--
>  qemu-img.texi    |  2 +-
>  3 files changed, 25 insertions(+), 5 deletions(-)
> 

> +
> +    /* A block job may finish instantanously without publishing any progress,

s/instantanously/instantaneously/


> @@ -733,7 +739,7 @@ static int img_commit(int argc, char **argv)
>      fmt = NULL;
>      cache = BDRV_DEFAULT_CACHE;
>      for(;;) {
> -        c = getopt(argc, argv, "f:ht:q");
> +        c = getopt(argc, argv, "f:ht:qp");

Here, 'p' is last,...

>          if (c == -1) {
>              break;
>          }
> @@ -748,11 +754,20 @@ static int img_commit(int argc, char **argv)
>          case 't':
>              cache = optarg;
>              break;
> +        case 'p':
> +            progress = true;
> +            break;
>          case 'q':

...but here, 'q' is last.  The OCD side of me likes to list getopt()
arguments in the same order as the case statements in order to more
easily map the two to each other and ensure we aren't missing anything
(the truly OCD person insists on sorting things alphabetically, or at
least case-insensitively).  As order doesn't actually matter to the
compiler, it doesn't invalidate this patch; but something to consider if
you respin for other reasons.  :)
Max Reitz April 22, 2014, 4:24 p.m. UTC | #2
On 22.04.2014 17:23, Eric Blake wrote:
> On 04/17/2014 03:59 PM, Max Reitz wrote:
>> Implement progress output for the commit command by querying the
>> progress of the block job.
>>
>> Signed-off-by: Max Reitz <mreitz@redhat.com>
>> ---
>>   qemu-img-cmds.hx |  4 ++--
>>   qemu-img.c       | 24 ++++++++++++++++++++++--
>>   qemu-img.texi    |  2 +-
>>   3 files changed, 25 insertions(+), 5 deletions(-)
>>
>> +
>> +    /* A block job may finish instantanously without publishing any progress,
> s/instantanously/instantaneously/

When I looked it up I wrote it correctly. *g*

>> @@ -733,7 +739,7 @@ static int img_commit(int argc, char **argv)
>>       fmt = NULL;
>>       cache = BDRV_DEFAULT_CACHE;
>>       for(;;) {
>> -        c = getopt(argc, argv, "f:ht:q");
>> +        c = getopt(argc, argv, "f:ht:qp");
> Here, 'p' is last,...
>
>>           if (c == -1) {
>>               break;
>>           }
>> @@ -748,11 +754,20 @@ static int img_commit(int argc, char **argv)
>>           case 't':
>>               cache = optarg;
>>               break;
>> +        case 'p':
>> +            progress = true;
>> +            break;
>>           case 'q':
> ...but here, 'q' is last.  The OCD side of me likes to list getopt()
> arguments in the same order as the case statements in order to more
> easily map the two to each other and ensure we aren't missing anything
> (the truly OCD person insists on sorting things alphabetically, or at
> least case-insensitively).  As order doesn't actually matter to the
> compiler, it doesn't invalidate this patch; but something to consider if
> you respin for other reasons.  :)

I'll put p in front of q in getopt, as that is the smaller change. On 
the other hand, I guess I should consider keeping my code OCD hostile, 
so people will have a longer and closer look at it. *g*

Max
diff mbox

Patch

diff --git a/qemu-img-cmds.hx b/qemu-img-cmds.hx
index d029609..8bc55cd 100644
--- a/qemu-img-cmds.hx
+++ b/qemu-img-cmds.hx
@@ -22,9 +22,9 @@  STEXI
 ETEXI
 
 DEF("commit", img_commit,
-    "commit [-q] [-f fmt] [-t cache] filename")
+    "commit [-q] [-f fmt] [-t cache] [-p] filename")
 STEXI
-@item commit [-q] [-f @var{fmt}] [-t @var{cache}] @var{filename}
+@item commit [-q] [-f @var{fmt}] [-t @var{cache}] [-p] @var{filename}
 ETEXI
 
 DEF("compare", img_compare,
diff --git a/qemu-img.c b/qemu-img.c
index 42616da..0d65fed 100644
--- a/qemu-img.c
+++ b/qemu-img.c
@@ -710,12 +710,18 @@  static void run_block_job(BlockJob *job, Error **errp)
     do {
         qemu_aio_wait();
 
+        qemu_progress_print((float)job->offset / job->len * 100.f, 0);
+
         if (!job->busy && !job->ready) {
             block_job_resume(job);
         }
     } while (!job->ready);
 
     block_job_complete_sync(job, errp);
+
+    /* A block job may finish instantanously without publishing any progress,
+     * so just signal completion here */
+    qemu_progress_print(100.f, 0);
 }
 
 static int img_commit(int argc, char **argv)
@@ -723,7 +729,7 @@  static int img_commit(int argc, char **argv)
     int c, ret, flags;
     const char *filename, *fmt, *cache;
     BlockDriverState *bs, *base_bs, *backing_bs;
-    bool quiet = false;
+    bool progress = false, quiet = false;
     Error *local_err = NULL;
     CommonBlockJobCBInfo cbi;
     BackingList *bl_element, *bl_next;
@@ -733,7 +739,7 @@  static int img_commit(int argc, char **argv)
     fmt = NULL;
     cache = BDRV_DEFAULT_CACHE;
     for(;;) {
-        c = getopt(argc, argv, "f:ht:q");
+        c = getopt(argc, argv, "f:ht:qp");
         if (c == -1) {
             break;
         }
@@ -748,11 +754,20 @@  static int img_commit(int argc, char **argv)
         case 't':
             cache = optarg;
             break;
+        case 'p':
+            progress = true;
+            break;
         case 'q':
             quiet = true;
             break;
         }
     }
+
+    /* Progress is not shown in Quiet mode */
+    if (quiet) {
+        progress = false;
+    }
+
     if (optind != argc - 1) {
         help();
     }
@@ -770,6 +785,9 @@  static int img_commit(int argc, char **argv)
         return 1;
     }
 
+    qemu_progress_init(progress, 1.f);
+    qemu_progress_print(0.f, 100);
+
     /* This is different from QMP, which by default uses the deepest file in the
      * backing chain (i.e., the very base); however, the traditional behavior of
      * qemu-img commit is using the immediate backing file. */
@@ -866,6 +884,8 @@  free_backing_list:
     }
 
 done:
+    qemu_progress_end();
+
     bdrv_unref(bs);
 
     if (local_err) {
diff --git a/qemu-img.texi b/qemu-img.texi
index f84590e..1a9c08f 100644
--- a/qemu-img.texi
+++ b/qemu-img.texi
@@ -140,7 +140,7 @@  this case. @var{backing_file} will never be modified unless you use the
 The size can also be specified using the @var{size} option with @code{-o},
 it doesn't need to be specified separately in this case.
 
-@item commit [-f @var{fmt}] [-t @var{cache}] @var{filename}
+@item commit [-q] [-f @var{fmt}] [-t @var{cache}] [-p] @var{filename}
 
 Commit the changes recorded in @var{filename} in its base image or backing file.
 If the backing file is smaller than the snapshot, then the backing file will be