1. 30 Oct, 2018 33 commits
  2. 27 Oct, 2018 7 commits
    • Rodrigo Bruno's avatar
      img: Introduce O_FORCE_LOCAL flag for images · d3ecc80e
      Rodrigo Bruno authored
       criu/image-desc.c    | 4 ++--
       criu/image.c         | 4 ++--
       criu/include/image.h | 1 +
       3 files changed, 5 insertions(+), 4 deletions(-)
      
      In order to prepare for remote snapshots (possible with Image Proxy and Image
      Cache) the O_FORCE_LOCAL flag is added to force some images not to be remote
      and stay as local files in the file system.
      Signed-off-by: 's avatarRodrigo Bruno <rbruno@gsd.inesc-id.pt>
      Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      d3ecc80e
    • Pavel Emelyanov's avatar
      lib: Add simple Go wrappers for swrk mode · 3f994bcf
      Pavel Emelyanov authored
      We'll need some docs :) bu the API is
      
      criu := MakeCriu()
      
      criu.Dump(opts, notify)
      criu.Restore(opts, notify)
      criu.PreDump(opts, notify)
      criu.StartPageServer(opts)
      
      where opts is the object from rpc.proto, Go has almost native support
      for those, so caller should
      
      - compile .proto file
      - export it and golang/protobuf/proto
      - create and initialize the CriuOpts struct
      
      and notify is an interface with callbacks that correspond to criu
      notification messages.
      
      A stupid dump/restore tool in src/test/main.go demonstrates the above.
      
      Changes since v1:
      
      * Added keep_open mode for pre-dumps. Do use it one needs
        to call criu.Prepare() right after creation and criu.Cleanup()
        right after .Dump()
      
      * Report resp.cr_errmsg string on request error.
      
      Further TODO:
      
      - docs
      - code comments
      
      travis-ci: success for libphaul (rev2)
      Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      3f994bcf
    • Pavel Emelyanov's avatar
      test, pipes: Exhaustive test of shared pipes · e51960ea
      Pavel Emelyanov authored
      So, here's the next test that just enumerates all possible states and checks
      that CRIU C/R-s it well. This time -- pipes. The goal of the test is to load
      the fd-sharing engine, so pipes are chosen, as they not only generate shared
      struct files, but also produce 2 descriptors in CRIU's fdesc->open callback
      which is handled separately.
      
      It's implemented slightly differently from the unix test, since we don't want
      to check sequences of syscalls on objects, we need to check the task to pipe
      relations in all possible ways.
      
      The 'state' is several tasks, several pipes and each generated test includes
      pipe ends sitting in all possible combinations in the tasks' FDTs.
      
      Also note, that states, that seem to be equal to each other, e.g. pipe between
      tasks A->B and pipe B->A, are really different as CRIU picks the pipe-restorer
      based in task PIDs. So whether the picked task has read end or write end at
      his FDT makes a difference on restore.
      
      Number of tasks is limited with --tasks option, number of pipes with the
      --pipes one. Test just runs all -- generates states, makes them and C/R-s
      them. To check the restored result the /proc/pid/fd/ and /proc/pid/fdinfo/
      for all restored tasks is analyzed.
      
      Right now CRIU works OK for --tasks 2 --pipes 2 (for more -- didn't check).
      Kirill, please, check that your patches pass this test.
      
      TODO:
      
       - Randomize FDs under which tasks see the pipes. Now all tasks if they have
         some pipe, all see it under the same set of FDs.
      Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      e51960ea
    • Pavel Emelyanov's avatar
      test, unix: Exhaustive testing of states (v2) · e098b119
      Pavel Emelyanov authored
      By exhaustive testing I understand a test suite that generates as much
      states to try to C/R as possible by trying all the possible sequences
      of system calls. Since such a generation, if done on all the Linux API
      we support in CRIU, would produce bazillions of process, I propose to
      start with something simple.
      
      As a starting point -- unix stream sockets with abstract names that
      can be created and used by a single process :)
      
      The script generates situations in which unix sockets can get into by
      using a pre-defined set of system calls. In this patch the syscalls
      are socket, listen, bind, accept, connect and send. Also the nummber
      of system calls to use (i.e. -- the depth of the tree) is limited by
      the --depth option.
      
      There are three things that can be done with a generated 'state':
      
      I) Generate :) and show
      
      Generation is done by recursively doing everything that is possible
      (and makes sence) in a given state. To reduce the size of the tree
      some meaningless branches are cut, e.g. creating a socket and closing
      it right after that, creating two similar sockets one-by-one and some
      more.
      
      Shown on the screen is a cryptic string, e.g. 'SA-CX-MX_SBL one,
      describing the sockets in the state. This is how it can be decoded:
      
       - sockets are delimited with _
       - first goes type (S -- stream, D --datagram)
       - next goes name state (A -- no name, B with name, X socket is not in
         FD table, i.e. closed or not yet accepted)
       - next may go letter L meaning that the socket is listening
       - -Cx -- socket is connected and x is the peer's name state
       - -Ixyz -- socket has incoming connections queue and xyz are the
         connect()-ors name states
       - -Mxyz -- socket has messages and xyz is senders' name states
      
      The example above means, that we have two sockets:
      
       - SA-CX-MX: stream, with no name, connected to a dead one and with a
         message from a dead one
       - SBL: stream, with name, listening
      
      Next printed is the sequence of system calls to get into it, e.g. this
      is how to get into the state above:
      
      	socket(S) = 1
      	bind(1, $name-1)
      	listen(1)
      	socket(S) = 2
      	connect(2, $name-1)
      	accept(1) = 3
      	send(2, $message-0)
      	send(3, $message-0)
      	close(3)
      
      Program has created a stream socket, bound it, listened it, then
      created another stream socket, connected to the 1st one, then accepted
      the connection sent two messages vice-versa and closed the accepted
      end, so the 1st socket left connected to the dead socket with a
      message from it.
      
      II) Run the state
      
      This is when test actually creates a process that does the syscalls
      required to get into the generated state (and hopefully gets into it).
      
      III) Check C/R of the state
      
      This is the trickiest part when it comes to the R step -- it's not
      clear how to validate that the state restored is correct. But if only
      trying to dump the state -- it's just calling criu dump. As images dir
      the state string description is used.
      
      One may choose only to generate the states with --gen option. One may
      choose only to run the states with --run option. The latter is useful
      to verify that the states generator is actually producing valid
      states. If no options given, the state is also dump-ed (restore is to
      come later).
      
      For now the usage experience is like this:
      
      - Going --depth 10 --gen (i.e. just generating all possibles states
        that are acheivable with 10 syscalls) produces 44 unique states for
        0.01 seconds. The generated result covers some static tests we have
        in zdtm :)  More generation stats is like this:
         --depth 15 : 1.1 sec   / 72 states
         --depth 18 : 13.2 sec  / 89 states
         --depth 20 : 1 m 8 sec / 101 state
      
      - Running and trying with criu is checked with --depth 9. Criu fails
        to dump the state SA-CX-MX_SBL (shown above) with the error
      
        Error (criu/sk-queue.c:151): recvmsg fail: error: Connection reset by peer
      
      Nearest plans:
      
      1. Add generators for on-disk sockets names (now oly abstract).
         Here an interesting case is when names overlap and one socket gets
         a name of another, but isn't accessible by it
      
      2. Add datagram sockets.
         Here it'd be fun to look at how many-to-one connections are
         generated and checked.
      
      3. Add socketpair()-s.
      
      Farther plans:
      
      1. Cut the tree better to allow for deeper tree scan.
      
      2. Add restore.
      
      3. Add SCM-s
      
      4. Have the exhaustive testing for other resources.
      
      Changes since v1:
      
      * Added DGRAM sockets :)
      
        Dgram sockets are trickier that STREAM, as they can reconnect from
        one peer to another. Thus just limiting the tree depth results in
        wierd states when socket just changes peer. In the v1 of this patch
        new sockets were added to the state only when old ones reported that
        there's nothing that can be done with them. This limited the amount
        of stupid branches, but this strategy doesn't work with dgram due to
        reconnect. Due to this, change #2:
      
      * Added the --sockets NR option to limit the amount of sockets.
      
        This allowed to throw new sockets into the state on each step, which
        made a lot of interesting states for DGRAM ones.
      
      * Added the 'restore' stage and checks after it.
      
        After the process is restore the script performs as much checks as
        possible having the expected state description in memory. The checks
        verify that the values below get from real sockets match the
        expectations in generated state:
      
         - socket itself
         - name
         - listen state
         - pending connections
         - messages in queue (sender is not checked)
         - connectivity
      
        The latter is checked last, after all queues should be empty, by
        sending control messages with socket.recv() method.
      
      * Added --keep option to run all tests even if one of them fails.
      
        And print nice summary at the end.
      
      So far the test found several issues:
      
      - Dump doesn't work for half-closed connection with unread messages
      - Pending half-closed connection is not restored
      - Socket name is not restored
      - Message is not restored
      
      New TODO:
      
      - Check listen state is still possible to accept connections (?)
      - Add socketpair()s
      - Add on-disk names
      - Add SCM-s
      - Exhaustive script for other resources
      Signed-off-by: 's avatarPavel Emelyanov <xemul@virtuozzo.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      e098b119
    • Cyrill Gorcunov's avatar
      x86: cpu -- Proceed even if xsavec detected for dev reason · 39a2602f
      Cyrill Gorcunov authored
      Andrew reported that previously he been able to c/r even
      on the machine with xsavec enabled, so allow to process
      for now.
      
      P.S.I'm investigating the problem and to not block testing
      process lets permit passing with xsaves bit present.
      Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@gmail.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      39a2602f
    • Cyrill Gorcunov's avatar
      x86: cpu -- Show which exactly features are failing in fpu capability mode · bda25876
      Cyrill Gorcunov authored
      For easier understanding what is failed.
      Reviewed-by: 's avatarDmitry Safonov <0x7f454c46@gmail.com>
      Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@gmail.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      bda25876
    • Cyrill Gorcunov's avatar
      x86: cpu -- Use rt information since it might we filtered · d8ff54e6
      Cyrill Gorcunov authored
      With new cpu-cap='op=noxsaves' mode on x86 we should use
      compel's instance of rt info since only it carries
      features masked.
      Reviewed-by: 's avatarDmitry Safonov <0x7f454c46@gmail.com>
      Signed-off-by: 's avatarCyrill Gorcunov <gorcunov@gmail.com>
      Signed-off-by: 's avatarAndrei Vagin <avagin@virtuozzo.com>
      d8ff54e6