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

Re: [Xen-devel] [PATCH v3 17/28] tools/libxl: Infrastructure for reading a libxl migration v2 stream



Andrew Cooper writes ("Re: [PATCH v3 17/28] tools/libxl: Infrastructure for 
reading a libxl migration v2 stream"):
> On 13/07/15 15:31, Ian Jackson wrote:
> > For example, there is also incoming_record, and record_queue (which
> > may be undefined, empty, one entry, >=2 entries), and the datacopier.
> 
> These cannot be expressed in the above terms.
> 
> incoming_record (as already noted in libxl_internal.h) is only used
> while reading a record, which happens in both Active/NORMAL and
> Active/BUFFERING
> 
> record_queue is strictly 0 or 1 entries during NORMAL, grows from 0 to
> >=1 during BUFFERING, and shrinks back to 0 during UNBUFFERING.
> 
> How would you go about expressing this without a state transition
> diagram? (I really don't think an ascii art state transition diagram
> will help make this any clearer)

  *          phase     running   in_         record   incoming
  *                              checkpoint  _queue   _record
  *
  * Undefined undef       undef    undef       undef    undef
  * Idle      undef       false    false       0        0
  * Active    NORMAL      true     false       0/1      0/partial
  * Active    BUFFERING   true     true        any      0/partial
  * Active    UNBUFFERING true     true        any      0

Adjust to taste and to correspond to facts.


> > Is the datacopier always active ?  I think it is except
> >  - when we are processing one of our own callbacks, or
> >  - in BUFFERING/UNBUFFERING, when process_record is setting up
> >    its own callbacks
> 
> The datacopier is only active while reading a record from the stream,
> but that is only (logically) half of the work to do.  It will never be
> active when processing records.
> 
> There is a second datacopier for qemu use which is only active while
> processing an EMULATOR record.

Maybe this wants to be in the table, or maybe it wants a comment next
to the variable name in the struct.


> > Maybe you want to say in a comment that there is always _either_ a
> > datacopier callback to come, _or_ a callback set up by process_record.
> 
> ok.

I'm glad that I divined correctly that this is true :-).

> >> +static void stream_continue(libxl__egc *egc,
> >> +                            libxl__stream_read_state *stream)
> >> +{
> > ...
> >> +    switch (stream->phase) {
> >> +    case SRS_PHASE_NORMAL:
> >> +        /*
> >> +         * Normal phase (regular migration or restore from file):
> >> +         *
> >> +         * logically:
> >> +         *   do { read_record(); process_record(); } while ( not END );
> >> +         *
> >> +         * Alternate between reading a record from the stream, and
> >> +         * processing the record.  There should never be two records
> >> +         * in the queue.
> >> +         */
> >> +        if (LIBXL_STAILQ_EMPTY(&stream->record_queue))
> >> +            setup_read_record(egc, stream);
> >> +        else {
> >> +            if (process_record(egc, stream))
> >> +                setup_read_record(egc, stream);
> > 
> > Weren't you going to add an assert here, that the queue is empty ?
...
> It is in the paragraph below PHASE_NORMAL, which you have snipped.

I have grepped the whole of `stream_continue' in the tip of v3 of
your series (b8bf4572) and these are the results:

    assert(stream->recursion_guard == false);
        assert(stream->in_checkpoint);
        assert(stream->in_checkpoint);
    assert(stream->recursion_guard == true);

I meant a call to assert() which ensures that after process_record in
PHASE_NORMAL, the queue is empty.

Ian.

_______________________________________________
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®.