[libvirt] [PATCH v2 07/10] virsh: expose new active commit controls

Peter Krempa pkrempa at redhat.com
Fri Jun 6 11:57:46 UTC 2014


On 06/06/14 00:52, Eric Blake wrote:
> Add knobs to virsh to manage a 2-phase active commit of the top
> layer, similar to knobs already present on blockcopy.  While this
> code will fail until later patches actually implement the new
> knobs in the qemu driver, doing it now proves that the API is
> usable and also makes it easier for testing the qemu changes as
> they are made.
> 
> * tools/virsh-domain.c (cmdBlockCommit): Add --active, --pivot,
> and --finish options, modeled after blockcopy.
> (blockJobImpl): Support --active flag.
> * tools/virsh.pod (blockcommit): Document new flags.
> (blockjob): Mention 2-phase commit interaction.
> 
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---
>  tools/virsh-domain.c | 54 ++++++++++++++++++++++++++++++++++++++++++++++++++--
>  tools/virsh.pod      | 27 +++++++++++++++++++-------
>  2 files changed, 72 insertions(+), 9 deletions(-)
> 
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c
> index 6da8a17..a879316 100644
> --- a/tools/virsh-domain.c
> +++ b/tools/virsh-domain.c

> @@ -1608,6 +1615,14 @@ static const vshCmdOptDef opts_block_commit[] = {
>       .type = VSH_OT_INT,
>       .help = N_("with --wait, abort if copy exceeds timeout (in seconds)")
>      },
> +    {.name = "pivot",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("with --active --wait, pivot when commit is synced")
> +    },
> +    {.name = "finish",
> +     .type = VSH_OT_BOOL,
> +     .help = N_("with --active --wait, quit when commit is synced")

Finish seems a bit too generic ... shouldn't we go with something like
--keep-overlay or other more specific flag?

> +    },
>      {.name = "async",
>       .type = VSH_OT_BOOL,
>       .help = N_("with --wait, don't wait for cancel to finish")

> @@ -1709,7 +1744,22 @@ cmdBlockCommit(vshControl *ctl, const vshCmd *cmd)
>          /* printf [100 %] */
>          vshPrintJobProgress(_("Block Commit"), 0, 1);
>      }
> -    vshPrint(ctl, "\n%s", quit ? _("Commit aborted") : _("Commit complete"));
> +    if (!quit && pivot) {
> +        abort_flags |= VIR_DOMAIN_BLOCK_JOB_ABORT_PIVOT;
> +        if (virDomainBlockJobAbort(dom, path, abort_flags) < 0) {
> +            vshError(ctl, _("failed to pivot job for disk %s"), path);
> +            goto cleanup;
> +        }
> +    } else if (finish && !quit &&
> +               virDomainBlockJobAbort(dom, path, abort_flags) < 0) {
> +        vshError(ctl, _("failed to finish job for disk %s"), path);
> +        goto cleanup;
> +    }
> +    vshPrint(ctl, "\n%s",
> +             quit ? _("Commit aborted") :
> +             pivot ? _("Successfully pivoted") :
> +             !finish ? _("Now in synchronized phase") :
> +             _("Commit complete"));

Uhhh, embedded ternaries? Please change it to hierarchical if's or
something.

> 
>      ret = true;
>   cleanup:


> diff --git a/tools/virsh.pod b/tools/virsh.pod
> index 02671b4..fc81fac 100644
> --- a/tools/virsh.pod
> +++ b/tools/virsh.pod
> @@ -767,8 +767,9 @@ address of virtual interface (such as I<detach-interface> or
>  I<domif-setlink>) will accept the MAC address printed by this command.
> 
>  =item B<blockcommit> I<domain> I<path> [I<bandwidth>]
> -{[I<base>] | [I<--shallow>]} [I<top>] [I<--delete>]
> -[I<--wait> [I<--verbose>] [I<--timeout> B<seconds>] [I<--async>]]
> +{[I<base>] | [I<--shallow>]} [I<top>] [I<--delete>] [I<--active>]
> +[I<--wait> [I<--verbose>] [{I<--pivot> | I<--finish>}]
> +[I<--timeout> B<seconds>] [I<--async>]]
> 
>  Reduce the length of a backing image chain, by committing changes at the
>  top of the chain (snapshot or delta files) into backing images.  By
> @@ -778,8 +779,17 @@ operation is constrained to committing just that portion of the chain;
>  I<--shallow> can be used instead of I<base> to specify the immediate
>  backing file of the resulting top image to be committed.  The files
>  being committed are rendered invalid, possibly as soon as the operation
> -starts; using the I<--delete> flag will remove these files at the successful
> -completion of the commit operation.
> +starts; using the I<--delete> flag will attempt to remove these invalidated
> +files at the successful completion of the commit operation.
> +
> +When I<top> is omitted or specified as the active image, it is also
> +possible to specify I<--active> to trigger a two-phase active commit. In
> +the first phase, I<top> is copied into I<base> and the job can only be
> +canceled, with top still containing data not yet in base. In the second
> +phase, I<top> and I<base> remain identical until a call to B<blockjob>
> +with the I<--abort> flag (keeping top as the active image that tracks
> +changes from that point in time) or the I<--pivot> flag (making base
> +the new active image and invalidating top).
> 
>  By default, this command returns as soon as possible, and data for
>  the entire disk is committed in the background; the progress of the
> @@ -790,7 +800,10 @@ or SIGINT is sent (usually with C<Ctrl-C>).  Using I<--verbose> along
>  with I<--wait> will produce periodic status updates.  If job cancellation
>  is triggered, I<--async> will return control to the user as fast as
>  possible, otherwise the command may continue to block a little while
> -longer until the job is done cleaning up.
> +longer until the job is done cleaning up.  When I<--active> is used
> +alongside I<--wait>, then it is also possible to use I<--pivot> or
> +I<--finish> to end the job cleanly rather than leaving things in the

I'd drop cleanly. The synchronized state is "clean" too imho.

> +synchronized state.
> 
>  I<path> specifies fully-qualified path of the disk; it corresponds
>  to a unique target name (<target dev='name'/>) or source file (<source
> @@ -916,8 +929,8 @@ also B<domblklist> for listing these names).
>  If I<--abort> is specified, the active job on the specified disk will
>  be aborted.  If I<--async> is also specified, this command will return
>  immediately, rather than waiting for the cancellation to complete.  If
> -I<--pivot> is specified, this requests that an active copy job
> -be pivoted over to the new copy.
> +I<--pivot> is specified, this requests that an active copy or active
> +commit job be pivoted over to the new image.
>  If I<--info> is specified, the active job information on the specified
>  disk will be printed.
>  I<bandwidth> can be used to set bandwidth limit for the active job.
> 

We should discuss the --finish flag name a little bit more.

Peter

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 901 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libvir-list/attachments/20140606/82306d0b/attachment-0001.sig>


More information about the libvir-list mailing list