1+ //go:build !runc_nocriu
2+
13package libcontainer
24
35import (
@@ -295,6 +297,11 @@ func (c *Container) Checkpoint(criuOpts *CriuOpts) error {
295297 return errors .New ("invalid directory to save checkpoint" )
296298 }
297299
300+ cgMode , err := criuCgMode (criuOpts .ManageCgroupsMode )
301+ if err != nil {
302+ return err
303+ }
304+
298305 // Since a container can be C/R'ed multiple times,
299306 // the checkpoint directory may already exist.
300307 if err := os .Mkdir (criuOpts .ImagesDirectory , 0o700 ); err != nil && ! os .IsExist (err ) {
@@ -309,22 +316,23 @@ func (c *Container) Checkpoint(criuOpts *CriuOpts) error {
309316 defer imageDir .Close ()
310317
311318 rpcOpts := criurpc.CriuOpts {
312- ImagesDirFd : proto .Int32 (int32 (imageDir .Fd ())),
313- LogLevel : proto .Int32 (4 ),
314- LogFile : proto .String (logFile ),
315- Root : proto .String (c .config .Rootfs ),
316- ManageCgroups : proto .Bool (true ),
317- NotifyScripts : proto .Bool (true ),
318- Pid : proto .Int32 (int32 (c .initProcess .pid ())),
319- ShellJob : proto .Bool (criuOpts .ShellJob ),
320- LeaveRunning : proto .Bool (criuOpts .LeaveRunning ),
321- TcpEstablished : proto .Bool (criuOpts .TcpEstablished ),
322- ExtUnixSk : proto .Bool (criuOpts .ExternalUnixConnections ),
323- FileLocks : proto .Bool (criuOpts .FileLocks ),
324- EmptyNs : proto .Uint32 (criuOpts .EmptyNs ),
325- OrphanPtsMaster : proto .Bool (true ),
326- AutoDedup : proto .Bool (criuOpts .AutoDedup ),
327- LazyPages : proto .Bool (criuOpts .LazyPages ),
319+ ImagesDirFd : proto .Int32 (int32 (imageDir .Fd ())),
320+ LogLevel : proto .Int32 (4 ),
321+ LogFile : proto .String (logFile ),
322+ Root : proto .String (c .config .Rootfs ),
323+ ManageCgroups : proto .Bool (true ), // Obsoleted by ManageCgroupsMode.
324+ ManageCgroupsMode : & cgMode ,
325+ NotifyScripts : proto .Bool (true ),
326+ Pid : proto .Int32 (int32 (c .initProcess .pid ())),
327+ ShellJob : proto .Bool (criuOpts .ShellJob ),
328+ LeaveRunning : proto .Bool (criuOpts .LeaveRunning ),
329+ TcpEstablished : proto .Bool (criuOpts .TcpEstablished ),
330+ ExtUnixSk : proto .Bool (criuOpts .ExternalUnixConnections ),
331+ FileLocks : proto .Bool (criuOpts .FileLocks ),
332+ EmptyNs : proto .Uint32 (criuOpts .EmptyNs ),
333+ OrphanPtsMaster : proto .Bool (true ),
334+ AutoDedup : proto .Bool (criuOpts .AutoDedup ),
335+ LazyPages : proto .Bool (criuOpts .LazyPages ),
328336 }
329337
330338 // if criuOpts.WorkDirectory is not set, criu default is used.
@@ -381,12 +389,6 @@ func (c *Container) Checkpoint(criuOpts *CriuOpts) error {
381389 rpcOpts .TrackMem = proto .Bool (true )
382390 }
383391
384- // append optional manage cgroups mode
385- if criuOpts .ManageCgroupsMode != 0 {
386- mode := criuOpts .ManageCgroupsMode
387- rpcOpts .ManageCgroupsMode = & mode
388- }
389-
390392 var t criurpc.CriuReqType
391393 if criuOpts .PreDump {
392394 feat := criurpc.CriuFeatures {
@@ -634,6 +636,12 @@ func (c *Container) Restore(process *Process, criuOpts *CriuOpts) error {
634636 if criuOpts .ImagesDirectory == "" {
635637 return errors .New ("invalid directory to restore checkpoint" )
636638 }
639+
640+ cgMode , err := criuCgMode (criuOpts .ManageCgroupsMode )
641+ if err != nil {
642+ return err
643+ }
644+
637645 logDir := criuOpts .ImagesDirectory
638646 imageDir , err := os .Open (criuOpts .ImagesDirectory )
639647 if err != nil {
@@ -663,22 +671,23 @@ func (c *Container) Restore(process *Process, criuOpts *CriuOpts) error {
663671 req := & criurpc.CriuReq {
664672 Type : & t ,
665673 Opts : & criurpc.CriuOpts {
666- ImagesDirFd : proto .Int32 (int32 (imageDir .Fd ())),
667- EvasiveDevices : proto .Bool (true ),
668- LogLevel : proto .Int32 (4 ),
669- LogFile : proto .String (logFile ),
670- RstSibling : proto .Bool (true ),
671- Root : proto .String (root ),
672- ManageCgroups : proto .Bool (true ),
673- NotifyScripts : proto .Bool (true ),
674- ShellJob : proto .Bool (criuOpts .ShellJob ),
675- ExtUnixSk : proto .Bool (criuOpts .ExternalUnixConnections ),
676- TcpEstablished : proto .Bool (criuOpts .TcpEstablished ),
677- FileLocks : proto .Bool (criuOpts .FileLocks ),
678- EmptyNs : proto .Uint32 (criuOpts .EmptyNs ),
679- OrphanPtsMaster : proto .Bool (true ),
680- AutoDedup : proto .Bool (criuOpts .AutoDedup ),
681- LazyPages : proto .Bool (criuOpts .LazyPages ),
674+ ImagesDirFd : proto .Int32 (int32 (imageDir .Fd ())),
675+ EvasiveDevices : proto .Bool (true ),
676+ LogLevel : proto .Int32 (4 ),
677+ LogFile : proto .String (logFile ),
678+ RstSibling : proto .Bool (true ),
679+ Root : proto .String (root ),
680+ ManageCgroups : proto .Bool (true ), // Obsoleted by ManageCgroupsMode.
681+ ManageCgroupsMode : & cgMode ,
682+ NotifyScripts : proto .Bool (true ),
683+ ShellJob : proto .Bool (criuOpts .ShellJob ),
684+ ExtUnixSk : proto .Bool (criuOpts .ExternalUnixConnections ),
685+ TcpEstablished : proto .Bool (criuOpts .TcpEstablished ),
686+ FileLocks : proto .Bool (criuOpts .FileLocks ),
687+ EmptyNs : proto .Uint32 (criuOpts .EmptyNs ),
688+ OrphanPtsMaster : proto .Bool (true ),
689+ AutoDedup : proto .Bool (criuOpts .AutoDedup ),
690+ LazyPages : proto .Bool (criuOpts .LazyPages ),
682691 },
683692 }
684693
@@ -757,12 +766,6 @@ func (c *Container) Restore(process *Process, criuOpts *CriuOpts) error {
757766 c .restoreNetwork (req , criuOpts )
758767 }
759768
760- // append optional manage cgroups mode
761- if criuOpts .ManageCgroupsMode != 0 {
762- mode := criuOpts .ManageCgroupsMode
763- req .Opts .ManageCgroupsMode = & mode
764- }
765-
766769 var (
767770 fds []string
768771 fdJSON []byte
@@ -1184,3 +1187,20 @@ func (c *Container) criuNotifications(resp *criurpc.CriuResp, process *Process,
11841187 }
11851188 return nil
11861189}
1190+
1191+ func criuCgMode (mode string ) (criurpc.CriuCgMode , error ) {
1192+ switch mode {
1193+ case "" :
1194+ return criurpc .CriuCgMode_DEFAULT , nil
1195+ case "soft" :
1196+ return criurpc .CriuCgMode_SOFT , nil
1197+ case "full" :
1198+ return criurpc .CriuCgMode_FULL , nil
1199+ case "strict" :
1200+ return criurpc .CriuCgMode_STRICT , nil
1201+ case "ignore" :
1202+ return criurpc .CriuCgMode_IGNORE , nil
1203+ default :
1204+ return 0 , errors .New ("invalid manage-cgroups-mode value" )
1205+ }
1206+ }
0 commit comments