Skip to content

Commit

Permalink
libct/cgroup/utils: fix GetCgroupMounts(all=true)
Browse files Browse the repository at this point in the history
The `all` argument was introduced by commit f557996 specifically
for use by cAdvisor (see [1]), but there were no test cases added,
so it was later broken by 5ee0648 which started incrementing
numFound unconditionally.

Fix this (by not checking numFound in case all is true), and add a
simple test case to avoid future regressions.

[1] google/cadvisor#1476

Signed-off-by: Kir Kolyshkin <[email protected]>
  • Loading branch information
kolyshkin committed Nov 24, 2020
1 parent d15ffff commit 3b74547
Show file tree
Hide file tree
Showing 2 changed files with 30 additions and 3 deletions.
31 changes: 29 additions & 2 deletions libcontainer/cgroups/utils_test.go
Original file line number Diff line number Diff line change
Expand Up @@ -181,8 +181,11 @@ const cgroup2Mountinfo = `18 64 0:18 / /sys rw,nosuid,nodev,noexec,relatime shar

func TestGetCgroupMounts(t *testing.T) {
type testData struct {
mountInfo string
root string
mountInfo string
root string
// all is the total number of records expected with all=true,
// or 0 for no extra records expected (most cases).
all int
subsystems map[string]bool
}
testTable := []testData{
Expand Down Expand Up @@ -223,6 +226,7 @@ func TestGetCgroupMounts(t *testing.T) {
{
mountInfo: bedrockMountinfo,
root: "/",
all: 50,
subsystems: map[string]bool{
"name=systemd": false,
"cpuset": false,
Expand Down Expand Up @@ -274,6 +278,29 @@ func TestGetCgroupMounts(t *testing.T) {
t.Fatalf("subsystem %s not found in Subsystems field %v", ss, m.Subsystems)
}
}
// Test the all=true case.

// Reset the test input.
mi = bytes.NewBufferString(td.mountInfo)
for k := range td.subsystems {
td.subsystems[k] = false
}
cgMountsAll, err := getCgroupMountsHelper(td.subsystems, mi, true)
if err != nil {
t.Fatal(err)
}
if td.all == 0 {
// Results with and without "all" should be the same.
if len(cgMounts) != len(cgMountsAll) || !reflect.DeepEqual(cgMounts, cgMountsAll) {
t.Errorf("expected same results, got (all=false) %v, (all=true) %v", cgMounts, cgMountsAll)
}
} else {
// Make sure we got all records.
if len(cgMountsAll) != td.all {
t.Errorf("expected %d records, got %d (%+v)", td.all, len(cgMountsAll), cgMountsAll)
}
}

}
}

Expand Down
2 changes: 1 addition & 1 deletion libcontainer/cgroups/v1_utils.go
Original file line number Diff line number Diff line change
Expand Up @@ -173,7 +173,7 @@ func getCgroupMountsHelper(ss map[string]bool, mi io.Reader, all bool) ([]Mount,
res := make([]Mount, 0, len(ss))
scanner := bufio.NewScanner(mi)
numFound := 0
for scanner.Scan() && numFound < len(ss) {
for scanner.Scan() && (all || numFound < len(ss)) {
txt := scanner.Text()
sepIdx := strings.Index(txt, " - ")
if sepIdx == -1 {
Expand Down

0 comments on commit 3b74547

Please sign in to comment.