migration: Create migration_has_all_channels
authorJuan Quintela <quintela@redhat.com>
Mon, 24 Jul 2017 11:06:25 +0000 (13:06 +0200)
committerJuan Quintela <quintela@redhat.com>
Fri, 22 Sep 2017 12:11:19 +0000 (14:11 +0200)
This function allows us to decide when to close the listener socket.
For now, we only need one connection.

Signed-off-by: Juan Quintela <quintela@redhat.com>
Reviewed-by: Daniel P. Berrange <berrange@redhat.com>
migration/migration.c
migration/migration.h
migration/socket.c

index 2d4c56e612a5b8f07d40dac3d2d89845b98c9470..bac4a99277cf96a9cc2bd2c2761a18ce1bffae13 100644 (file)
@@ -384,6 +384,17 @@ void migration_ioc_process_incoming(QIOChannel *ioc)
     /* We still only have a single channel.  Nothing to do here yet */
 }
 
+/**
+ * @migration_has_all_channels: We have received all channels that we need
+ *
+ * Returns true when we have got connections to all the channels that
+ * we need for migration.
+ */
+bool migration_has_all_channels(void)
+{
+    return true;
+}
+
 /*
  * Send a 'SHUT' message on the return channel with the given value
  * to indicate that we've finished with the RP.  Non-0 value indicates
index 99c398d484686cd12caab5199d092a4c15b6acf1..1881e4a754fdc239791152148da30d85ebe5bde7 100644 (file)
@@ -155,6 +155,8 @@ void migrate_set_state(int *state, int old_state, int new_state);
 void migration_fd_process_incoming(QEMUFile *f);
 void migration_ioc_process_incoming(QIOChannel *ioc);
 
+bool  migration_has_all_channels(void);
+
 uint64_t migrate_max_downtime(void);
 
 void migrate_fd_error(MigrationState *s, const Error *error);
index b02d37d7a35ae8b22db4852b8c93a039e4e70e26..dee869044a55542ae3f89a9ee012c8fa24b4c558 100644 (file)
@@ -152,9 +152,13 @@ static gboolean socket_accept_incoming_migration(QIOChannel *ioc,
     object_unref(OBJECT(sioc));
 
 out:
-    /* Close listening socket as its no longer needed */
-    qio_channel_close(ioc, NULL);
-    return G_SOURCE_REMOVE;
+    if (migration_has_all_channels()) {
+        /* Close listening socket as its no longer needed */
+        qio_channel_close(ioc, NULL);
+        return G_SOURCE_REMOVE;
+    } else {
+        return G_SOURCE_CONTINUE;
+    }
 }