@@ -295,6 +295,11 @@ func (c *Container) Checkpoint(criuOpts *CriuOpts) error {
295295 return errors .New ("invalid directory to save checkpoint" )
296296 }
297297
298+ cgMode , err := criuCgMode (criuOpts .ManageCgroupsMode )
299+ if err != nil {
300+ return err
301+ }
302+
298303 // Since a container can be C/R'ed multiple times,
299304 // the checkpoint directory may already exist.
300305 if err := os .Mkdir (criuOpts .ImagesDirectory , 0o700 ); err != nil && ! os .IsExist (err ) {
@@ -309,22 +314,23 @@ func (c *Container) Checkpoint(criuOpts *CriuOpts) error {
309314 defer imageDir .Close ()
310315
311316 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 ),
317+ ImagesDirFd : proto .Int32 (int32 (imageDir .Fd ())),
318+ LogLevel : proto .Int32 (4 ),
319+ LogFile : proto .String (logFile ),
320+ Root : proto .String (c .config .Rootfs ),
321+ ManageCgroups : proto .Bool (true ), // Obsoleted by ManageCgroupsMode.
322+ ManageCgroupsMode : & cgMode ,
323+ NotifyScripts : proto .Bool (true ),
324+ Pid : proto .Int32 (int32 (c .initProcess .pid ())),
325+ ShellJob : proto .Bool (criuOpts .ShellJob ),
326+ LeaveRunning : proto .Bool (criuOpts .LeaveRunning ),
327+ TcpEstablished : proto .Bool (criuOpts .TcpEstablished ),
328+ ExtUnixSk : proto .Bool (criuOpts .ExternalUnixConnections ),
329+ FileLocks : proto .Bool (criuOpts .FileLocks ),
330+ EmptyNs : proto .Uint32 (criuOpts .EmptyNs ),
331+ OrphanPtsMaster : proto .Bool (true ),
332+ AutoDedup : proto .Bool (criuOpts .AutoDedup ),
333+ LazyPages : proto .Bool (criuOpts .LazyPages ),
328334 }
329335
330336 // if criuOpts.WorkDirectory is not set, criu default is used.
@@ -381,12 +387,6 @@ func (c *Container) Checkpoint(criuOpts *CriuOpts) error {
381387 rpcOpts .TrackMem = proto .Bool (true )
382388 }
383389
384- // append optional manage cgroups mode
385- if criuOpts .ManageCgroupsMode != 0 {
386- mode := criuOpts .ManageCgroupsMode
387- rpcOpts .ManageCgroupsMode = & mode
388- }
389-
390390 var t criurpc.CriuReqType
391391 if criuOpts .PreDump {
392392 feat := criurpc.CriuFeatures {
@@ -634,6 +634,12 @@ func (c *Container) Restore(process *Process, criuOpts *CriuOpts) error {
634634 if criuOpts .ImagesDirectory == "" {
635635 return errors .New ("invalid directory to restore checkpoint" )
636636 }
637+
638+ cgMode , err := criuCgMode (criuOpts .ManageCgroupsMode )
639+ if err != nil {
640+ return err
641+ }
642+
637643 logDir := criuOpts .ImagesDirectory
638644 imageDir , err := os .Open (criuOpts .ImagesDirectory )
639645 if err != nil {
@@ -663,22 +669,23 @@ func (c *Container) Restore(process *Process, criuOpts *CriuOpts) error {
663669 req := & criurpc.CriuReq {
664670 Type : & t ,
665671 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 ),
672+ ImagesDirFd : proto .Int32 (int32 (imageDir .Fd ())),
673+ EvasiveDevices : proto .Bool (true ),
674+ LogLevel : proto .Int32 (4 ),
675+ LogFile : proto .String (logFile ),
676+ RstSibling : proto .Bool (true ),
677+ Root : proto .String (root ),
678+ ManageCgroups : proto .Bool (true ), // Obsoleted by ManageCgroupsMode.
679+ ManageCgroupsMode : & cgMode ,
680+ NotifyScripts : proto .Bool (true ),
681+ ShellJob : proto .Bool (criuOpts .ShellJob ),
682+ ExtUnixSk : proto .Bool (criuOpts .ExternalUnixConnections ),
683+ TcpEstablished : proto .Bool (criuOpts .TcpEstablished ),
684+ FileLocks : proto .Bool (criuOpts .FileLocks ),
685+ EmptyNs : proto .Uint32 (criuOpts .EmptyNs ),
686+ OrphanPtsMaster : proto .Bool (true ),
687+ AutoDedup : proto .Bool (criuOpts .AutoDedup ),
688+ LazyPages : proto .Bool (criuOpts .LazyPages ),
682689 },
683690 }
684691
@@ -757,12 +764,6 @@ func (c *Container) Restore(process *Process, criuOpts *CriuOpts) error {
757764 c .restoreNetwork (req , criuOpts )
758765 }
759766
760- // append optional manage cgroups mode
761- if criuOpts .ManageCgroupsMode != 0 {
762- mode := criuOpts .ManageCgroupsMode
763- req .Opts .ManageCgroupsMode = & mode
764- }
765-
766767 var (
767768 fds []string
768769 fdJSON []byte
@@ -1184,3 +1185,20 @@ func (c *Container) criuNotifications(resp *criurpc.CriuResp, process *Process,
11841185 }
11851186 return nil
11861187}
1188+
1189+ func criuCgMode (mode string ) (criurpc.CriuCgMode , error ) {
1190+ switch mode {
1191+ case "" :
1192+ return criurpc .CriuCgMode_DEFAULT , nil
1193+ case "soft" :
1194+ return criurpc .CriuCgMode_SOFT , nil
1195+ case "full" :
1196+ return criurpc .CriuCgMode_FULL , nil
1197+ case "strict" :
1198+ return criurpc .CriuCgMode_STRICT , nil
1199+ case "ignore" :
1200+ return criurpc .CriuCgMode_IGNORE , nil
1201+ default :
1202+ return 0 , errors .New ("invalid manage-cgroups-mode value" )
1203+ }
1204+ }
0 commit comments