Skip to content

Commit 85c2a1c

Browse files
committed
Merge pull request #1213 from timstclair/raw
Read docker container spec from cgroupfs, rather than libcontainer spec
2 parents a8edca0 + dc6415a commit 85c2a1c

File tree

6 files changed

+64
-634
lines changed

6 files changed

+64
-634
lines changed

container/common/helpers.go

Lines changed: 19 additions & 55 deletions
Original file line numberDiff line numberDiff line change
@@ -25,7 +25,6 @@ import (
2525

2626
info "github.com/google/cadvisor/info/v1"
2727
"github.com/google/cadvisor/utils"
28-
"github.com/google/cadvisor/utils/machine"
2928

3029
"github.com/golang/glog"
3130
)
@@ -45,26 +44,10 @@ func DebugInfo(watches map[string][]string) map[string][]string {
4544
return out
4645
}
4746

48-
type AbstractContainerHandler interface {
49-
GetCgroupPaths() map[string]string
50-
GetMachineInfoFactory() info.MachineInfoFactory
51-
GetName() string
52-
GetRootNetworkDevices() ([]info.NetInfo, error)
53-
GetExternalMounts() []Mount
54-
HasNetwork() bool
55-
HasFilesystem() bool
56-
}
57-
58-
func GetSpec(handler AbstractContainerHandler) (info.ContainerSpec, error) {
59-
cgroupPaths := handler.GetCgroupPaths()
60-
machineInfoFactory := handler.GetMachineInfoFactory()
61-
name := handler.GetName()
62-
externalMounts := handler.GetExternalMounts()
63-
47+
func GetSpec(cgroupPaths map[string]string, machineInfoFactory info.MachineInfoFactory, hasNetwork, hasFilesystem bool) (info.ContainerSpec, error) {
6448
var spec info.ContainerSpec
6549

66-
// The raw driver assumes unified hierarchy containers.
67-
50+
// Assume unified hierarchy containers.
6851
// Get the lowest creation time from all hierarchies as the container creation time.
6952
now := time.Now()
7053
lowestTime := now
@@ -120,51 +103,22 @@ func GetSpec(handler AbstractContainerHandler) (info.ContainerSpec, error) {
120103
}
121104

122105
// Memory
123-
if name == "/" {
124-
// Get memory and swap limits of the running machine
125-
memLimit, err := machine.GetMachineMemoryCapacity()
126-
if err != nil {
127-
glog.Warningf("failed to obtain memory limit for machine container")
128-
spec.HasMemory = false
129-
} else {
130-
spec.Memory.Limit = uint64(memLimit)
131-
// Spec is marked to have memory only if the memory limit is set
106+
memoryRoot, ok := cgroupPaths["memory"]
107+
if ok {
108+
if utils.FileExists(memoryRoot) {
132109
spec.HasMemory = true
133-
}
134-
135-
swapLimit, err := machine.GetMachineSwapCapacity()
136-
if err != nil {
137-
glog.Warningf("failed to obtain swap limit for machine container")
138-
} else {
139-
spec.Memory.SwapLimit = uint64(swapLimit)
140-
}
141-
} else {
142-
memoryRoot, ok := cgroupPaths["memory"]
143-
if ok {
144-
if utils.FileExists(memoryRoot) {
145-
spec.HasMemory = true
146-
spec.Memory.Limit = readUInt64(memoryRoot, "memory.limit_in_bytes")
147-
spec.Memory.SwapLimit = readUInt64(memoryRoot, "memory.memsw.limit_in_bytes")
148-
}
110+
spec.Memory.Limit = readUInt64(memoryRoot, "memory.limit_in_bytes")
111+
spec.Memory.SwapLimit = readUInt64(memoryRoot, "memory.memsw.limit_in_bytes")
149112
}
150113
}
151114

152-
spec.HasFilesystem = name == "/" || externalMounts != nil || handler.HasFilesystem()
153-
154-
spec.HasNetwork = handler.HasNetwork()
115+
spec.HasNetwork = hasNetwork
116+
spec.HasFilesystem = hasFilesystem
155117

156118
if blkioRoot, ok := cgroupPaths["blkio"]; ok && utils.FileExists(blkioRoot) {
157119
spec.HasDiskIo = true
158120
}
159121

160-
// Check physical network devices for root container.
161-
nd, err := handler.GetRootNetworkDevices()
162-
if err != nil {
163-
return spec, err
164-
}
165-
166-
spec.HasNetwork = spec.HasNetwork || len(nd) != 0
167-
168122
return spec, nil
169123
}
170124

@@ -237,3 +191,13 @@ func MakeCgroupPaths(mountPoints map[string]string, name string) map[string]stri
237191

238192
return cgroupPaths
239193
}
194+
195+
func CgroupExists(cgroupPaths map[string]string) bool {
196+
// If any cgroup exists, the container is still alive.
197+
for _, cgroupPath := range cgroupPaths {
198+
if utils.FileExists(cgroupPath) {
199+
return true
200+
}
201+
}
202+
return false
203+
}

container/docker/handler.go

Lines changed: 3 additions & 69 deletions
Original file line numberDiff line numberDiff line change
@@ -18,7 +18,6 @@ package docker
1818
import (
1919
"fmt"
2020
"io/ioutil"
21-
"math"
2221
"path"
2322
"strings"
2423
"time"
@@ -28,7 +27,6 @@ import (
2827
containerlibcontainer "github.com/google/cadvisor/container/libcontainer"
2928
"github.com/google/cadvisor/fs"
3029
info "github.com/google/cadvisor/info/v1"
31-
"github.com/google/cadvisor/utils"
3230

3331
docker "github.com/fsouza/go-dockerclient"
3432
"github.com/opencontainers/runc/libcontainer/cgroups"
@@ -222,50 +220,6 @@ func (self *dockerContainerHandler) ContainerReference() (info.ContainerReferenc
222220
}, nil
223221
}
224222

225-
func (self *dockerContainerHandler) readLibcontainerConfig() (*libcontainerconfigs.Config, error) {
226-
config, err := containerlibcontainer.ReadConfig(*dockerRootDir, *dockerRunDir, self.id)
227-
if err != nil {
228-
return nil, fmt.Errorf("failed to read libcontainer config: %v", err)
229-
}
230-
231-
// Replace cgroup parent and name with our own since we may be running in a different context.
232-
if config.Cgroups == nil {
233-
config.Cgroups = new(libcontainerconfigs.Cgroup)
234-
}
235-
config.Cgroups.Name = self.name
236-
config.Cgroups.Parent = "/"
237-
238-
return config, nil
239-
}
240-
241-
func libcontainerConfigToContainerSpec(config *libcontainerconfigs.Config, mi *info.MachineInfo) info.ContainerSpec {
242-
var spec info.ContainerSpec
243-
spec.HasMemory = true
244-
spec.Memory.Limit = math.MaxUint64
245-
spec.Memory.SwapLimit = math.MaxUint64
246-
247-
if config.Cgroups.Resources != nil {
248-
if config.Cgroups.Resources.Memory > 0 {
249-
spec.Memory.Limit = uint64(config.Cgroups.Resources.Memory)
250-
}
251-
if config.Cgroups.Resources.MemorySwap > 0 {
252-
spec.Memory.SwapLimit = uint64(config.Cgroups.Resources.MemorySwap)
253-
}
254-
255-
// Get CPU info
256-
spec.HasCpu = true
257-
spec.Cpu.Limit = 1024
258-
if config.Cgroups.Resources.CpuShares != 0 {
259-
spec.Cpu.Limit = uint64(config.Cgroups.Resources.CpuShares)
260-
}
261-
spec.Cpu.Mask = utils.FixCpuMask(config.Cgroups.Resources.CpusetCpus, mi.NumCores)
262-
}
263-
264-
spec.HasDiskIo = true
265-
266-
return spec
267-
}
268-
269223
func (self *dockerContainerHandler) needNet() bool {
270224
if !self.ignoreMetrics.Has(container.NetworkUsageMetrics) {
271225
return !strings.HasPrefix(self.networkMode, "container:")
@@ -274,28 +228,8 @@ func (self *dockerContainerHandler) needNet() bool {
274228
}
275229

276230
func (self *dockerContainerHandler) GetSpec() (info.ContainerSpec, error) {
277-
mi, err := self.machineInfoFactory.GetMachineInfo()
278-
if err != nil {
279-
return info.ContainerSpec{}, err
280-
}
281-
libcontainerConfig, err := self.readLibcontainerConfig()
282-
if err != nil {
283-
return info.ContainerSpec{}, err
284-
}
285-
286-
spec := libcontainerConfigToContainerSpec(libcontainerConfig, mi)
287-
spec.CreationTime = self.creationTime
288-
289-
if !self.ignoreMetrics.Has(container.DiskUsageMetrics) {
290-
spec.HasFilesystem = true
291-
}
292-
293-
spec.Labels = self.labels
294-
spec.Envs = self.envs
295-
spec.Image = self.image
296-
spec.HasNetwork = self.needNet()
297-
298-
return spec, err
231+
hasFilesystem := !self.ignoreMetrics.Has(container.DiskUsageMetrics)
232+
return common.GetSpec(self.cgroupPaths, self.machineInfoFactory, self.needNet(), hasFilesystem)
299233
}
300234

301235
func (self *dockerContainerHandler) getFsStats(stats *info.ContainerStats) error {
@@ -399,7 +333,7 @@ func (self *dockerContainerHandler) StopWatchingSubcontainers() error {
399333
}
400334

401335
func (self *dockerContainerHandler) Exists() bool {
402-
return containerlibcontainer.Exists(*dockerRootDir, *dockerRunDir, self.id)
336+
return common.CgroupExists(self.cgroupPaths)
403337
}
404338

405339
func DockerInfo() (docker.DockerInfo, error) {

0 commit comments

Comments
 (0)