Quoting Oren Laadan ([EMAIL PROTECTED]):
>
>
> Serge E. Hallyn wrote:
>> Quoting Oren Laadan ([EMAIL PROTECTED]):
>>> +int do_checkpoint(struct cr_ctx *ctx)
>>> +{
>>> +   int ret;
>>> +
>>> +   /* FIX: need to test whether container is checkpointable */
>>> +
>>> +   ret = cr_write_hdr(ctx);
>>> +   if (!ret)
>>> +           ret = cr_write_task(ctx, current);
>>> +   if (!ret)
>>> +           ret = cr_write_tail(ctx);
>>> +
>>> +   /* on success, return (unique) checkpoint identifier */
>>> +   if (!ret)
>>> +           ret = ctx->crid;
>>
>> Does this crid have a purpose?
>
> yes, at least three; both are for the future, but important to set the
> meaning of the return value of the syscall already now. The "crid" is
> the CR-identifier that identifies the checkpoint. Every checkpoint is
> assigned a unique number (using an atomic counter).
>
> 1) if a checkpoint is taken and kept in memory (instead of to a file) then
> this will be the identifier with which the restart (or cleanup) would refer
> to the (in memory) checkpoint image
>
> 2) to reduce downtime of the checkpoint, data will be aggregated on the
> checkpoint context, as well as referenced to (cow-ed) pages. This data can
> persist between calls to sys_checkpoint(), and the 'crid', again, will be
> used to identify the (in-memory-to-be-dumped-to-storage) context.
>
> 3) for incremental checkpoint (where a successive checkpoint will only
> save what has changed since the previous checkpoint) there will be a need
> to identify the previous checkpoints (to be able to know where to take
> data from during restart). Again, a 'crid' is handy.
>
> [in fact, for the 3rd use, it will make sense to write that number as
> part of the checkpoint image header]
>
> Note that by doing so, a process that checkpoints itself (in its own
> context), can use code that is similar to the logic of fork():
>
>       ...
>       crid = checkpoint(...);
>       switch (crid) {
>       case -1:
>               perror("checkpoint failed");
>               break;
>       default:
>               fprintf(stderr, "checkpoint succeeded, CRID=%d\n", ret);
>               /* proceed with execution after checkpoint */
>               ...
>               break;
>       case 0:
>               fprintf(stderr, "returned after restart\n");
>               /* proceed with action required following a restart */
>               ...
>               break;
>       }
>       ...

Thanks - for this and the later explanations in replies to Louis.

Really I had no doubt it had a purpose :)  but wasn't sure what it was.
Quite clear now.  Thanks.

-serge
_______________________________________________
Containers mailing list
[EMAIL PROTECTED]
https://lists.linux-foundation.org/mailman/listinfo/containers

_______________________________________________
Devel mailing list
Devel@openvz.org
https://openvz.org/mailman/listinfo/devel

Reply via email to