[Date Prev][Date Next][Thread Prev][Thread Next][Date Index][Thread Index]

Re: [Xen-devel] [PATCH for-4.7] tools/libxl: Fix legacy migration following COLO backchannel breakage



On 04/15/2016 03:54 AM, Andrew Cooper wrote:
> c/s f5d947bf1b "tools/libxl: add back channel support to read stream"
> made a bogus adjustment to libxl__stream_read_start(), including
> removing the comment hinting at what was going on, which breaks
> conversion of a legacy migration stream.
> 
> Symptoms look like:
> 
>   root@anonymi:~ # xl migrate domU host
>   migration target: Ready to receive domain.
>   Saving to migration stream new xl format (info 0x1/0x0/2677)
>   xc: error: error polling suspend notification channel: -1: Internal error
>   Loading new save file <incoming migration stream> (new xl fmt info 
> 0x1/0x0/2677)
>    Savefile contains xl domain config in JSON format
>   Parsing config from <saved>
>   libxl: error: libxl_stream_read.c:327:stream_header_done: Invalid ident: 
> expected 0x4c6962786c466d74, got 0x01f00f0000000000
>   libxl: error: libxl_utils.c:430:libxl_read_exactly: file/stream truncated 
> reading ipc msg header from domain 1 save/restore helper stdout pipe
> 
> The adjustment is not required for backchannel support (as there is no
> interaction between back channels and legacy conversion), and caused
> stream->fd to be latched in the datacopier before legacy conversion
> substitutes it for the fd which is the output of the conversion script.
> 
> This causes libxl to consume data from the legacy stream rather than the
> v2 stream, and for the conversion script to encounter an error as the
> legacy stream appears to skip ahead.
> 
> Undo the adjustments to libxl__stream_read_start(), and introduce a
> better description of what is going on.  Introduce some extra assertions
> to try and catch similar breakage in the future.
> 
> Reported-by: Olaf Hering <olaf@xxxxxxxxx>
> Signed-off-by: Andrew Cooper <andrew.cooper3@xxxxxxxxxx>

Reviewed-by: Wen Congyang <wency@xxxxxxxxxxxxxx>

> ---
> CC: Ian Jackson <Ian.Jackson@xxxxxxxxxxxxx>
> CC: Wei Liu <wei.liu2@xxxxxxxxxx>
> CC: Olaf Hering <olaf@xxxxxxxxx>
> CC: Yang Hongyang <hongyang.yang@xxxxxxxxxxxx>
> CC: Wen Congyang <wency@xxxxxxxxxxxxxx>
> CC: Changlong Xie <xiecl.fnst@xxxxxxxxxxxxxx>
> ---
>  tools/libxl/libxl_stream_read.c | 33 ++++++++++++++++++++++++---------
>  1 file changed, 24 insertions(+), 9 deletions(-)
> 
> diff --git a/tools/libxl/libxl_stream_read.c b/tools/libxl/libxl_stream_read.c
> index 9659051..89c2f21 100644
> --- a/tools/libxl/libxl_stream_read.c
> +++ b/tools/libxl/libxl_stream_read.c
> @@ -234,16 +234,16 @@ void libxl__stream_read_start(libxl__egc *egc,
>      stream->running = true;
>      stream->phase   = SRS_PHASE_NORMAL;
>  
> -    dc->ao       = stream->ao;
> -    dc->copywhat = "restore v2 stream";
> -    dc->readfd = stream->fd;
> -    dc->writefd  = -1;
> -
> -    if (stream->back_channel)
> -        return;
> -
>      if (stream->legacy) {
> -        /* Convert the legacy stream. */
> +        /*
> +         * Convert the legacy stream.
> +         *
> +         * This results in a fork()/exec() of conversion helper script.  It 
> is
> +         * passed the exiting stream->fd as an input, and returns the
> +         * transformed stream via a new pipe.  The fd of this new pipe then
> +         * replaces stream->fd, to make the rest of the stream read code
> +         * agnostic to whether legacy conversion is happening or not.
> +         */
>          libxl__conversion_helper_state *chs = &stream->chs;
>  
>          chs->legacy_fd = stream->fd;
> @@ -258,10 +258,25 @@ void libxl__stream_read_start(libxl__egc *egc,
>              goto err;
>          }
>  
> +        /* There should be no interaction of COLO backchannels and legacy
> +         * stream conversion. */
> +        assert(!stream->back_channel);
> +
> +        /* Confirm *dc is still zeroed out, while we shuffle stream->fd. */
> +        assert(dc->ao == NULL);
>          assert(stream->chs.v2_carefd);
>          stream->fd = libxl__carefd_fd(stream->chs.v2_carefd);
>          stream->dcs->libxc_fd = stream->fd;
>      }
> +    /* stream->fd is now a v2 stream. */
> +
> +    dc->ao       = stream->ao;
> +    dc->copywhat = "restore v2 stream";
> +    dc->readfd   = stream->fd;
> +    dc->writefd  = -1;
> +
> +    if (stream->back_channel)
> +        return;
>  
>      /* Start reading the stream header. */
>      rc = setup_read(stream, "stream header",
> 




_______________________________________________
Xen-devel mailing list
Xen-devel@xxxxxxxxxxxxx
http://lists.xen.org/xen-devel

 


Rackspace

Lists.xenproject.org is hosted with RackSpace, monitoring our
servers 24x7x365 and backed by RackSpace's Fanatical Support®.