From: "Daniel P. Berrangé" <berrange@redhat.com>
To: Eric Blake <eblake@redhat.com>, Het Gala <het.gala@nutanix.com>,
qemu-devel@nongnu.org, prerna.saxena@nutanix.com,
quintela@redhat.com, dgilbert@redhat.com, pbonzini@redhat.com,
armbru@redhat.com, manish.mishra@nutanix.com,
aravind.retnakaran@nutanix.com
Subject: Re: [PATCH v2 2/6] migration: Updated QAPI format for 'migrate' qemu monitor command
Date: Thu, 9 Feb 2023 13:38:50 +0000 [thread overview]
Message-ID: <Y+T3apJYMdQ3nxu2@redhat.com> (raw)
In-Reply-To: <Y+TJr7An261VcVJ/@redhat.com>
On Thu, Feb 09, 2023 at 10:23:43AM +0000, Daniel P. Berrangé wrote:
> On Wed, Feb 08, 2023 at 02:17:12PM -0600, Eric Blake wrote:
> > On Wed, Feb 08, 2023 at 09:35:56AM +0000, Het Gala wrote:
> > > Existing 'migrate' QAPI design enforces transport mechanism, ip address
> > > of destination interface and corresponding port number in the form
> > > of a unified string 'uri' parameter for initiating a migration stream.
> > > This scheme has a significant flaw in it - double encoding of existing
> > > URIs to extract migration info.
> > >
> > > The current patch maps QAPI uri design onto well defined MigrateChannel
> > > struct. This modified QAPI helps in preventing multi-level uri
> > > encodings ('uri' parameter is kept for backward compatibility).
> > >
> > > Suggested-by: Daniel P. Berrange <berrange@redhat.com>
> > > Suggested-by: Manish Mishra <manish.mishra@nutanix.com>
> > > Suggested-by: Aravind Retnakaran <aravind.retnakaran@nutanix.com>
> > > Signed-off-by: Het Gala <het.gala@nutanix.com>
> > > ---
> > > qapi/migration.json | 131 +++++++++++++++++++++++++++++++++++++++++++-
> > > 1 file changed, 129 insertions(+), 2 deletions(-)
> > >
> > > diff --git a/qapi/migration.json b/qapi/migration.json
> > > index c84fa10e86..79acfcfe4e 100644
> > > --- a/qapi/migration.json
> > > +++ b/qapi/migration.json
> > > @@ -1449,12 +1449,108 @@
> > > ##
> > > { 'command': 'migrate-continue', 'data': {'state': 'MigrationStatus'} }
> > >
> > > +##
> > > +# @MigrateTransport:
> > > +#
> > > +# The supported communication transport mechanisms for migration
> > > +#
> > > +# @socket: Supported communication type between two devices for migration.
> > > +# Socket is able to cover all of 'tcp', 'unix', 'vsock' and
> > > +# 'fd' already
> > > +#
> > > +# @exec: Supported communication type to redirect migration stream into file.
> > > +#
> > > +# @rdma: Supported communication type to redirect rdma type migration stream.
> > > +#
> > > +# Since 8.0
> > > +##
> > > +{ 'enum': 'MigrateTransport',
> > > + 'data': ['socket', 'exec', 'rdma'] }
> > > +
> > > +##
> > > +# @MigrateSocketAddr:
> > > +#
> > > +# To support different type of socket.
> > > +#
> > > +# @socket-type: Different type of socket connections.
> > > +#
> > > +# Since 8.0
> > > +##
> > > +{ 'struct': 'MigrateSocketAddr',
> > > + 'data': {'socket-type': 'SocketAddress' } }
> >
> > Here, you use 'socket-type',...
> >
> > > +
> > > +##
> > > +# @MigrateExecAddr:
> > > + #
> > > + # Since 8.0
> > > + ##
> > > +{ 'struct': 'MigrateExecAddr',
> > > + 'data' : {'data': ['str'] } }
> >
> > Inconsistent on whether you have a space before :. Most of our qapi
> > files prefer the layout:
> >
> > 'key': 'value'
> >
> > that is, no space before, one space after. It doesn't affect
> > correctness, but a consistent visual style is worth striving for.
> >
> > > +
> > > +##
> > > +# @MigrateRdmaAddr:
> > > +#
> > > +# Since 8.0
> > > +##
> > > +{ 'struct': 'MigrateRdmaAddr',
> > > + 'data' : {'data': 'InetSocketAddress' } }
> >
> > ...while these branches supply everything else under 'data'. Also,
> > while you documented @socket-type above, you did not document @data in
> > either of these two types. [1]
> >
> > > +
> > > +##
> > > +# @MigrateAddress:
> > > +#
> > > +# The options available for communication transport mechanisms for migration
> > > +#
> > > +# Since 8.0
> > > +##
> > > +{ 'union' : 'MigrateAddress',
> > > + 'base' : { 'transport' : 'MigrateTransport'},
> > > + 'discriminator' : 'transport',
> > > + 'data' : {
> > > + 'socket' : 'MigrateSocketAddr',
> > > + 'exec' : 'MigrateExecAddr',
> > > + 'rdma': 'MigrateRdmaAddr' } }
> >
> > Another example of inconsistent spacing around :.
> >
> > I'm guessing the reason you didn't go with 'socket': 'SocketAddress'
> > is that SocketAddress is itself a discriminated union, and Markus does
> > not yet have the QAPI generator wired up to support one union as a
> > branch of another larger union? It leads to extra nesting on the wire
> > [2]
>
> I don't know the backstory on this limitation. Is it something that
> is very difficult to resolve ? I think it is highly desirable to have
> 'socket': 'SocketAddress' here. It would be a shame to introduce this
> better migration API design and then have it complicated by a possibly
> short term limitation of QAPI.
So to understand this better I did this change on top of Het's
patch:
diff --git a/qapi/migration.json b/qapi/migration.json
index 79acfcfe4e..bbc3e66ad6 100644
--- a/qapi/migration.json
+++ b/qapi/migration.json
@@ -1467,18 +1467,6 @@
{ 'enum': 'MigrateTransport',
'data': ['socket', 'exec', 'rdma'] }
-##
-# @MigrateSocketAddr:
-#
-# To support different type of socket.
-#
-# @socket-type: Different type of socket connections.
-#
-# Since 8.0
-##
-{ 'struct': 'MigrateSocketAddr',
- 'data': {'socket-type': 'SocketAddress' } }
-
##
# @MigrateExecAddr:
#
@@ -1487,14 +1475,6 @@
{ 'struct': 'MigrateExecAddr',
'data' : {'data': ['str'] } }
-##
-# @MigrateRdmaAddr:
-#
-# Since 8.0
-##
-{ 'struct': 'MigrateRdmaAddr',
- 'data' : {'data': 'InetSocketAddress' } }
-
##
# @MigrateAddress:
#
@@ -1506,9 +1486,9 @@
'base' : { 'transport' : 'MigrateTransport'},
'discriminator' : 'transport',
'data' : {
- 'socket' : 'MigrateSocketAddr',
+ 'socket' : 'SocketAddress',
'exec' : 'MigrateExecAddr',
- 'rdma': 'MigrateRdmaAddr' } }
+ 'rdma': 'InetSocketAddress' } }
##
# @MigrateChannelType:
That results in a build error
/home/berrange/src/virt/qemu/scripts/qapi-gen.py: In file included from ../qapi/qapi-schema.json:79:
../qapi/migration.json: In union 'MigrateAddress':
../qapi/migration.json:1505: branch 'socket' cannot use union type 'SocketAddress'
To understand what the limitation of QAPI generation is, I blindly
disabled this check
diff --git a/scripts/qapi/schema.py b/scripts/qapi/schema.py
index cd8661125c..cb5c0385bd 100644
--- a/scripts/qapi/schema.py
+++ b/scripts/qapi/schema.py
@@ -653,7 +653,7 @@ def check(self, schema, seen):
"branch '%s' is not a value of %s"
% (v.name, self.tag_member.type.describe()))
if (not isinstance(v.type, QAPISchemaObjectType)
- or v.type.variants):
+ or v.type.variants) and False:
raise QAPISemError(
self.info,
"%s cannot use %s"
@@ -664,7 +664,8 @@ def check_clash(self, info, seen):
for v in self.variants:
# Reset seen map for each variant, since qapi names from one
# branch do not affect another branch
- v.type.check_clash(info, dict(seen))
+ #v.type.check_clash(info, dict(seen))
+ pass
class QAPISchemaMember:
After doing that, the QAPI code generated handled the union-inside-union
case without any problems that I can see. The generated code looks sane
and it compiles correctly.
So is this actually just a case of overly strict input validation in
the QAPI schema parser ? If so, what's the correct way to adapt the
checks to permit this usage.
With regards,
Daniel
--
|: https://berrange.com -o- https://www.flickr.com/photos/dberrange :|
|: https://libvirt.org -o- https://fstop138.berrange.com :|
|: https://entangle-photo.org -o- https://www.instagram.com/dberrange :|
next prev parent reply other threads:[~2023-02-09 13:39 UTC|newest]
Thread overview: 48+ messages / expand[flat|nested] mbox.gz Atom feed top
2023-02-08 9:35 [PATCH v2 0/6] migration: Modified 'migrate' QAPI command for migration Het Gala
2023-02-08 9:35 ` [PATCH v2 1/6] migration: moved hmp_split_at_commma() helper func to qapi-util.c file Het Gala
2023-02-09 12:00 ` Markus Armbruster
2023-02-09 12:12 ` Juan Quintela
2023-02-09 13:58 ` Het Gala
2023-02-09 16:19 ` Markus Armbruster
2023-02-09 13:28 ` Het Gala
2023-02-09 12:02 ` Daniel P. Berrangé
2023-02-09 13:30 ` Het Gala
2023-02-08 9:35 ` [PATCH v2 2/6] migration: Updated QAPI format for 'migrate' qemu monitor command Het Gala
2023-02-08 20:17 ` Eric Blake
2023-02-09 7:57 ` Het Gala
2023-02-09 10:23 ` Daniel P. Berrangé
2023-02-09 13:00 ` Het Gala
2023-02-09 13:38 ` Daniel P. Berrangé [this message]
2023-02-10 6:37 ` Het Gala
2023-02-10 10:31 ` Markus Armbruster
2023-02-09 16:26 ` Markus Armbruster
2023-02-10 6:15 ` Het Gala
2023-02-09 10:29 ` Daniel P. Berrangé
2023-02-09 13:11 ` Het Gala
2023-02-09 13:22 ` Daniel P. Berrangé
2023-02-10 8:24 ` Het Gala
2023-02-10 7:24 ` QAPI unions as branches / unifying struct and union types (was: [PATCH v2 2/6] migration: Updated QAPI format for 'migrate' qemu monitor command) Markus Armbruster
2023-02-10 13:28 ` Het Gala
2023-02-14 10:16 ` QAPI unions as branches / unifying struct and union types Markus Armbruster
2023-02-17 11:18 ` Het Gala
2023-02-17 11:55 ` Daniel P. Berrangé
2023-02-21 9:17 ` Het Gala
2023-02-08 9:35 ` [PATCH v2 3/6] migration: HMP side changes for modified 'migrate' QAPI design Het Gala
2023-02-09 12:05 ` Daniel P. Berrangé
2023-02-09 13:38 ` Het Gala
2023-02-09 14:00 ` Daniel P. Berrangé
2023-02-10 6:44 ` Het Gala
2023-02-08 9:35 ` [PATCH v2 4/6] migration: Avoid multiple parsing of uri in migration code flow Het Gala
2023-02-09 10:40 ` Daniel P. Berrangé
2023-02-09 13:21 ` Het Gala
2023-02-09 12:09 ` Daniel P. Berrangé
2023-02-09 13:54 ` Het Gala
2023-02-09 14:06 ` Daniel P. Berrangé
2023-02-10 7:03 ` Het Gala
2023-02-08 9:35 ` [PATCH v2 5/6] migration: Modified 'migrate-incoming' QAPI and HMP side changes on the destination interface Het Gala
2023-02-08 20:19 ` Eric Blake
2023-02-09 7:59 ` Het Gala
2023-02-09 10:31 ` Daniel P. Berrangé
2023-02-09 13:14 ` Het Gala
2023-02-09 13:25 ` Daniel P. Berrangé
2023-02-08 9:36 ` [PATCH v2 6/6] migration: Established connection for listener sockets on the dest interface Het Gala
Reply instructions:
You may reply publicly to this message via plain-text email
using any one of the following methods:
* Save the following mbox file, import it into your mail client,
and reply-to-all from there: mbox
Avoid top-posting and favor interleaved quoting:
https://en.wikipedia.org/wiki/Posting_style#Interleaved_style
* Reply using the --to, --cc, and --in-reply-to
switches of git-send-email(1):
git send-email \
--in-reply-to=Y+T3apJYMdQ3nxu2@redhat.com \
--to=berrange@redhat.com \
--cc=aravind.retnakaran@nutanix.com \
--cc=armbru@redhat.com \
--cc=dgilbert@redhat.com \
--cc=eblake@redhat.com \
--cc=het.gala@nutanix.com \
--cc=manish.mishra@nutanix.com \
--cc=pbonzini@redhat.com \
--cc=prerna.saxena@nutanix.com \
--cc=qemu-devel@nongnu.org \
--cc=quintela@redhat.com \
/path/to/YOUR_REPLY
https://kernel.org/pub/software/scm/git/docs/git-send-email.html
* If your mail client supports setting the In-Reply-To header
via mailto: links, try the mailto: link
Be sure your reply has a Subject: header at the top and a blank line
before the message body.
This is an external index of several public inboxes,
see mirroring instructions on how to clone and mirror
all data and code used by this external index.