diff mbox

[v4,12/47] Handle bi-directional communication for fd migration

Message ID 1412358473-31398-13-git-send-email-dgilbert@redhat.com
State New
Headers show

Commit Message

Dr. David Alan Gilbert Oct. 3, 2014, 5:47 p.m. UTC
From: Cristian Klein <cristian.klein@cs.umu.se>

Signed-off-by: Cristian Klein <cristian.klein@cs.umu.se>
---
 migration-fd.c | 24 ++++++++++++++++++++++--
 1 file changed, 22 insertions(+), 2 deletions(-)

Comments

David Gibson Nov. 3, 2014, 3:12 a.m. UTC | #1
On Fri, Oct 03, 2014 at 06:47:18PM +0100, Dr. David Alan Gilbert (git) wrote:
> From: Cristian Klein <cristian.klein@cs.umu.se>

This patch really, really requires a rationale in the commit message.
The reason it's necessary is certainly not obvious.

> 
> Signed-off-by: Cristian Klein <cristian.klein@cs.umu.se>
> ---
>  migration-fd.c | 24 ++++++++++++++++++++++--
>  1 file changed, 22 insertions(+), 2 deletions(-)
> 
> diff --git a/migration-fd.c b/migration-fd.c
> index d2e523a..129da99 100644
> --- a/migration-fd.c
> +++ b/migration-fd.c
> @@ -31,13 +31,29 @@
>      do { } while (0)
>  #endif
>  
> +static bool fd_is_socket(int fd)
> +{
> +    struct stat stat;
> +    int ret = fstat(fd, &stat);
> +    if (ret == -1) {
> +        /* When in doubt say no */
> +        return false;
> +    }
> +    return S_ISSOCK(stat.st_mode);
> +}
> +
>  void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **errp)
>  {
>      int fd = monitor_get_fd(cur_mon, fdname, errp);
>      if (fd == -1) {
>          return;
>      }
> -    s->file = qemu_fdopen(fd, "wb");
> +
> +    if (fd_is_socket(fd)) {
> +        s->file = qemu_fopen_socket(fd, "wb");
> +    } else {
> +        s->file = qemu_fdopen(fd, "wb");
> +    }
>  
>      migrate_fd_connect(s);
>  }
> @@ -58,7 +74,11 @@ void fd_start_incoming_migration(const char *infd, Error **errp)
>      DPRINTF("Attempting to start an incoming migration via fd\n");
>  
>      fd = strtol(infd, NULL, 0);
> -    f = qemu_fdopen(fd, "rb");
> +    if (fd_is_socket(fd)) {
> +        f = qemu_fopen_socket(fd, "rb");
> +    } else {
> +        f = qemu_fdopen(fd, "rb");
> +    }
>      if(f == NULL) {
>          error_setg_errno(errp, errno, "failed to open the source descriptor");
>          return;
Cristian Klein Nov. 3, 2014, 1:53 p.m. UTC | #2
On 03 Nov 2014, at 5:12 , David Gibson <david@gibson.dropbear.id.au> wrote:

> On Fri, Oct 03, 2014 at 06:47:18PM +0100, Dr. David Alan Gilbert (git) wrote:
>> From: Cristian Klein <cristian.klein@cs.umu.se>
> 
> This patch really, really requires a rationale in the commit message.
> The reason it's necessary is certainly not obvious.

“”"
libvirt prefers opening the TCP connection itself, for two reasons. First, connection failed errors can be detected easier, without having to parse qemu’s error output. Second, libvirt might be asked to secure the transfer by tunnelling the communication through an TLS layer. Therefore, libvirt opens the TCP connection itself and passes an FD to qemu using QMP and a POSIX-specific mechanism. Hence, in order to make the reverse-path work in such cases, qemu needs to distinguish if the transmitted FD is a socket (reverse-path available) or not (reverse-path might not be available) and use the corresponding abstraction.
“”"

If the above message is clarifies the purpose of this commit, feel free to add it in the next version of the patch.

Cristian

> 
>> 
>> Signed-off-by: Cristian Klein <cristian.klein@cs.umu.se>
>> ---
>> migration-fd.c | 24 ++++++++++++++++++++++--
>> 1 file changed, 22 insertions(+), 2 deletions(-)
>> 
>> diff --git a/migration-fd.c b/migration-fd.c
>> index d2e523a..129da99 100644
>> --- a/migration-fd.c
>> +++ b/migration-fd.c
>> @@ -31,13 +31,29 @@
>>     do { } while (0)
>> #endif
>> 
>> +static bool fd_is_socket(int fd)
>> +{
>> +    struct stat stat;
>> +    int ret = fstat(fd, &stat);
>> +    if (ret == -1) {
>> +        /* When in doubt say no */
>> +        return false;
>> +    }
>> +    return S_ISSOCK(stat.st_mode);
>> +}
>> +
>> void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **errp)
>> {
>>     int fd = monitor_get_fd(cur_mon, fdname, errp);
>>     if (fd == -1) {
>>         return;
>>     }
>> -    s->file = qemu_fdopen(fd, "wb");
>> +
>> +    if (fd_is_socket(fd)) {
>> +        s->file = qemu_fopen_socket(fd, "wb");
>> +    } else {
>> +        s->file = qemu_fdopen(fd, "wb");
>> +    }
>> 
>>     migrate_fd_connect(s);
>> }
>> @@ -58,7 +74,11 @@ void fd_start_incoming_migration(const char *infd, Error **errp)
>>     DPRINTF("Attempting to start an incoming migration via fd\n");
>> 
>>     fd = strtol(infd, NULL, 0);
>> -    f = qemu_fdopen(fd, "rb");
>> +    if (fd_is_socket(fd)) {
>> +        f = qemu_fopen_socket(fd, "rb");
>> +    } else {
>> +        f = qemu_fdopen(fd, "rb");
>> +    }
>>     if(f == NULL) {
>>         error_setg_errno(errp, errno, "failed to open the source descriptor");
>>         return;
> 
> -- 
> David Gibson			| I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
> 				| _way_ _around_!
> http://www.ozlabs.org/~dgibson
David Gibson Nov. 18, 2014, 3:53 a.m. UTC | #3
On Mon, Nov 03, 2014 at 03:53:03PM +0200, Cristian Klein wrote:
> On 03 Nov 2014, at 5:12 , David Gibson <david@gibson.dropbear.id.au> wrote:
> 
> > On Fri, Oct 03, 2014 at 06:47:18PM +0100, Dr. David Alan Gilbert (git) wrote:
> >> From: Cristian Klein <cristian.klein@cs.umu.se>
> > 
> > This patch really, really requires a rationale in the commit message.
> > The reason it's necessary is certainly not obvious.
> 
> “”"
> libvirt prefers opening the TCP connection itself, for two reasons. First, connection failed errors can be detected easier, without having to parse qemu’s error output. Second, libvirt might be asked to secure the transfer by tunnelling the communication through an TLS layer. Therefore, libvirt opens the TCP connection itself and passes an FD to qemu using QMP and a POSIX-specific mechanism. Hence, in order to make the reverse-path work in such cases, qemu needs to distinguish if the transmitted FD is a socket (reverse-path available) or not (reverse-path might not be available) and use the corresponding abstraction.
> “”"
> 
> If the above message is clarifies the purpose of this commit, feel
> free to add it in the next version of the patch.

That would help, yes.
Dr. David Alan Gilbert Nov. 19, 2014, 5:27 p.m. UTC | #4
* David Gibson (david@gibson.dropbear.id.au) wrote:
> On Mon, Nov 03, 2014 at 03:53:03PM +0200, Cristian Klein wrote:
> > On 03 Nov 2014, at 5:12 , David Gibson <david@gibson.dropbear.id.au> wrote:
> > 
> > > On Fri, Oct 03, 2014 at 06:47:18PM +0100, Dr. David Alan Gilbert (git) wrote:
> > >> From: Cristian Klein <cristian.klein@cs.umu.se>
> > > 
> > > This patch really, really requires a rationale in the commit message.
> > > The reason it's necessary is certainly not obvious.
> > 
> > ??????"
> > libvirt prefers opening the TCP connection itself, for two reasons. First, connection failed errors can be detected easier, without having to parse qemu???s error output. Second, libvirt might be asked to secure the transfer by tunnelling the communication through an TLS layer. Therefore, libvirt opens the TCP connection itself and passes an FD to qemu using QMP and a POSIX-specific mechanism. Hence, in order to make the reverse-path work in such cases, qemu needs to distinguish if the transmitted FD is a socket (reverse-path available) or not (reverse-path might not be available) and use the corresponding abstraction.
> > ??????"
> > 
> > If the above message is clarifies the purpose of this commit, feel
> > free to add it in the next version of the patch.
> 
> That would help, yes.

I've added that text into the commit message.

Dave

> 
> -- 
> David Gibson			| I'll have my music baroque, and my code
> david AT gibson.dropbear.id.au	| minimalist, thank you.  NOT _the_ _other_
> 				| _way_ _around_!
> http://www.ozlabs.org/~dgibson


--
Dr. David Alan Gilbert / dgilbert@redhat.com / Manchester, UK
diff mbox

Patch

diff --git a/migration-fd.c b/migration-fd.c
index d2e523a..129da99 100644
--- a/migration-fd.c
+++ b/migration-fd.c
@@ -31,13 +31,29 @@ 
     do { } while (0)
 #endif
 
+static bool fd_is_socket(int fd)
+{
+    struct stat stat;
+    int ret = fstat(fd, &stat);
+    if (ret == -1) {
+        /* When in doubt say no */
+        return false;
+    }
+    return S_ISSOCK(stat.st_mode);
+}
+
 void fd_start_outgoing_migration(MigrationState *s, const char *fdname, Error **errp)
 {
     int fd = monitor_get_fd(cur_mon, fdname, errp);
     if (fd == -1) {
         return;
     }
-    s->file = qemu_fdopen(fd, "wb");
+
+    if (fd_is_socket(fd)) {
+        s->file = qemu_fopen_socket(fd, "wb");
+    } else {
+        s->file = qemu_fdopen(fd, "wb");
+    }
 
     migrate_fd_connect(s);
 }
@@ -58,7 +74,11 @@  void fd_start_incoming_migration(const char *infd, Error **errp)
     DPRINTF("Attempting to start an incoming migration via fd\n");
 
     fd = strtol(infd, NULL, 0);
-    f = qemu_fdopen(fd, "rb");
+    if (fd_is_socket(fd)) {
+        f = qemu_fopen_socket(fd, "rb");
+    } else {
+        f = qemu_fdopen(fd, "rb");
+    }
     if(f == NULL) {
         error_setg_errno(errp, errno, "failed to open the source descriptor");
         return;