Skip to content

Commit 82cb49f

Browse files
authored
Merge pull request #63 from ChrsMark/lenient-subsystems-checking
Makes Load function more lenient on subsystems' checking
2 parents 965bb1d + 7d825b2 commit 82cb49f

File tree

2 files changed

+49
-3
lines changed

2 files changed

+49
-3
lines changed

cgroup.go

Lines changed: 5 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -48,11 +48,12 @@ func New(hierarchy Hierarchy, path Path, resources *specs.LinuxResources) (Cgrou
4848

4949
// Load will load an existing cgroup and allow it to be controlled
5050
func Load(hierarchy Hierarchy, path Path) (Cgroup, error) {
51+
var activeSubsystems []Subsystem
5152
subsystems, err := hierarchy()
5253
if err != nil {
5354
return nil, err
5455
}
55-
// check the the subsystems still exist
56+
// check that the subsystems still exist, and keep only those that actually exist
5657
for _, s := range pathers(subsystems) {
5758
p, err := path(s.Name())
5859
if err != nil {
@@ -63,14 +64,15 @@ func Load(hierarchy Hierarchy, path Path) (Cgroup, error) {
6364
}
6465
if _, err := os.Lstat(s.Path(p)); err != nil {
6566
if os.IsNotExist(err) {
66-
return nil, ErrCgroupDeleted
67+
continue
6768
}
6869
return nil, err
6970
}
71+
activeSubsystems = append(activeSubsystems, s)
7072
}
7173
return &cgroup{
7274
path: path,
73-
subsystems: subsystems,
75+
subsystems: activeSubsystems,
7476
}, nil
7577
}
7678

cgroup_test.go

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -197,6 +197,20 @@ func checkTaskid(mock *mockCgroup, path string, expected int) error {
197197
return nil
198198
}
199199

200+
func mockNewNotInRdma(subsystems []Subsystem, path Path, resources *specs.LinuxResources) (Cgroup, error) {
201+
for _, s := range subsystems {
202+
if s.Name() != Rdma {
203+
if err := initializeSubsystem(s, path, resources); err != nil {
204+
return nil, err
205+
}
206+
}
207+
}
208+
return &cgroup{
209+
path: path,
210+
subsystems: subsystems,
211+
}, nil
212+
}
213+
200214
func TestLoad(t *testing.T) {
201215
mock, err := newMock()
202216
if err != nil {
@@ -218,6 +232,36 @@ func TestLoad(t *testing.T) {
218232
}
219233
}
220234

235+
func TestLoadWithMissingSubsystems(t *testing.T) {
236+
mock, err := newMock()
237+
if err != nil {
238+
t.Fatal(err)
239+
}
240+
defer mock.delete()
241+
subsystems, err := mock.hierarchy()
242+
if err != nil {
243+
t.Error(err)
244+
return
245+
}
246+
control, err := mockNewNotInRdma(subsystems, StaticPath("test"), &specs.LinuxResources{})
247+
if err != nil {
248+
t.Error(err)
249+
return
250+
}
251+
if control, err = Load(mock.hierarchy, StaticPath("test")); err != nil {
252+
t.Error(err)
253+
return
254+
}
255+
if control == nil {
256+
t.Error("control is nil")
257+
return
258+
}
259+
if len(control.Subsystems()) != len(subsystems) - 1 {
260+
t.Error("wrong number of active subsystems")
261+
return
262+
}
263+
}
264+
221265
func TestDelete(t *testing.T) {
222266
mock, err := newMock()
223267
if err != nil {

0 commit comments

Comments
 (0)