On May 02 2022, eblake at
redhat.com (Eric Blake) wrote:
On Mon, May 02, 2022 at 10:25:44AM +0100, Nikolaus Rath wrote:
> Hi,
>
> Is there a way for a nbdkit plugin to *require* use of a nbdkit filter
> (specifically the nbdkit-blocksize-filter) programmatically?
At present, no. What are you envisioning - enforcing that the plugin
doesn't want to deal with sub-sector offsets and lengths? Is there
any other filter that would be useful to require, or can we focus more
on the question about insisting on aligned requests? Also, is your
plugin mostly worried about enforcement of minimum block size (for
example, no requests smaller than 512-byte alignment, which the
blocksize filter gives with read-modify-write), or is it also worried
about other features that the blocksize filter can add (such as
splitting larger requests)?
I am only concerned about aligned writes, because the plugin can only
write blocks of a fixed size. It would be straightforward to handle
read-modify-write in the plugin, but I thought it would be nice if I
could use the existing nbdkit facilities for this.
Having large read/write requests split into blocksize units would also
be nice.
However, I do not need reads to be aligned.
I did ask the question when we first added .block_size whether we
should also provide a way for plugins to request the internal nbdkit
server code to enforce limits (use of the nbdkit-blocksize-filter with
read-modify-write is one way to obey underlying limits; but another
way is to just up-front fail unaligned requests rather than passing
them into the plugin). We could either do this by enhancing the
existing .block_size() function to add in a special return value to
insist on strict enforcement (right now, we only document returning -1
on error and 0 when successfully populating limits; we could add a
documented return of 1), or by adding yet another callback (for
example, if .strict_block_size is absent or returns 0, .block_size
values are advisory to the client, but unaligned values reach the
plugin; if .strict_block_size returns 1, .block_size values are
enforced by nbdkit before reaching the plugin).
Thoughts about that approach?
Extending block_size() for this purpose sounds good to me. I am not sure
if it's the best idea to fail unaligned requests though, I think I would
prefer if nbdkit could implicitly add the blocksize filter instead.
Best,
-Nikolaus
--
GPG Fingerprint: ED31 791B 2C5C 1613 AF38 8B8A D113 FCAC 3C4E 599F
»Time flies like an arrow, fruit flies like a Banana.«