[CRIU] Options when restoring a socket

Pavel Emelyanov xemul at parallels.com
Tue Apr 21 13:19:52 PDT 2015


On 04/21/2015 11:08 PM, Ross Boucher wrote:
> In our case, the peer will be gone, and the restored process is in the middle of a
> blocking read.  As such the ideal for us is to receive an error for that read (in
> other words, abort the connection immediately/rst).  We'd also be fine with having
> to specify this specific tcp connection/file descriptor so it knows to do this on 
> restore.

I see. In this case for restore the best that can be done is the closed socket that 
would report EOF (zero) upon read.

Anyway, the extended notion of the --ext-unix-sk should handle this. Unix sockets
C/R code is in sk-unix.c, if you have questions about the codeflow/logic there, just
feel free to ask :)

-- Pavel

> On Tue, Apr 21, 2015 at 12:03 PM, Pavel Emelyanov <xemul at parallels.com <mailto:xemul at parallels.com>> wrote:
> 
>     On 04/21/2015 09:54 PM, Ross Boucher wrote:
>     > The tcp restore relies on the other side of the tcp connection still being open
>     > though, right?
> 
>     Well, no. The TCP repair we use doesn't care about it. Just once we did the restore
>     and _if_ the peer is not there, the remote kernel would respond with RST on _any_
>     packet from restored socket and the connection would abort.
> 
>     So if we're talking about restore procedure only -- then criu doesn't care. If we're
>     talking about "successful restore" as the result user wants, then yes, peer should
>     still be alive and criu does everything it can to make it such.
> 
>     > In my case that won't be very easy. It would be much easier for me
>     > to just re-establish the connection if I could notify myself somehow that the
>     > process is restored. (I'm playing around right now with running a timer in another
>     > thread to try and do that...)
> 
>     Unix sockets are not the same as TCP I would say. But, since you're OK with connecting
>     the socket back upon restore, then we can teach CRIU do all this for you.
> 
>     -- Pavel
> 
>     > On Tue, Apr 21, 2015 at 11:52 AM, Pavel Emelyanov <xemul at parallels.com <mailto:xemul at parallels.com> <mailto:xemul at parallels.com <mailto:xemul at parallels.com>>> wrote:
>     >
>     >     On 04/21/2015 07:46 PM, Ross Boucher wrote:
>     >     > Thanks, this is all very interesting. How does the story change for tcp sockets?
>     >
>     >     For TCP we can "lock" the connection so that the peer doesn't see the
>     >     socket gets closed. We either put iptables rule that blocks all the
>     >     packets or (in case of containers) unplug container's virtual NIC from
>     >     the network. So while the connection is locked we can kill the socket,
>     >     then create it back. And the TCP-repair thing helps us "connect" the
>     >     socket back w/o actually doing the connect.
>     >
>     >     For unix socket we don't have ability to "lock" the connection in the
>     >     first place. So once we dumped the task we cannot keep peer from noticing
>     >     this. This thing was the main reason for not implementing this.
>     >
>     >     -- Pavel
>     >
>     >     > On Tue, Apr 21, 2015 at 5:03 AM, Pavel Emelyanov <xemul at parallels.com <mailto:xemul at parallels.com> <mailto:xemul at parallels.com <mailto:xemul at parallels.com>> <mailto:xemul at parallels.com <mailto:xemul at parallels.com> <mailto:xemul at parallels.com <mailto:xemul at parallels.com>>>> wrote:
>     >     >
>     >     >     On 04/19/2015 04:48 AM, Ross Boucher wrote:
>     >     >     > Hey everyone,
>     >     >
>     >     >     Hi, Ross.
>     >     >
>     >     >     > I've been trying to figure out both what happens when you checkpoint an open socket
>     >     >     > and what my options are for restoring that socket (or maybe doing something else at
>     >     >     > that point in time). It might be best to just describe the program I have and what
>     >     >     > I want to accomplish.
>     >     >     >
>     >     >     > I have two programs communicating over a socket. Program A opens a socket and listens
>     >     >     > for connections, and then program B connects to it. They essentially exchange messages
>     >     >     > forever in a pattern something like:
>     >     >     >
>     >     >     > A -> B send next message
>     >     >     > B -> A ok, here's the next message
>     >     >     >
>     >     >     > Obviously, in between, A performs some actions. The goal is to checkpoint A after each
>     >     >     > message is processed and before the next is received (while leaving the process
>     >     >     > running), so that we can restore to any previous state and reprocess possibly changed
>     >     >     > messages.
>     >     >
>     >     >     First thing that comes to mind is that --track-mem thing definitely makes sense for
>     >     >     such frequent C/R-s. But that's a side note :)
>     >     >
>     >     >     > It's completely fine for our use case to have to re-establish that socket connection,
>     >     >     > we don't actually need or want to try and magically use the same socket (since program
>     >     >     > B has probably moved on to other things in between).
>     >     >
>     >     >     Hm.. OK.
>     >     >
>     >     >     > Is this a use case for a criu plugin?
>     >     >
>     >     >     Well, I would say it is, but there are two things about it. First is that we don't have any
>     >     >     hooks in CRIU code for sockets, so patching will be required. And the second is -- many
>     >     >     people are asking for handling the connected unix socket, so I think we'd better patch
>     >     >     criu itself to provide some sane API rather than make everybody invent their own plugins :)
>     >     >
>     >     >     So, I see two options for such an API.
>     >     >
>     >     >     The first is to extend the --ext-unix-sk to accept socket ID as an argument that would
>     >     >     force even stream sockets to be marked as "external" and not block the dump. On restore
>     >     >     the --ext-unix-sk with $ID would make CRIU connect the restored unix socket back to its
>     >     >     original path. Optionally we can make the argument look like $ID:$PATH and connect to
>     >     >     $PATH instead.
>     >     >
>     >     >     The other option would be to still teach dump accept the --ext-unix-sk $ID parameter. On
>     >     >     restore you can create the connection yourself and then pass it into CRIU with --inherit-fd
>     >     >     argument. We already have fd inheritance for pipes and files [1], but we can patch CRIU
>     >     >     to support it for sockets too.
>     >     >
>     >     >     [1] http://criu.org/Inheriting_FDs_on_restore
>     >     >
>     >     >     > I've tried playing around with the ext-unix-sk flag but I haven't quite figured anything
>     >     >     > out yet.
>     >     >
>     >     >     The --ext-unix-sk is for datagram sockets as they are stateless and we can just close and
>     >     >     re-open one back w/o any risk that the peer notices it.
>     >     >
>     >     >     > Any help would be appreciated. Thanks!
>     >     >
>     >     >     -- Pavel
>     >     >
>     >     >
>     >
>     >
> 
> 



More information about the CRIU mailing list