Message ID | cover.1596528468.git.lukasstraub2@web.de |
---|---|
Headers | show |
Series | Introduce 'yank' oob qmp command to recover from hanging qemu | expand |
On Thu, 27 Aug 2020 14:37:00 +0200 Markus Armbruster <armbru@redhat.com> wrote: > I apologize for not reviewing this much earlier. > > Lukas Straub <lukasstraub2@web.de> writes: > > > The yank feature allows to recover from hanging qemu by "yanking" > > at various parts. Other qemu systems can register themselves and > > multiple yank functions. Then all yank functions for selected > > instances can be called by the 'yank' out-of-band qmp command. > > Available instances can be queried by a 'query-yank' oob command. > > > > Signed-off-by: Lukas Straub <lukasstraub2@web.de> > > Acked-by: Stefan Hajnoczi <stefanha@redhat.com> > > --- > ... > > diff --git a/qapi/misc.json b/qapi/misc.json > > index 9d32820dc1..0d6a8f20b7 100644 > > --- a/qapi/misc.json > > +++ b/qapi/misc.json > > @@ -1615,3 +1615,48 @@ > > ## > > { 'command': 'query-vm-generation-id', 'returns': 'GuidInfo' } > > > > +## > > +# @YankInstances: > > +# > > +# @instances: List of yank instances. > > +# > > +# Yank instances are named after the following schema: > > +# "blockdev:<node-name>", "chardev:<chardev-name>" and "migration" > > +# > > +# Since: 5.1 > > +## > > +{ 'struct': 'YankInstances', 'data': {'instances': ['str'] } } > > I'm afraid this is a problematic QMP interface. > > By making YankInstances a struct, you keep the door open to adding more > members, which is good. > > But by making its 'instances' member a ['str'], you close the door to > using anything but a single string for the individual instances. Not so > good. > > The single string encodes information which QMP client will need to > parse from the string. We frown on that in QMP. Use QAPI complex types > capabilities for structured data. > > Could you use something like this instead? > > { 'enum': 'YankInstanceType', > 'data': { 'block-node', 'chardev', 'migration' } } > > { 'struct': 'YankInstanceBlockNode', > 'data': { 'node-name': 'str' } } > > { 'struct': 'YankInstanceChardev', > 'data' { 'label': 'str' } } > > { 'union': 'YankInstance', > 'base': { 'type': 'YankInstanceType' }, > 'discriminator': 'type', > 'data': { > 'block-node': 'YankInstanceBlockNode', > 'chardev': 'YankInstanceChardev' } } > > { 'command': 'yank', > 'data': { 'instances': ['YankInstance'] }, > 'allow-oob': true } This proposal looks good to me. Does everyone agree? Regards, Lukas Straub > If you're confident nothing will ever be added to YankInstanceBlockNode > and YankInstanceChardev, you could use str instead. > > > + > > +## > > +# @yank: > > +# > > +# Recover from hanging qemu by yanking the specified instances. > > What's an "instance", and what does it mean to "yank" it? > > The documentation of YankInstances above gives a clue on what an > "instance" is: presumably a block node, a character device or the > migration job. > > I guess a YankInstance is whatever the code chooses to make one, and the > current code makes these three kinds. > > Does it make every block node a YankInstance? If not, which ones? > > Does it make every character device a YankInstance? If not, which ones? > > Does it make migration always a YankInstance? If not, when? > > > +# > > +# Takes @YankInstances as argument. > > +# > > +# Returns: nothing. > > +# > > +# Example: > > +# > > +# -> { "execute": "yank", "arguments": { "instances": ["blockdev:nbd0"] } } > > +# <- { "return": {} } > > +# > > +# Since: 5.1 > > +## > > +{ 'command': 'yank', 'data': 'YankInstances', 'allow-oob': true } > > + > > +## > > +# @query-yank: > > +# > > +# Query yank instances. > > +# > > +# Returns: @YankInstances > > +# > > +# Example: > > +# > > +# -> { "execute": "query-yank" } > > +# <- { "return": { "instances": ["blockdev:nbd0"] } } > > +# > > +# Since: 5.1 > > +## > > +{ 'command': 'query-yank', 'returns': 'YankInstances', 'allow-oob': true } > ...