[libvirt] [PATCH] cmdMigrate: move vshConnect before vshWatchJob

Chun Yan Liu cyliu at suse.com
Thu Aug 14 07:02:56 UTC 2014



>>> On 8/8/2014 at 04:44 PM, in message
<1407487476-28077-1-git-send-email-cyliu at suse.com>, Chunyan Liu
<cyliu at suse.com> wrote: 
> A possible fix to issue: 
> http://www.redhat.com/archives/libvir-list/2014-August/thread.html#00227 
>  
> While doing migration on KVM host, found problem sometimes: 
> VM is already running on the target host and disappears from source 
> host, but 'virsh migrate' command line hangs, cannot exit normally. 
> If pressing "ENTER" key, it will exit. 
>  
> The code hangs at tools/virsh-domain.c: cmdMigrate 
> ->vshWatchJob->poll(): 
> poll() is trying to select pipe_fd, which is used to receive message 
> from doMigrate thread. In debugging, found that doMigrate finishes 
> and at the end it does call safewrite() to write the retval ('0' or 
> '1') to pipe_fd, and the write is completed. But cmdMigrate poll() 
> cannot get the event. If pressing "ENTER" key, poll() can get the 
> event and select pipe_fd, then command line can exit. 
>  
> In current code, authentication thread which is called by vshConnect 
> will use stdin, and at the same time, in cmdMigrate main process, 
> poll() is listening to stdin, that probably affect poll() to get 
> pipe_fd event. Better to move authentication before vshWatchJob. With 
> this change, above problem does not exist.

Any comments about this patch?

>  
> Signed-off-by: Chunyan Liu <cyliu at suse.com> 
> --- 
>  tools/virsh-domain.c | 26 ++++++++++++++++++++------ 
>  tools/virsh.h        |  1 + 
>  2 files changed, 21 insertions(+), 6 deletions(-) 
>  
> diff --git a/tools/virsh-domain.c b/tools/virsh-domain.c 
> index f7193cb..2562326 100644 
> --- a/tools/virsh-domain.c 
> +++ b/tools/virsh-domain.c 
> @@ -8965,6 +8965,7 @@ doMigrate(void *opaque) 
>      virTypedParameterPtr params = NULL; 
>      int nparams = 0; 
>      int maxparams = 0; 
> +    virConnectPtr dconn = data->dconn; 
>   
>      sigemptyset(&sigmask); 
>      sigaddset(&sigmask, SIGINT); 
> @@ -9079,18 +9080,12 @@ doMigrate(void *opaque) 
>              ret = '0'; 
>      } else { 
>          /* For traditional live migration, connect to the destination host  
> directly. */ 
> -        virConnectPtr dconn = NULL; 
>          virDomainPtr ddom = NULL; 
>   
> -        dconn = vshConnect(ctl, desturi, false); 
> -        if (!dconn) 
> -            goto out; 
> - 
>          if ((ddom = virDomainMigrate3(dom, dconn, params, nparams, flags)))  
> { 
>              virDomainFree(ddom); 
>              ret = '0'; 
>          } 
> -        virConnectClose(dconn); 
>      } 
>   
>   out: 
> @@ -9152,6 +9147,23 @@ cmdMigrate(vshControl *ctl, const vshCmd *cmd) 
>      data.cmd = cmd; 
>      data.writefd = p[1]; 
>   
> +    if (vshCommandOptBool(cmd, "p2p") || vshCommandOptBool(cmd, "direct"))  
> { 
> +        data.dconn = NULL; 
> +    } else { 
> +        /* For traditional live migration, connect to the destination host.  
> */ 
> +        virConnectPtr dconn = NULL; 
> +        const char *desturi = NULL; 
> + 
> +        if (vshCommandOptStringReq(ctl, cmd, "desturi", &desturi) < 0) 
> +            goto cleanup; 
> + 
> +        dconn = vshConnect(ctl, desturi, false); 
> +        if (!dconn) 
> +            goto cleanup; 
> + 
> +        data.dconn = dconn; 
> +    } 
> + 
>      if (virThreadCreate(&workerThread, 
>                          true, 
>                          doMigrate, 
> @@ -9163,6 +9175,8 @@ cmdMigrate(vshControl *ctl, const vshCmd *cmd) 
>      virThreadJoin(&workerThread); 
>   
>   cleanup: 
> +    if (data.dconn) 
> +        virConnectClose(data.dconn); 
>      virDomainFree(dom); 
>      VIR_FORCE_CLOSE(p[0]); 
>      VIR_FORCE_CLOSE(p[1]); 
> diff --git a/tools/virsh.h b/tools/virsh.h 
> index 7656407..b4df24b 100644 
> --- a/tools/virsh.h 
> +++ b/tools/virsh.h 
> @@ -371,6 +371,7 @@ struct _vshCtrlData { 
>      vshControl *ctl; 
>      const vshCmd *cmd; 
>      int writefd; 
> +    virConnectPtr dconn; 
>  }; 
>   
>  /* error handling */ 
 





More information about the libvir-list mailing list