[Libguestfs] [PATCH nbdkit] server: Pass the export name through filter .open calls.
Eric Blake
eblake at redhat.com
Wed Jul 22 14:01:47 UTC 2020
On 7/21/20 7:41 PM, Eric Blake wrote:
>> The handling of NBD_OPT_SET_META_CONTEXT interacted with the export
>> name (see commit 20b8509a9ccdab118ce7b7043be63bbad74f1e79). I have
>> attempted to keep previous behaviour in this change, but note that
>> there is no regression test for this. I added a debug message so we
>> can tell when this unusual case actually happens which should help
>> with diagnosis of problems.
>
> Yeah, that commit specifically mentioned that I used gdb breakpoints in
> qemu-io to test things, and was not interested in hacking libnbd at the
> time. Although now that we are debating about exposing nbd_opt_*
> commands in libnbd to someone that opts in, maybe that _could_ be a case
> to write such a regression test. Meanwhile, I'll just try to fire up
> another gdb session to prove to myself that things still work.
>
Here's snippets of my gdb session proving it does indeed still work (now
that you've actually pushed your patches):
$ ./nbdkit -U - -v memory 1 --run \
'gdb --args qemu-img map --output=json "$uri"'
...
Reading symbols from qemu-img...
(gdb) b nbd_send_meta_query
Breakpoint 1 at 0xf3773: file /home/eblake/qemu/nbd/client.c, line 653.
(gdb) r
Starting program: /home/eblake/qemu/qemu-img map --output=json
nbd+unix://\?socket=/tmp/nbdkityhz8Ab/socket
...
nbdkit: memory[1]: debug: newstyle negotiation:
NBD_OPT_STRUCTURED_REPLY: client requested structured replies
Thread 1 "qemu-img" hit Breakpoint 1, nbd_send_meta_query
(ioc=0x55555583f720,
opt=10, export=0x5555557e7e80 "", query=0x55555571994c
"base:allocation",
errp=0x7fffffffcc20) at /home/eblake/qemu/nbd/client.c:653
653 uint32_t export_len = strlen(export);
(gdb) p export="a"
$1 = 0x7fffecd80fa0 "a"
(gdb) c
...
nbdkit: memory[1]: debug: newstyle negotiation:
NBD_OPT_SET_META_CONTEXT: client requested export 'a'
nbdkit: memory[1]: debug: newstyle negotiation:
NBD_OPT_SET_META_CONTEXT: set count: 1
nbdkit: memory[1]: debug: newstyle negotiation:
NBD_OPT_SET_META_CONTEXT: set base:allocation
nbdkit: memory[1]: debug: newstyle negotiation:
NBD_OPT_SET_META_CONTEXT: replying with base:allocation id 1
nbdkit: memory[1]: debug: newstyle negotiation:
NBD_OPT_SET_META_CONTEXT: reply complete
nbdkit: memory[1]: debug: newstyle negotiation: NBD_OPT_GO: client
requested export ''
nbdkit: memory[1]: debug: newstyle negotiation: NBD_OPT_SET_META_CONTEXT
export name "a" ≠ final client exportname "", so discarding the previous
context
...
nbdkit: memory.1: error: invalid request: NBD_CMD_BLOCK_STATUS:
base:allocation was not negotiated
nbdkit: debug: starting worker thread memory.13
nbdkit: debug: starting worker thread memory.14
nbdkit: debug: starting worker thread memory.15
nbdkit: memory.1: debug: sending error reply: Invalid argument
qemu-img: Could not read file metadata: Invalid argument
...
So using gdb to hack in a different name shows the nbdkit code works; it
also shows that qemu does NOT expect NBD_CMD_BLOCK_STATUS to fail if
NBD_OPT_SET_META_CONTEXT succeeded (but that's understandable - qemu
always sends the same export name; the fault lies in me changing state
with gdb behind qemu's back).
--
Eric Blake, Principal Software Engineer
Red Hat, Inc. +1-919-301-3226
Virtualization: qemu.org | libvirt.org
More information about the Libguestfs
mailing list