Update cgroups paths in state to be a map with cgroup type as key and path as value.

Docker-DCO-1.1-Signed-off-by: Vishnu Kannan <vishnuk@google.com> (github: vishh)
This commit is contained in:
Vishnu Kannan 2014-08-13 23:25:18 +00:00
parent ad16526d7f
commit 97de9a45f9
5 changed files with 25 additions and 9 deletions

View File

@ -37,5 +37,5 @@ type Cgroup struct {
type ActiveCgroup interface { type ActiveCgroup interface {
Cleanup() error Cleanup() error
Paths() ([]string, error) Paths() (map[string]string, error)
} }

View File

@ -153,14 +153,14 @@ func (raw *data) parent(subsystem string) (string, error) {
return filepath.Join(raw.root, subsystem, initPath), nil return filepath.Join(raw.root, subsystem, initPath), nil
} }
func (raw *data) Paths() ([]string, error) { func (raw *data) Paths() (map[string]string, error) {
var paths []string paths := make(map[string]string)
for sysname := range subsystems { for sysname := range subsystems {
path, err := raw.path(sysname) path, err := raw.path(sysname)
if err != nil { if err != nil {
return nil, err return nil, err
} }
paths = append(paths, path) paths[sysname] = path
} }
return paths, nil return paths, nil
} }

View File

@ -22,6 +22,7 @@ import (
type systemdCgroup struct { type systemdCgroup struct {
cleanupDirs []string cleanupDirs []string
cgroup *cgroups.Cgroup
} }
type subsystem interface { type subsystem interface {
@ -100,6 +101,7 @@ func Apply(c *cgroups.Cgroup, pid int) (cgroups.ActiveCgroup, error) {
res systemdCgroup res systemdCgroup
) )
res.cgroup = c
// First set up things not supported by systemd // First set up things not supported by systemd
// -1 disables memorySwap // -1 disables memorySwap
@ -320,8 +322,22 @@ func writeFile(dir, file, data string) error {
return ioutil.WriteFile(filepath.Join(dir, file), []byte(data), 0700) return ioutil.WriteFile(filepath.Join(dir, file), []byte(data), 0700)
} }
func (c *systemdCgroup) Paths() ([]string, error) { func (c *systemdCgroup) Paths() (map[string]string, error) {
return c.cleanupDirs, nil paths := make(map[string]string)
for sysname := range subsystems {
subsystemPath, err := getSubsystemPath(c.cgroup, sysname)
if err != nil {
// Don't fail if a cgroup hierarchy was not found, just skip this subsystem
if err == cgroups.ErrNotFound {
continue
}
return nil, err
}
paths[sysname] = subsystemPath
}
return paths, nil
} }
func (c *systemdCgroup) Cleanup() error { func (c *systemdCgroup) Cleanup() error {

View File

@ -175,7 +175,7 @@ func pathExists(path string) bool {
return true return true
} }
func EnterPid(cgroupPaths []string, pid int) error { func EnterPid(cgroupPaths map[string]string, pid int) error {
for _, path := range cgroupPaths { for _, path := range cgroupPaths {
if pathExists(path) { if pathExists(path) {
if err := ioutil.WriteFile(filepath.Join(path, "cgroup.procs"), if err := ioutil.WriteFile(filepath.Join(path, "cgroup.procs"),

View File

@ -19,8 +19,8 @@ type State struct {
// Network runtime state. // Network runtime state.
NetworkState network.NetworkState `json:"network_state,omitempty"` NetworkState network.NetworkState `json:"network_state,omitempty"`
// Path to all the cgroup dirs. // Path to all the cgroups setup for a container. Key is cgroup subsystem name.
CgroupPaths []string `json:"cgroup_paths,omitempty"` CgroupPaths map[string]string `json:"cgroup_paths,omitempty"`
} }
// The running state of the container. // The running state of the container.