[Libguestfs] [PATCH nbdkit] server: Deprecate the -e/--exportname parameter.

Eric Blake eblake at redhat.com
Wed Jul 22 11:12:30 UTC 2020


On 7/22/20 4:02 AM, Richard W.M. Jones wrote:

>> The more I think about it, the more I disagree with disabling this.
>> Or, put another way, I think that the _only_ time -e makes sense is
>> _when_ you are using --run.  Consider:
>>
>> nbdkit -U - -e foo info --run 'nbdsh -u $uri -c "print(h.pread(3, 0))"'
>> nbdkit -U - -e bar info --run 'nbdsh -u $uri -c "print(h.pread(3, 0))"'
>>
>> Of course, you can accomplish the same with:
>>
>> nbdkit -U - info --run 'nbdsh -u nbd+unix:///foo\?socket=$unixsocket \
>>    -c "print(h.pread(3, 0))"'
>>
>> but that's a lot more painful to write.
>>
>> We _don't_ need to advertise 'foo' or 'bar' over NBD_OPT_INFO (at
>> least, not for plugins that don't implement the forthcoming
>> .export_list callback), but _do_ need a way for the captive
>> application (nbdsh in this case) to know _which_ export the captive
>> should connect to.
>>
>> And, if we reinstate _just_ that usage of -e,...
>>
>>>> (4) I have temporarily disabled tests/test-long-name.sh.  This is
>>>>       still a valid test, but we will have to rewrite it to use
>>>>       (probably) sh or eval plugins once we have an implementation of
>>>>       list_exports.
>>>> ---
>>
>> ...we may not have to disable this test after all.
> 
> I feel for the end user this is all pretty confusing and requires them
> to have some insight into what the plugin is expecting and even
> understanding of the protocol.
> 
> Perhaps we should have a rule something like this:
> 
>   - plugins should serve default content on the "" export
> 
>   - unless they implement .list_exports, in which case the
>     first export returned is the default export

That could be expensive, reading the entire list and throwing away all 
but the first. I'm now leaning towards two callbacks:

.list_exports: compute all exports to advertise
.default_export: compute the name to be returned for NBD_OPT_INFO("") 
and to use by default as $exportname in --run

Then, any plugin that wants to advertise a different default export name 
supplies .default_export, and if .default_export is missing, we supply 
"" on their behalf.  We could also translate a client request for "" 
into .default_export before calling .open (v3) or populating 
nbdkit_export_name (v2) (I could see that mattering for the file plugin 
with a mode that serves all files in a directory, since stat("") fails 
but providing a default filename as the largest file in the directory 
could be useful).

> 
> Then we could implement --run transparently by having it set
> $exportname/$uri to the first entry in .list_exports or "" if
> .list_exports is not implemented.
> 
> Here's another idea: Is it possible that if the --run script itself
> overrides exportname it could be used by $uri.  Not sure if there's
> some kind of delayed shell variable expansion that would make this
> possible:
> 
>    nbdkit ... --run 'exportname=foo; nbdsh -u $uri ...'

Not as written, but we _can_ do the following.  Right now, --run creates 
a shell fragment, which prepends this code in front of the user's:

uri=...
nbd=...
...
exportname=...

we could instead prepend:

set_export() {
   uri=...
   nbd=...
   ...
   exportname=$1
}
set_export ...

where that last line uses .default_export (defaulting to "" as usual). 
The user can now run:

nbdkit ... --run 'set_export foo; nbdsh -u "$uri" ... '

Oh, and I just realized, because $uri can contain ?, we really should 
scrub all uses in the tree to always write it as "$uri" rather than 
unquoted, just to set a good example.  (It's unlikely that anyone would 
ever have a subdirectory named 'nbd+unix:' in their current working 
directory to the point that the ? would trigger unintended globbing, but 
better safe than sorry...)

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




More information about the Libguestfs mailing list