[Libguestfs] [virt-v2v PATCH 1/3] lib/nbdkit: add the "Nbdkit.with_connect_unix" helper function
Richard W.M. Jones
rjones at redhat.com
Wed Dec 8 15:18:54 UTC 2021
On Wed, Dec 08, 2021 at 01:20:48PM +0100, Laszlo Ersek wrote:
> Connecting to an NBD server temporarily, for a "one-shot" operation, is
> quite similar to "Std_utils.with_open_in" and "Std_utils.with_open_out",
> as there are cleanup operations regardless of whether the "one-shot"
> operation completes successfully or throws an exception.
>
> Introduce the "Nbdkit.with_connect_unix" function, which takes a Unix
> domain socket pathname, a list of metadata contexts to request from the
> NBD server, and calls a function with the live NBD server connection.
>
> Bugzilla: https://bugzilla.redhat.com/show_bug.cgi?id=2027598
> Signed-off-by: Laszlo Ersek <lersek at redhat.com>
> ---
> lib/Makefile.am | 2 +-
> lib/nbdkit.mli | 10 ++++++++++
> lib/nbdkit.ml | 12 ++++++++++++
> 3 files changed, 23 insertions(+), 1 deletion(-)
>
> diff --git a/lib/Makefile.am b/lib/Makefile.am
> index c274b9ecf6c7..1fab25b326f5 100644
> --- a/lib/Makefile.am
> +++ b/lib/Makefile.am
> @@ -80,7 +80,7 @@ BOBJECTS = config.cmo $(SOURCES_ML:.ml=.cmo)
> XOBJECTS = $(BOBJECTS:.cmo=.cmx)
>
> OCAMLPACKAGES = \
> - -package str,unix \
> + -package str,unix,nbd \
> -I $(builddir) \
> -I $(top_builddir)/common/mlgettext \
> -I $(top_builddir)/common/mlpcre \
> diff --git a/lib/nbdkit.mli b/lib/nbdkit.mli
> index ae19295186ed..825755e61dbe 100644
> --- a/lib/nbdkit.mli
> +++ b/lib/nbdkit.mli
> @@ -107,3 +107,13 @@ val run_unix : ?socket:string -> cmd -> string * int
> The --exit-with-parent, --foreground, --pidfile, --newstyle and
> --unix flags are added automatically. Other flags are set as
> in the {!cmd} struct. *)
> +
> +val with_connect_unix : socket:string ->
> + meta_contexts:string list ->
> + f:(NBD.t -> 'a) ->
> + 'a
> +(** [with_connect_unix socket meta_contexts f] calls function [f] with the NBD
> + server at Unix domain socket [socket] connected, and the metadata contexts
> + in [meta_contexts] requested (each of which is not necessarily supported by
> + the server though). The connection is torn down either on normal return or
> + if the function [f] throws an exception. *)
Interesting choice of module for this. nbdkit is a server. I would
have put it into lib/utils.mli or created a new module.
The function itself looks fine although personally I might have
abstracted the meta_context function to be a "do anything between
creation and connection" (let's call that "preparation"). What do you
think about:
val with_connect_unix : socket:string ->
?prepare:(NBD.t -> unit) ->
f:(NBD.t -> 'a) ->
'a
I think you would have to replace the List.iter line:
...
> + ~f:(fun () ->
(match prepare with Some pf -> pf nbd | None -> ());
> + NBD.connect_unix nbd socket;
> + protect
> + ~f:(fun () -> f nbd)
> + ~finally:(fun () -> NBD.shutdown nbd)
> + )
> + ~finally:(fun () -> NBD.close nbd)
It would be called like this:
let prepare nbd = NBD.add_meta_context nbd "base:allocation" in
with_connect_unix socket ~prepare (
fun () ->
(* the code *)
)
Hmm, maybe this is getting more complicated :-(
Rich.
--
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
libguestfs lets you edit virtual machines. Supports shell scripting,
bindings from many languages. http://libguestfs.org
More information about the Libguestfs
mailing list