[Libguestfs] [PATCH nbdkit filters-v2 2/5] Introduce filters.

Richard W.M. Jones rjones at redhat.com
Fri Jan 19 17:12:17 UTC 2018


On Fri, Jan 19, 2018 at 10:22:27AM -0600, Eric Blake wrote:
> > +Suggestions for filters
> > +-----------------------
> >  
> >  * adding artificial delays (see wdelay/rdelay options in the file
> >    plugin)
> 
> How about a filter that intentionally disables WRITE_ZEROES and/or FUA
> support, if for no other reason than for testing sane fallbacks and
> comparing speed differences?

If you have ideas for the TODO file just go ahead and
commit them, no need for review.

> > +=head1 SYNOPSIS
> 
> > +To see example filters, take a look at the source of nbdkit, in the
> > +C<filters> directory.
> > +
> > +Filters must be written in C and must be fully thread safe.
> 
> Should we mention that the rules on filter semantics are stricter than
> for plugins, and that unlike plugins, we don't guarantee stable
> cross-version API?

Yes, we'll need to tighten up the language here.  I noted your other
patch which modified this text.

> > +=head1 CALLBACKS
> 
> > +=head2 C<.get_size>
> > +
> > + int64_t (*get_size) (struct nbdkit_next_ops *next_ops, void *nxdata,
> > +                      void *handle);
> > +
> > +This intercepts the plugin C<.get_size> method and can be used to read
> > +or modify the apparent size of the block device that the NBD client
> > +will see.
> > +
> > +The returned size must be E<ge> 0.  If there is an error, C<.get_size>
> > +should call C<nbdkit_error> with an error message and return C<-1>.
> 
> The rule on non-zero size matches plugins, but I'm not sure if there is
> a technical reason why we have that restriction.  Down the road, when I
> get the upstream NBD resize proposal finalized, I can see the ability to
> create an image with size 0, then use resize to update it, as something
> that would be nice to support.

OK that's interesting.  BTW qemu has historically had lots of bugs in
the block layer related to zero (or even < 4096 byte) devices.  We
added a workaround in libguestfs:

https://github.com/libguestfs/libguestfs/blob/a30b51747fc6605f50a9d5d8095fd2b6d1473b1c/lib/drives.c#L395

> > +
> > +=head2 C<.pread>
> > +
> > + int (*pread) (struct nbdkit_next_ops *next_ops, void *nxdata,
> > +               void *handle, void *buf, uint32_t count, uint64_t offset);
> 
> Wrong signature, missing the uint32_t flags that the backend interface
> has, and that I'm adding for plugins API_VERSION 2 for FUA support.

Right, but this patch is against the version 1 API.  We will need to
add flags at some point.

> > +=head1 THREADS
> > +
> > +Because filters can be mixed and used with any plugin and thus any
> > +threading model supported by L<nbdkit-plugin(3)>, filters must be
> > +thread safe.  They must be able to handle concurrent requests even on
> > +the same handle.
> > +
> > +Filters may have to use pthread primitives like mutexes to achieve
> > +this.
> 
> Would it ever make sense to allow a filter to intentionally request a
> lower concurrency level than the underlying plugin?  At connection time,
> you'd compute the threading level as the lowest level requested by any
> element of the chain; it might make it easier to write plugins that
> aren't fully parallel (such filters may penalize the speed that can
> otherwise be achieved by using the plugin in isolation - but again, it
> may be useful for testing).  That would imply adding a
> backend.thread_model() callback, which needs to be exposed to filters
> but not to plugins (plugins continue to use the #define at compile
> time); if the filter does not define the .thread_model callback, it
> defaults to fully-parallel; but if it does define the callback, it can
> result in something less concurrent.

Yes, this is a good idea actually.

> > +=item B<--filter> FILTER
> > +
> > +Add a filter before the plugin.  This option may be given one or more
> > +times to stack filters in front of the plugin.  They are processed in
> > +the order they appear on the command line.  See L</FILTERS> and
> > +L<nbdkit-filter(3)>.
> > +
> 
> Does it ever make sense to provide the same filter more than once on the
> command line?  Or are we stating that a given filter can only be used
> once in the chain?

I couldn't think of a case where we'd need the same filter multiple
times.  It could be made to work but we'd have to ban global
variables and modify the load() function.

Rich.

-- 
Richard Jones, Virtualization Group, Red Hat http://people.redhat.com/~rjones
Read my programming and virtualization blog: http://rwmj.wordpress.com
virt-df lists disk usage of guests without needing to install any
software inside the virtual machine.  Supports Linux and Windows.
http://people.redhat.com/~rjones/virt-df/




More information about the Libguestfs mailing list