use lazy-pages ready notification for criu >= 3.15
This relies on
and emulates the previous behavior by writing \0 and closing status
fd (as it was done by criu).
@@ -973,9 +973,13 @@ func (c *linuxContainer) Checkpoint(criuOpts *CriuOpts) error {
return fmt.Errorf("invalid --status-fd argument %d: not writable", fd)
}
+ if c.checkCriuVersion(31500) != nil {
+ // For criu 3.15+, use notifications (see case "status-ready"
+ // in criuNotifications). Otherwise, rely on criu status fd.
rpcOpts.StatusFd = proto.Int32(int32(fd))
}
}
+ }
req := &criurpc.CriuReq{
Type: &t,
@@ -1652,6 +1656,16 @@ func (c *linuxContainer) criuNotifications(resp *criurpc.CriuResp, process *Proc
if err := utils.SendFd(process.ConsoleSocket, master.Name(), master.Fd()); err != nil {
return err
}
+ case "status-ready":
+ if opts.StatusFd != -1 {
+ // write \0 to status fd to notify that lazy page server is ready
+ _, err := unix.Write(opts.StatusFd, []byte{0})
+ if err != nil {
+ logrus.Warnf("can't write \\0 to status fd: %v", err)
+ }
+ _ = unix.Close(opts.StatusFd)
+ opts.StatusFd = -1
+ }
}
return nil
}
