Skip to content

Commit 8f686ce

Browse files
committed
libcontainer, cgroupv2: adapt to new API
adapt the handlers to use the new libcontainer API for cgroup v2. Signed-off-by: Giuseppe Scrivano <[email protected]>
1 parent 16ebc4c commit 8f686ce

File tree

8 files changed

+67
-50
lines changed

8 files changed

+67
-50
lines changed

cmd/internal/container/mesos/handler.go

Lines changed: 3 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -23,9 +23,6 @@ import (
2323
containerlibcontainer "github.com/google/cadvisor/container/libcontainer"
2424
"github.com/google/cadvisor/fs"
2525
info "github.com/google/cadvisor/info/v1"
26-
27-
cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
28-
libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
2926
)
3027

3128
type mesosContainerHandler struct {
@@ -65,11 +62,9 @@ func newMesosContainerHandler(
6562
cgroupPaths := common.MakeCgroupPaths(cgroupSubsystems.MountPoints, name)
6663

6764
// Generate the equivalent cgroup manager for this container.
68-
cgroupManager := &cgroupfs.Manager{
69-
Cgroups: &libcontainerconfigs.Cgroup{
70-
Name: name,
71-
},
72-
Paths: cgroupPaths,
65+
cgroupManager, err := containerlibcontainer.NewCgroupManager(name, cgroupPaths)
66+
if err != nil {
67+
return nil, err
7368
}
7469

7570
rootFs := "/"

container/containerd/handler.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -22,8 +22,6 @@ import (
2222
"time"
2323

2424
"github.com/containerd/containerd/errdefs"
25-
cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
26-
libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
2725
"golang.org/x/net/context"
2826

2927
"github.com/google/cadvisor/container"
@@ -69,11 +67,9 @@ func newContainerdContainerHandler(
6967
cgroupPaths := common.MakeCgroupPaths(cgroupSubsystems.MountPoints, name)
7068

7169
// Generate the equivalent cgroup manager for this container.
72-
cgroupManager := &cgroupfs.Manager{
73-
Cgroups: &libcontainerconfigs.Cgroup{
74-
Name: name,
75-
},
76-
Paths: cgroupPaths,
70+
cgroupManager, err := containerlibcontainer.NewCgroupManager(name, cgroupPaths)
71+
if err != nil {
72+
return nil, err
7773
}
7874

7975
id := ContainerNameToContainerdID(name)

container/crio/handler.go

Lines changed: 5 additions & 9 deletions
Original file line numberDiff line numberDiff line change
@@ -27,9 +27,7 @@ import (
2727
containerlibcontainer "github.com/google/cadvisor/container/libcontainer"
2828
"github.com/google/cadvisor/fs"
2929
info "github.com/google/cadvisor/info/v1"
30-
31-
cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
32-
libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
30+
"github.com/opencontainers/runc/libcontainer/cgroups"
3331
)
3432

3533
type crioContainerHandler struct {
@@ -71,7 +69,7 @@ type crioContainerHandler struct {
7169
reference info.ContainerReference
7270

7371
libcontainerHandler *containerlibcontainer.Handler
74-
cgroupManager *cgroupfs.Manager
72+
cgroupManager cgroups.Manager
7573
rootFs string
7674
pidKnown bool
7775
}
@@ -95,11 +93,9 @@ func newCrioContainerHandler(
9593
cgroupPaths := common.MakeCgroupPaths(cgroupSubsystems.MountPoints, name)
9694

9795
// Generate the equivalent cgroup manager for this container.
98-
cgroupManager := &cgroupfs.Manager{
99-
Cgroups: &libcontainerconfigs.Cgroup{
100-
Name: name,
101-
},
102-
Paths: cgroupPaths,
96+
cgroupManager, err := containerlibcontainer.NewCgroupManager(name, cgroupPaths)
97+
if err != nil {
98+
return nil, err
10399
}
104100

105101
rootFs := "/"

container/docker/handler.go

Lines changed: 3 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -34,8 +34,6 @@ import (
3434

3535
dockercontainer "github.com/docker/docker/api/types/container"
3636
docker "github.com/docker/docker/client"
37-
cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
38-
libcontainerconfigs "github.com/opencontainers/runc/libcontainer/configs"
3937
"golang.org/x/net/context"
4038
"k8s.io/klog"
4139
)
@@ -136,11 +134,9 @@ func newDockerContainerHandler(
136134
cgroupPaths := common.MakeCgroupPaths(cgroupSubsystems.MountPoints, name)
137135

138136
// Generate the equivalent cgroup manager for this container.
139-
cgroupManager := &cgroupfs.Manager{
140-
Cgroups: &libcontainerconfigs.Cgroup{
141-
Name: name,
142-
},
143-
Paths: cgroupPaths,
137+
cgroupManager, err := containerlibcontainer.NewCgroupManager(name, cgroupPaths)
138+
if err != nil {
139+
return nil, err
144140
}
145141

146142
rootFs := "/"

container/libcontainer/handler.go

Lines changed: 19 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -16,6 +16,7 @@ package libcontainer
1616

1717
import (
1818
"bufio"
19+
"bytes"
1920
"encoding/json"
2021
"fmt"
2122
"io"
@@ -31,10 +32,9 @@ import (
3132
info "github.com/google/cadvisor/info/v1"
3233
"golang.org/x/sys/unix"
3334

34-
"bytes"
35-
3635
"github.com/opencontainers/runc/libcontainer"
3736
"github.com/opencontainers/runc/libcontainer/cgroups"
37+
fs2 "github.com/opencontainers/runc/libcontainer/cgroups/fs2"
3838
"k8s.io/klog"
3939
)
4040

@@ -60,9 +60,23 @@ func NewHandler(cgroupManager cgroups.Manager, rootFs string, pid int, includedM
6060

6161
// Get cgroup and networking stats of the specified container
6262
func (h *Handler) GetStats() (*info.ContainerStats, error) {
63-
cgroupStats, err := h.cgroupManager.GetStats()
64-
if err != nil {
65-
return nil, err
63+
var cgroupStats *cgroups.Stats
64+
readCgroupStats := true
65+
if cgroups.IsCgroup2UnifiedMode() {
66+
p, err := h.cgroupManager.GetUnifiedPath()
67+
if err != nil {
68+
return nil, err
69+
}
70+
if p == fs2.UnifiedMountpoint {
71+
readCgroupStats = false
72+
}
73+
}
74+
var err error
75+
if readCgroupStats {
76+
cgroupStats, err = h.cgroupManager.GetStats()
77+
if err != nil {
78+
return nil, err
79+
}
6680
}
6781
libcontainerStats := &libcontainer.Stats{
6882
CgroupStats: cgroupStats,

container/libcontainer/helpers.go

Lines changed: 18 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -21,6 +21,9 @@ import (
2121

2222
"github.com/google/cadvisor/container"
2323
"github.com/opencontainers/runc/libcontainer/cgroups"
24+
cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
25+
cgroupfs2 "github.com/opencontainers/runc/libcontainer/cgroups/fs2"
26+
configs "github.com/opencontainers/runc/libcontainer/configs"
2427
"k8s.io/klog"
2528
)
2629

@@ -164,3 +167,18 @@ func DiskStatsCopy(blkio_stats []cgroups.BlkioStatEntry) (stat []info.PerDiskSta
164167
}
165168
return DiskStatsCopy1(disk_stat)
166169
}
170+
171+
func NewCgroupManager(name string, paths map[string]string) (cgroups.Manager, error) {
172+
if cgroups.IsCgroup2UnifiedMode() {
173+
path := paths["cpu"]
174+
return cgroupfs2.NewManager(nil, path, false)
175+
}
176+
177+
return &cgroupfs.Manager{
178+
Cgroups: &configs.Cgroup{
179+
Name: name,
180+
},
181+
Paths: paths,
182+
}, nil
183+
184+
}

container/raw/handler.go

Lines changed: 8 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -25,8 +25,7 @@ import (
2525
info "github.com/google/cadvisor/info/v1"
2626
"github.com/google/cadvisor/machine"
2727

28-
cgroupfs "github.com/opencontainers/runc/libcontainer/cgroups/fs"
29-
"github.com/opencontainers/runc/libcontainer/configs"
28+
//"github.com/opencontainers/runc/libcontainer/cgroups"
3029
"k8s.io/klog"
3130
)
3231

@@ -51,19 +50,16 @@ func isRootCgroup(name string) bool {
5150
}
5251

5352
func newRawContainerHandler(name string, cgroupSubsystems *libcontainer.CgroupSubsystems, machineInfoFactory info.MachineInfoFactory, fsInfo fs.FsInfo, watcher *common.InotifyWatcher, rootFs string, includedMetrics container.MetricSet) (container.ContainerHandler, error) {
54-
cgroupPaths := common.MakeCgroupPaths(cgroupSubsystems.MountPoints, name)
55-
5653
cHints, err := common.GetContainerHintsFromFile(*common.ArgContainerHints)
5754
if err != nil {
5855
return nil, err
5956
}
6057

61-
// Generate the equivalent cgroup manager for this container.
62-
cgroupManager := &cgroupfs.Manager{
63-
Cgroups: &configs.Cgroup{
64-
Name: name,
65-
},
66-
Paths: cgroupPaths,
58+
cgroupPaths := common.MakeCgroupPaths(cgroupSubsystems.MountPoints, name)
59+
60+
cgroupManager, err := libcontainer.NewCgroupManager(name, cgroupPaths)
61+
if err != nil {
62+
return nil, err
6763
}
6864

6965
var externalMounts []common.Mount
@@ -227,9 +223,11 @@ func (self *rawContainerHandler) getFsStats(stats *info.ContainerStats) error {
227223
}
228224

229225
func (self *rawContainerHandler) GetStats() (*info.ContainerStats, error) {
226+
//skipRootStats := cgroups.IsCgroup2UnifiedMode() || *disableRootCgroupStats
230227
if *disableRootCgroupStats && isRootCgroup(self.name) {
231228
return nil, nil
232229
}
230+
233231
stats, err := self.libcontainerHandler.GetStats()
234232
if err != nil {
235233
return stats, err

manager/manager.go

Lines changed: 8 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -141,11 +141,15 @@ func New(memoryCache *memory.InMemoryCache, sysfs sysfs.SysFs, maxHousekeepingIn
141141
}
142142

143143
// Detect the container we are running on.
144-
selfContainer, err := cgroups.GetOwnCgroupPath("cpu")
145-
if err != nil {
146-
return nil, err
144+
selfContainer := "/"
145+
var err error
146+
if !cgroups.IsCgroup2UnifiedMode() {
147+
selfContainer, err := cgroups.GetOwnCgroupPath("cpu")
148+
if err != nil {
149+
return nil, err
150+
}
151+
klog.V(2).Infof("cAdvisor running in container: %q", selfContainer)
147152
}
148-
klog.V(2).Infof("cAdvisor running in container: %q", selfContainer)
149153

150154
context := fs.Context{}
151155

0 commit comments

Comments
 (0)