Remove systemd.GetStats

Because we are using the paths that are created when we initially setup
cgroups for a container we no longer have to dynamically generates them
when a user requests stats.  This allows us to fully use the fs stats
code without having system create it's paths.

Signed-off-by: Michael Crosby <crosbymichael@gmail.com>
This commit is contained in:
Michael Crosby 2014-11-14 17:03:40 -08:00
parent 6c6808e5bf
commit 5cacd48132
3 changed files with 13 additions and 64 deletions

View File

@ -5,30 +5,17 @@ package libcontainer
import ( import (
"github.com/docker/libcontainer/cgroups/fs" "github.com/docker/libcontainer/cgroups/fs"
"github.com/docker/libcontainer/cgroups/systemd"
"github.com/docker/libcontainer/network" "github.com/docker/libcontainer/network"
) )
// TODO(vmarmol): Complete Stats() in final libcontainer API and move users to that. // TODO(vmarmol): Complete Stats() in final libcontainer API and move users to that.
// DEPRECATED: The below portions are only to be used during the transition to the official API. // DEPRECATED: The below portions are only to be used during the transition to the official API.
// Returns all available stats for the given container. // Returns all available stats for the given container.
func GetStats(container *Config, state *State) (*ContainerStats, error) { func GetStats(container *Config, state *State) (stats *ContainerStats, err error) {
var (
err error
stats = &ContainerStats{} stats = &ContainerStats{}
) if stats.CgroupStats, err = fs.GetStats(state.CgroupPaths); err != nil {
if systemd.UseSystemd() {
stats.CgroupStats, err = systemd.GetStats(container.Cgroups)
} else {
stats.CgroupStats, err = fs.GetStats(state.CgroupPaths)
}
if err != nil {
return stats, err return stats, err
} }
stats.NetworkStats, err = network.GetStats(&state.NetworkState) stats.NetworkStats, err = network.GetStats(&state.NetworkState)
return stats, err return stats, err
} }

View File

@ -27,7 +27,3 @@ func ApplyDevices(c *cgroups.Cgroup, pid int) error {
func Freeze(c *cgroups.Cgroup, state cgroups.FreezerState) error { func Freeze(c *cgroups.Cgroup, state cgroups.FreezerState) error {
return fmt.Errorf("Systemd not supported") return fmt.Errorf("Systemd not supported")
} }
func GetStats(c *cgroups.Cgroup) (*cgroups.Stats, error) {
return nil, fmt.Errorf("Systemd not supported")
}

View File

@ -31,16 +31,6 @@ var (
connLock sync.Mutex connLock sync.Mutex
theConn *systemd.Conn theConn *systemd.Conn
hasStartTransientUnit bool hasStartTransientUnit bool
subsystems = map[string]subsystem{
"devices": &fs.DevicesGroup{},
"memory": &fs.MemoryGroup{},
"cpu": &fs.CpuGroup{},
"cpuset": &fs.CpusetGroup{},
"cpuacct": &fs.CpuacctGroup{},
"blkio": &fs.BlkioGroup{},
"perf_event": &fs.PerfEventGroup{},
"freezer": &fs.FreezerGroup{},
}
) )
func newProp(name string, units interface{}) systemd.Property { func newProp(name string, units interface{}) systemd.Property {
@ -168,21 +158,26 @@ func writeFile(dir, file, data string) error {
func (c *systemdCgroup) Paths() (map[string]string, error) { func (c *systemdCgroup) Paths() (map[string]string, error) {
paths := make(map[string]string) paths := make(map[string]string)
for _, sysname := range []string{
for sysname := range subsystems { "devices",
"memory",
"cpu",
"cpuset",
"cpuacct",
"blkio",
"perf_event",
"freezer",
} {
subsystemPath, err := getSubsystemPath(c.cgroup, sysname) subsystemPath, err := getSubsystemPath(c.cgroup, sysname)
if err != nil { if err != nil {
// Don't fail if a cgroup hierarchy was not found, just skip this subsystem // Don't fail if a cgroup hierarchy was not found, just skip this subsystem
if cgroups.IsNotFound(err) { if cgroups.IsNotFound(err) {
continue continue
} }
return nil, err return nil, err
} }
paths[sysname] = subsystemPath paths[sysname] = subsystemPath
} }
return paths, nil return paths, nil
} }
@ -267,35 +262,6 @@ func getUnitName(c *cgroups.Cgroup) string {
return fmt.Sprintf("%s-%s.scope", c.Parent, c.Name) return fmt.Sprintf("%s-%s.scope", c.Parent, c.Name)
} }
/*
* This would be nicer to get from the systemd API when accounting
* is enabled, but sadly there is no way to do that yet.
* The lack of this functionality in the API & the approach taken
* is guided by
* http://www.freedesktop.org/wiki/Software/systemd/ControlGroupInterface/#readingaccountinginformation.
*/
func GetStats(c *cgroups.Cgroup) (*cgroups.Stats, error) {
stats := cgroups.NewStats()
for sysname, sys := range subsystems {
subsystemPath, err := getSubsystemPath(c, sysname)
if err != nil {
// Don't fail if a cgroup hierarchy was not found, just skip this subsystem
if cgroups.IsNotFound(err) {
continue
}
return nil, err
}
if err := sys.GetStats(subsystemPath, stats); err != nil {
return nil, err
}
}
return stats, nil
}
// Atm we can't use the systemd device support because of two missing things: // Atm we can't use the systemd device support because of two missing things:
// * Support for wildcards to allow mknod on any device // * Support for wildcards to allow mknod on any device
// * Support for wildcards to allow /dev/pts support // * Support for wildcards to allow /dev/pts support