Skip to content

Commit dd81920

Browse files
committed
add ParseCgroupFileUnified to get the unified path
Signed-off-by: Akihiro Suda <akihiro.suda.cz@hco.ntt.co.jp>
1 parent dae6735 commit dd81920

File tree

2 files changed

+28
-9
lines changed

2 files changed

+28
-9
lines changed

paths_test.go

+10-2
Original file line numberDiff line numberDiff line change
@@ -102,7 +102,7 @@ func TestEmptySubsystem(t *testing.T) {
102102
1:name=systemd:/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service
103103
0::/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service`
104104
r := strings.NewReader(data)
105-
paths, err := parseCgroupFromReader(r)
105+
paths, unified, err := parseCgroupFromReaderUnified(r)
106106
if err != nil {
107107
t.Fatal(err)
108108
}
@@ -111,6 +111,10 @@ func TestEmptySubsystem(t *testing.T) {
111111
t.Fatalf("empty subsystem for %q", path)
112112
}
113113
}
114+
unifiedExpected := "/user.slice/user-1000.slice/user@1000.service/gnome-terminal-server.service"
115+
if unified != unifiedExpected {
116+
t.Fatalf("expected %q, got %q", unifiedExpected, unified)
117+
}
114118
}
115119

116120
func TestSystemd240(t *testing.T) {
@@ -127,7 +131,7 @@ func TestSystemd240(t *testing.T) {
127131
1:name=systemd:/system.slice/docker.service
128132
0::/system.slice/docker.service`
129133
r := strings.NewReader(data)
130-
paths, err := parseCgroupFromReader(r)
134+
paths, unified, err := parseCgroupFromReaderUnified(r)
131135
if err != nil {
132136
t.Fatal(err)
133137
}
@@ -140,4 +144,8 @@ func TestSystemd240(t *testing.T) {
140144
if err != ErrControllerNotActive {
141145
t.Fatalf("expected error %q but received %q", ErrControllerNotActive, err)
142146
}
147+
unifiedExpected := "/system.slice/docker.service"
148+
if unified != unifiedExpected {
149+
t.Fatalf("expected %q, got %q", unifiedExpected, unified)
150+
}
143151
}

utils.go

+18-7
Original file line numberDiff line numberDiff line change
@@ -262,18 +262,27 @@ func parseKV(raw string) (string, uint64, error) {
262262
// etc.
263263
//
264264
// The resulting map does not have an element for cgroup v2 unified hierarchy.
265+
// Use ParseCgroupFileUnified to get the unified path.
265266
func ParseCgroupFile(path string) (map[string]string, error) {
267+
x, _, err := ParseCgroupFileUnified(path)
268+
return x, err
269+
}
270+
271+
// ParseCgroupFileUnified returns legacy subsystem paths as the first value,
272+
// and returns the unified path as the second value.
273+
func ParseCgroupFileUnified(path string) (map[string]string, string, error) {
266274
f, err := os.Open(path)
267275
if err != nil {
268-
return nil, err
276+
return nil, "", err
269277
}
270278
defer f.Close()
271-
return parseCgroupFromReader(f)
279+
return parseCgroupFromReaderUnified(f)
272280
}
273281

274-
func parseCgroupFromReader(r io.Reader) (map[string]string, error) {
282+
func parseCgroupFromReaderUnified(r io.Reader) (map[string]string, string, error) {
275283
var (
276284
cgroups = make(map[string]string)
285+
unified = ""
277286
s = bufio.NewScanner(r)
278287
)
279288
for s.Scan() {
@@ -282,18 +291,20 @@ func parseCgroupFromReader(r io.Reader) (map[string]string, error) {
282291
parts = strings.SplitN(text, ":", 3)
283292
)
284293
if len(parts) < 3 {
285-
return nil, fmt.Errorf("invalid cgroup entry: %q", text)
294+
return nil, unified, fmt.Errorf("invalid cgroup entry: %q", text)
286295
}
287296
for _, subs := range strings.Split(parts[1], ",") {
288-
if subs != "" {
297+
if subs == "" {
298+
unified = parts[2]
299+
} else {
289300
cgroups[subs] = parts[2]
290301
}
291302
}
292303
}
293304
if err := s.Err(); err != nil {
294-
return nil, err
305+
return nil, unified, err
295306
}
296-
return cgroups, nil
307+
return cgroups, unified, nil
297308
}
298309

299310
func getCgroupDestination(subsystem string) (string, error) {

0 commit comments

Comments
 (0)