On 15/05/23 4:12 pm, Daniel P. Berrangé wrote:
On Fri, May 12, 2023 at 02:32:40PM +0000, Het Gala wrote:
Integrated MigrateChannelList with all transport backends (socket, exec
and rdma) for both source and destination migration code flow.

Suggested-by: Aravind Retnakaran <aravind.retnaka...@nutanix.com>
Signed-off-by: Het Gala <het.g...@nutanix.com>
---
  migration/migration.c | 95 +++++++++++++++++++++++++++----------------
  migration/socket.c    |  5 ++-
  2 files changed, 64 insertions(+), 36 deletions(-)

      Error *local_err = NULL;
+    MigrateChannel *val = g_new0(MigrateChannel, 1);
      MigrateAddress *addrs = g_new0(MigrateAddress, 1);
      SocketAddress *saddr;
      InetSocketAddress *isock = &addrs->u.rdma;
@@ -441,6 +442,7 @@ static bool migrate_uri_parse(const char *uri,
      }
if (local_err) {
+        qapi_free_MigrateChannel(val);
          qapi_free_MigrateAddress(addrs);
          qapi_free_SocketAddress(saddr);
          qapi_free_InetSocketAddress(isock);
@@ -448,7 +450,9 @@ static bool migrate_uri_parse(const char *uri,
          return false;
      }
- *channel = addrs;
+    val->channeltype = MIGRATE_CHANNEL_TYPE_MAIN;
+    val->addr = addrs;
+    *channel = val;
      return true;
  }
@@ -457,8 +461,9 @@ static void qemu_start_incoming_migration(const char *uri, bool has_channels,
                                            Error **errp)
  {
      Error *local_err = NULL;
-    MigrateAddress *channel = g_new0(MigrateAddress, 1);
+    MigrateAddress *addrs;
      SocketAddress *saddr;
+    MigrateChannel *channel = NULL;
/*
       * Having preliminary checks for uri and channel
@@ -467,22 +472,30 @@ static void qemu_start_incoming_migration(const char 
*uri, bool has_channels,
          error_setg(errp, "'uri' and 'channels' arguments are mutually "
                     "exclusive; exactly one of the two should be present in "
                     "'migrate-incoming' qmp command ");
-        return;
-    }
-
-    /* URI is not suitable for migration? */
-    if (!migration_channels_and_uri_compatible(uri, errp)) {
          goto out;
-    }
+    } else if (channels) {
+        /* To verify that Migrate channel list has only item */
+        if (channels->next) {
+            error_setg(errp, "Channel list has more than one entries");
+            goto out;
+        }
+        channel = channels->value;
+    } else {
+        /* URI is not suitable for migration? */
+        if (!migration_channels_and_uri_compatible(uri, errp)) {
+            goto out;
+        }
THis check only gets executed when the caller uses the old
URI syntax. We need to it be run when using the modern
MigrateChannel QAPI syntax too.

IOW, migration_channels_and_uri_compatible() needs converting
to take a 'MigrateChannel' object instead of URI, and then
the check can be run after the URI -> MigrateCHannel conversion

Yes, Daniel. Got your point. Will change it in the next version.

For Juan's comments, I have not explored the test side code still, so is the idea to have some similar test functions like test_precopy_tcp_plain, test_precopy_unix_plain but with the new syntax ? Please confirm this, and any advice on how appraoch this?

- if (uri && !migrate_uri_parse(uri, &channel, errp)) {
-        error_setg(errp, "Error parsing uri");
-        goto out;
+        if (uri && !migrate_uri_parse(uri, &channel, errp)) {
+            error_setg(errp, "Error parsing uri");
+            goto out;
+        }
      }
- saddr = &channel->u.socket;
+    addrs = channel->addr;
+    saddr = &channel->addr->u.socket;
      qapi_event_send_migration(MIGRATION_STATUS_SETUP);
-    if (channel->transport == MIGRATE_TRANSPORT_SOCKET) {
+    if (addrs->transport == MIGRATE_TRANSPORT_SOCKET) {
          if (saddr->type == SOCKET_ADDRESS_TYPE_INET ||
              saddr->type == SOCKET_ADDRESS_TYPE_UNIX ||
              saddr->type == SOCKET_ADDRESS_TYPE_VSOCK) {
@@ -491,23 +504,25 @@ static void qemu_start_incoming_migration(const char 
*uri, bool has_channels,
              fd_start_incoming_migration(saddr->u.fd.str, &local_err);
          }
  #ifdef CONFIG_RDMA
-    } else if (channel->transport == MIGRATE_TRANSPORT_RDMA) {
-        rdma_start_incoming_migration(&channel->u.rdma, &local_err);
+    } else if (addrs->transport == MIGRATE_TRANSPORT_RDMA) {
+        rdma_start_incoming_migration(&addrs->u.rdma, &local_err);
  #endif
-    } else if (channel->transport == MIGRATE_TRANSPORT_EXEC) {
-        exec_start_incoming_migration(channel->u.exec.args, &local_err);
+    } else if (addrs->transport == MIGRATE_TRANSPORT_EXEC) {
+        exec_start_incoming_migration(addrs->u.exec.args, &local_err);
      } else {
          error_setg(errp, "unknown migration protocol: %s", uri);
      }
if (local_err) {
+        qapi_free_MigrateAddress(addrs);
          qapi_free_SocketAddress(saddr);
          error_propagate(errp, local_err);
          return;
      }
out:
-    qapi_free_MigrateAddress(channel);
+    qapi_free_MigrateChannel(channel);
+    return;
  }
static void process_incoming_migration_bh(void *opaque)
@@ -1714,8 +1729,9 @@ void qmp_migrate(const char *uri, bool has_channels,
  {
      Error *local_err = NULL;
      MigrationState *s = migrate_get_current();
-    MigrateAddress *channel = g_new0(MigrateAddress, 1);
+    MigrateAddress *addrs;
      SocketAddress *saddr;
+    MigrateChannel *channel = NULL;
struct SocketOutgoingArgs {
      SocketAddress *saddr;
@@ -114,12 +116,13 @@ void socket_start_outgoing_migration(MigrationState *s,
  {
      QIOChannelSocket *sioc = qio_channel_socket_new();
      struct SocketConnectData *data = g_new0(struct SocketConnectData, 1);
+    SocketAddress *addr = QAPI_CLONE(SocketAddress, saddr);
data->s = s; /* in case previous migration leaked it */
      qapi_free_SocketAddress(outgoing_args.saddr);
-    outgoing_args.saddr = saddr;
+    outgoing_args.saddr = addr;
if (saddr->type == SOCKET_ADDRESS_TYPE_INET) {
          data->hostname = g_strdup(saddr->u.inet.host);
--
2.22.3

With regards,
Daniel
Regards,
Het Gala

Reply via email to