@@ -30,24 +30,49 @@ import (
30
30
)
31
31
32
32
// New returns a new control via the cgroup cgroups interface
33
- func New (hierarchy Hierarchy , path Path , resources * specs.LinuxResources ) (Cgroup , error ) {
33
+ func New (hierarchy Hierarchy , path Path , resources * specs.LinuxResources , opts ... InitOpts ) (Cgroup , error ) {
34
+ config := newInitConfig ()
35
+ for _ , o := range opts {
36
+ if err := o (config ); err != nil {
37
+ return nil , err
38
+ }
39
+ }
34
40
subsystems , err := hierarchy ()
35
41
if err != nil {
36
42
return nil , err
37
43
}
44
+ var active []Subsystem
38
45
for _ , s := range subsystems {
46
+ // check if subsystem exists
39
47
if err := initializeSubsystem (s , path , resources ); err != nil {
48
+ if err == ErrControllerNotActive {
49
+ if config .InitCheck != nil {
50
+ if skerr := config .InitCheck (s , path , err ); skerr != nil {
51
+ if skerr != ErrIgnoreSubsystem {
52
+ return nil , skerr
53
+ }
54
+ }
55
+ }
56
+ continue
57
+ }
40
58
return nil , err
41
59
}
60
+ active = append (active , s )
42
61
}
43
62
return & cgroup {
44
63
path : path ,
45
- subsystems : subsystems ,
64
+ subsystems : active ,
46
65
}, nil
47
66
}
48
67
49
68
// Load will load an existing cgroup and allow it to be controlled
50
- func Load (hierarchy Hierarchy , path Path ) (Cgroup , error ) {
69
+ func Load (hierarchy Hierarchy , path Path , opts ... InitOpts ) (Cgroup , error ) {
70
+ config := newInitConfig ()
71
+ for _ , o := range opts {
72
+ if err := o (config ); err != nil {
73
+ return nil , err
74
+ }
75
+ }
51
76
var activeSubsystems []Subsystem
52
77
subsystems , err := hierarchy ()
53
78
if err != nil {
@@ -60,6 +85,16 @@ func Load(hierarchy Hierarchy, path Path) (Cgroup, error) {
60
85
if os .IsNotExist (errors .Cause (err )) {
61
86
return nil , ErrCgroupDeleted
62
87
}
88
+ if err == ErrControllerNotActive {
89
+ if config .InitCheck != nil {
90
+ if skerr := config .InitCheck (s , path , err ); skerr != nil {
91
+ if skerr != ErrIgnoreSubsystem {
92
+ return nil , skerr
93
+ }
94
+ }
95
+ }
96
+ continue
97
+ }
63
98
return nil , err
64
99
}
65
100
if _ , err := os .Lstat (s .Path (p )); err != nil {
0 commit comments