[PATCH 0/6][lxc][v3] Link LXC with USERCR

Sukadev Bhattiprolu sukadev at linux.vnet.ibm.com
Thu Apr 1 22:54:18 PDT 2010


Daniel Lezcano [daniel.lezcano at free.fr] wrote:
> Sukadev Bhattiprolu wrote:
>> Daniel Lezcano [daniel.lezcano at free.fr] wrote:
>>   
>>> But most of the simple test programs I run, exit right after the 
>>> restart  was marked successful instead of continuing their execution.
>>>
>>> In the kernel I see the traces:
>>>
>>> [26108:3:c/r:restore_debug_free:145] active pid was 3, ctx->errno 0
>>> [26108:3:c/r:restore_debug_free:147] kflags 6 uflags 0 oflags 3
>>> [26108:3:c/r:restore_debug_free:149] task[0] to run 1
>>> [26108:3:c/r:restore_debug_free:149] task[1] to run 2
>>> [26108:3:c/r:restore_debug_free:149] task[2] to run 3
>>> [26108:3:c/r:restore_debug_free:174] pid 26104 type Coord state Success
>>> [26108:3:c/r:restore_debug_free:174] pid 26106 type Root state Success
>>> [26108:3:c/r:restore_debug_free:174] pid 26107 type Task state Success
>>> [26108:3:c/r:restore_debug_free:174] pid 26108 type Task state Success
>>> [26108:3:c/r:pgarr_release_pages:102] total pages 0
>>> [26108:3:c/r:do_restart:1446] sys_restart returns -516
>>>
>>> What does mean -516 ? an error ?
>>>     
>>
>> Could it be ERESTART_RESTARTBLOCK ? Also, can you let us know what application
>> causes this ? Are any signals generated ?
>>   
> That happens with sleep.

Oh, I misread earlier and thought both checkpoint and restat of sleep worked.

Anyway, when I run C/R a simple program with sleep(), I see the above errors
too, but I think they are expected if the checkpoint happened during sleep -
the system call returned prematurely and after restart the syscall returns
-ERESTART_RESTARTBLOCK which I think causes libc to repeat the syscall.

I get the above ERESTART* error in dmesg, when I lxc-checkpoint/lxc-restart
the following simple program, but, application restarts correctly and
continues to write to /tmp/foo.

If fd == 1, however, the writes to stdout do not show up on stdout
even though the application continues to run (you can strace and
see that 'i' continues to get incremented). I am chasing the stdout
problem.

Sukadev
---
#include <stdio.h>
#include <string.h>
#include <sys/fcntl.h>

main()
{
        int i, n, fd;
        char buf[256];

        fd = open("/tmp/foo", O_CREAT|O_RDWR|O_TRUNC, 0666);
        if (fd < 0) {
                perror("open()");
                exit(1);
        }

        for (i = 0; i < 1000; i++) {
                sprintf(buf, "i %d\n", i);
                n = write(fd, buf, strlen(buf));
                if (n != strlen(buf))
                        perror("write()");
                sleep(1);
        }
}


More information about the Containers mailing list