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

Eric Blake eblake at redhat.com
Fri Jan 19 19:38:36 UTC 2018


On 01/19/2018 11:12 AM, Richard W.M. Jones wrote:

>>> +
>>> +=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.

So, do we ever want filters to be usable via version 1 instead of
version 2 backend API, or should we be aiming that all filters are
automatically version 2 from the point where we release this?  I'm fine
if we have some churn in .git by taking your patches with version 1
signatures then my FUA patches on top that converts to version 2; I'm
more worried that if we allow filters with version 1 semantics that we
may run into some interesting difficulties (not the least of which is
that a version 2 plugin that can support efficient FUA is inherently
penalized if it is used with a filter talking only version 1).


>>> +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.

Are you planning on writing that, or do you want me to take a shot at it?

> 
>>> +=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.

I can (sort of) see it if we support composition; but again, if
composition is done right, you still have just a single use of each
plugin per nbdkit process.  Let's say I want to access [0-100M) and
[200M-300M) of a given file via composition.  Here's a possible way to
write it:

nbdkit --filter=compose compose='--filter=offset offset=0 range=100M
file file=FILE' --filter=offset offset=200M range=100M file file=FILE

Is there a way to rewrite it so I don't have to nest quotes when doing
more than one composition?  If there is, then --filter=offset appears
twice, as does 'file file=FILE'.  But either way, under the hood, we'd
implement it as two separate nbdkit processes if composition is a filter:

nbdkit --> compose --> offset 0/100 --> file
                   \-> nbd ==> nbdkit --> offset 200/100 --> file

where -> is the backend chain, and ==> is an NBD socket.

Or maybe composition is a plugin, in which case it might look more like:

nbdkit compose sub='--filter=offset offset=0 range=100M file file=FILE'
sub='--filter=offset offset=200M range=100M file file=FILE'

(Can config even accept the same key= with different values more than
once on the command line?)

nbdkit --> compose ==> nbdkit --> offset 0/100 --> file
                   \=> nbdkit --> offset 200/100 --> file

Certainly some tradeoffs to revisit depending on whether composition
fits better as a filter or a plugin

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

-------------- next part --------------
A non-text attachment was scrubbed...
Name: signature.asc
Type: application/pgp-signature
Size: 619 bytes
Desc: OpenPGP digital signature
URL: <http://listman.redhat.com/archives/libguestfs/attachments/20180119/4432d55d/attachment.sig>


More information about the Libguestfs mailing list