|
[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
|
![]() |
Lists.xenproject.org is hosted with RackSpace, monitoring our |