[Libguestfs] [nbdkit PATCH 1/2] sh, eval: Cache .can_zero and .can_flush

Eric Blake eblake at redhat.com
Thu Mar 19 12:09:32 UTC 2020


On 3/18/20 8:21 PM, Eric Blake wrote:
> In commit c306fa93ab and neighbors (v1.15.1), a concerted effort went
> into caching the results of .can_FOO callbacks, with commit messages
> demonstrating that a plugin with a slow callback should not have that
> delay magnified multiple times.  But nothing was added to the
> testsuite at the time, and with the sh and eval plugins, we still have
> two scenarios where we did not take advantage of the nbdkit cache
> because we directly called things ourselves (one pre-existing since
> v1.13.9, another introduced in v1.15.1 right after the cleanups).  Fix
> those spots by reworking the handle we pass to nbdkit, then enhance
> test-eflags.sh to ensure we don't regress again.
> 
> Note that nbdkit does not yet cache .thread_model; that will be
> addressed in the next patch.  Furthermore, we end up duplicating the
> caching that nbdkit itself does, because it would be a layering
> violation for us to have enough information to call into
> backend_can_flush().
> 
> Fixes: 05c5eed6f2
> Fixes: 8490694d08
> Signed-off-by: Eric Blake <eblake at redhat.com>
> ---


> @@ -457,8 +473,14 @@ int
>   sh_can_flush (void *handle)
>   {
>     const char *method = "can_flush";
> -  const char *script = get_script (method);
> -  return boolean_method (script, method, handle, 0);
> +  const char *script;
> +  struct sh_handle *h = handle;
> +
> +  if (h->can_flush >= 0)
> +    return h->can_flush;
> +
> +  script = get_script (method);
> +  return h->can_flush = boolean_method (script, method, handle, 0);
>   }

Thinking about this more, maybe the real problem is that all language 
bindings that have to wrap scripts (OCaml and Rust are exceptions as 
they directly call into the C code; but lua, perl, python, ruby, tcl, 
and sh all fit into the category I'm describing) MUST define .can_FOO at 
the C level because they don't know a priori whether the script they 
will be loading will also provide a .can_FOO callback, so we have a lot 
of duplicated code in each language binding.

Life might be easier if we change the C contract for the .can_FOO 
callbacks to support the special return value of -2 to behave the same 
as if .can_FOO were missing.  In a way, it would make it easier for the 
remaining languages to behave more like sh's special MISSING return 
value (sh is an oddball because we can't even probe whether .FOO is 
missing so .can_FOO is mandatory in the script; but in eval, python, 
etc, it's easy to implement a C binding for .can_FOO that introspects 
the script).  I'll spin up a v2 patch along those lines, so we can 
compare the difference.

-- 
Eric Blake, Principal Software Engineer
Red Hat, Inc.           +1-919-301-3226
Virtualization:  qemu.org | libvirt.org




More information about the Libguestfs mailing list