From: Juan Quintela <quintela@redhat.com>
To: "Daniel P. Berrange" <berrange@redhat.com>
Cc: qemu-devel@nongnu.org, amit.shah@redhat.com, dgilbert@redhat.com
Subject: Re: [Qemu-devel] [PATCH 09/16] migration: Start of multiple fd work
Date: Mon, 13 Mar 2017 17:58:06 +0100 [thread overview]
Message-ID: <87fuihuna9.fsf@secure.mitica> (raw)
In-Reply-To: <20170313164134.GM4799@redhat.com> (Daniel P. Berrange's message of "Mon, 13 Mar 2017 16:41:40 +0000")
"Daniel P. Berrange" <berrange@redhat.com> wrote:
> On Mon, Mar 13, 2017 at 01:44:27PM +0100, Juan Quintela wrote:
>> We create new channels for each new thread created. We only send through
>> them a character to be sure that we are creating the channels in the
>> right order.
>>
>> Signed-off-by: Juan Quintela <quintela@redhat.com>
>>
>> --
>> Split SocketArgs into incoming and outgoing args
>>
>> Signed-off-by: Juan Quintela <quintela@redhat.com>
>> ---
>> include/migration/migration.h | 7 +++++
>> migration/ram.c | 35 ++++++++++++++++++++++
>> migration/socket.c | 67 +++++++++++++++++++++++++++++++++++++++++--
>> 3 files changed, 106 insertions(+), 3 deletions(-)
>>
>
>> diff --git a/migration/socket.c b/migration/socket.c
>> index 13966f1..58a16b5 100644
>> --- a/migration/socket.c
>> +++ b/migration/socket.c
>> @@ -24,6 +24,65 @@
>> #include "io/channel-socket.h"
>> #include "trace.h"
>>
>> +struct SocketIncomingArgs {
>> + QIOChannelSocket *ioc;
>> +} incoming_args;
>> +
>> +QIOChannel *socket_recv_channel_create(void)
>> +{
>> + QIOChannelSocket *sioc;
>> + Error *err = NULL;
>> +
>> + sioc = qio_channel_socket_accept(QIO_CHANNEL_SOCKET(incoming_args.ioc),
>> + &err);
>> + if (!sioc) {
>> + error_report("could not accept migration connection (%s)",
>> + error_get_pretty(err));
>> + return NULL;
>> + }
>> + return QIO_CHANNEL(sioc);
>> +}
>> +
>> +int socket_recv_channel_destroy(QIOChannel *recv)
>> +{
>> + /* Remove channel */
>> + object_unref(OBJECT(send));
>> + return 0;
>> +}
>> +
>> +/* we have created all the recv channels, we can close the main one */
>> +int socket_recv_channel_close_listening(void)
>> +{
>> + /* Close listening socket as its no longer needed */
>> + qio_channel_close(QIO_CHANNEL(incoming_args.ioc), NULL);
>> + return 0;
>> +}
>> +
>> +struct SocketOutgoingArgs {
>> + SocketAddress *saddr;
>> + Error **errp;
>> +} outgoing_args;
>> +
>> +QIOChannel *socket_send_channel_create(void)
>> +{
>> + QIOChannelSocket *sioc = qio_channel_socket_new();
>> +
>> + qio_channel_socket_connect_sync(sioc, outgoing_args.saddr,
>> + outgoing_args.errp);
>> + qio_channel_set_delay(QIO_CHANNEL(sioc), false);
>> + return QIO_CHANNEL(sioc);
>> +}
>> +
>> +int socket_send_channel_destroy(QIOChannel *send)
>> +{
>> + /* Remove channel */
>> + object_unref(OBJECT(send));
>> + if (outgoing_args.saddr) {
>> + qapi_free_SocketAddress(outgoing_args.saddr);
>> + outgoing_args.saddr = NULL;
>> + }
>> + return 0;
>> +}
>>
>> static SocketAddress *tcp_build_address(const char *host_port, Error **errp)
>> {
>> @@ -97,6 +156,10 @@ static void socket_start_outgoing_migration(MigrationState *s,
>> struct SocketConnectData *data = g_new0(struct SocketConnectData, 1);
>>
>> data->s = s;
>> +
>> + outgoing_args.saddr = saddr;
>> + outgoing_args.errp = errp;
>> +
>> if (saddr->type == SOCKET_ADDRESS_KIND_INET) {
>> data->hostname = g_strdup(saddr->u.inet.data->host);
>> }
>> @@ -107,7 +170,6 @@ static void socket_start_outgoing_migration(MigrationState *s,
>> socket_outgoing_migration,
>> data,
>> socket_connect_data_free);
>> - qapi_free_SocketAddress(saddr);
>> }
>>
>> void tcp_start_outgoing_migration(MigrationState *s,
>> @@ -154,8 +216,6 @@ 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 FALSE; /* unregister */
*HERE*
>> }
>>
>> @@ -164,6 +224,7 @@ static void socket_start_incoming_migration(SocketAddress *saddr,
>> Error **errp)
>> {
>> QIOChannelSocket *listen_ioc = qio_channel_socket_new();
>> + incoming_args.ioc = listen_ioc;
>>
>> qio_channel_set_name(QIO_CHANNEL(listen_ioc),
>> "migration-socket-listener");
>
> I still don't really like any of the changes in this file. We've now got
> two sets of methods which connect to a remote host and two sets of methods
> which accept incoming clients. I've got to think there's a better way to
> refactor the existing code, such that we don't need two sets of methods
> for the same actions
I am open to suggestions, basically we want to be able to:
- open one + n channels
- be sure that we got the same id on both sides of the connection.
You suggested on the previous iteration that I changed the FALSE in
*HERE* for TRUE, but I was not able to:
- make sure that we have opened n sockets before we continue with
migration
- making sure that we got same id numbers in both sides, that is doable,
just add a new id field
- right now I open a channel, and wait for the other side to open it
before open the following one. I can do things in parallel, but
locking is going to be "interesting".
So, as said, I don't really care how we open the channels, I am totally
open to suggestions. Looking at the current code, this is the best way
that I have been able to think of.
Later, Juan.
next prev parent reply other threads:[~2017-03-13 16:58 UTC|newest]
Thread overview: 46+ messages / expand[flat|nested] mbox.gz Atom feed top
2017-03-13 12:44 [Qemu-devel] [PATCH 00/16] Multifd v4 Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 01/16] qio: create new qio_channel_write_all Juan Quintela
2017-03-13 16:29 ` Daniel P. Berrange
2017-04-27 8:19 ` Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 02/16] qio: create new qio_channel_read_all Juan Quintela
2017-03-13 16:30 ` Daniel P. Berrange
2017-03-13 12:44 ` [Qemu-devel] [PATCH 03/16] migration: Test for disabled features on reception Juan Quintela
2017-03-13 16:21 ` Dr. David Alan Gilbert
2017-03-13 12:44 ` [Qemu-devel] [PATCH 04/16] migration: Don't create decompression threads if not enabled Juan Quintela
2017-03-13 16:25 ` Dr. David Alan Gilbert
2017-03-13 12:44 ` [Qemu-devel] [PATCH 05/16] migration: Add multifd capability Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 06/16] migration: Create x-multifd-threads parameter Juan Quintela
2017-03-13 16:37 ` Daniel P. Berrange
2017-03-13 16:50 ` Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 07/16] migration: Create x-multifd-group parameter Juan Quintela
2017-03-13 16:34 ` Daniel P. Berrange
2017-03-13 16:49 ` Juan Quintela
2017-03-13 17:12 ` Daniel P. Berrange
2017-03-13 18:35 ` Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 08/16] migration: Create multifd migration threads Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 09/16] migration: Start of multiple fd work Juan Quintela
2017-03-13 16:41 ` Daniel P. Berrange
2017-03-13 16:58 ` Juan Quintela [this message]
2017-03-14 10:34 ` Daniel P. Berrange
2017-03-14 12:32 ` Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 10/16] migration: Create ram_multifd_page Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 11/16] migration: Really use multiple pages at a time Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 12/16] migration: Send the fd number which we are going to use for this page Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 13/16] migration: Create thread infrastructure for multifd recv side Juan Quintela
2017-03-14 9:23 ` Paolo Bonzini
2017-03-17 13:02 ` Dr. David Alan Gilbert
2017-03-17 16:05 ` Paolo Bonzini
2017-03-17 19:36 ` Dr. David Alan Gilbert
2017-03-20 11:15 ` Paolo Bonzini
2017-03-30 11:56 ` Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 14/16] migration: Test new fd infrastructure Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 15/16] migration: Transfer pages over new channels Juan Quintela
2017-03-13 12:44 ` [Qemu-devel] [PATCH 16/16] migration: Flush receive queue Juan Quintela
2017-03-14 10:21 ` [Qemu-devel] [PATCH 00/16] Multifd v4 Dr. David Alan Gilbert
2017-03-14 10:26 ` Daniel P. Berrange
2017-03-14 11:40 ` Dr. David Alan Gilbert
2017-03-14 11:45 ` Daniel P. Berrange
2017-03-14 11:47 ` Daniel P. Berrange
2017-03-14 12:22 ` Dr. David Alan Gilbert
2017-03-14 12:34 ` Daniel P. Berrange
2017-03-14 16:23 ` Dr. David Alan Gilbert
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=87fuihuna9.fsf@secure.mitica \
--to=quintela@redhat.com \
--cc=amit.shah@redhat.com \
--cc=berrange@redhat.com \
--cc=dgilbert@redhat.com \
--cc=qemu-devel@nongnu.org \
/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.