From a263afaf6c704be4139193fc302c9743a00677da Mon Sep 17 00:00:00 2001 From: Qiang Huang Date: Thu, 5 Nov 2015 18:41:08 +0800 Subject: [PATCH 1/3] Rename parent and data 'parent' function is confusing with parent cgroup, it's actually parent path, so rename it to parentPath. The name 'data' is too common to be identified, rename it to cgroupData which is exactly what it is. Signed-off-by: Qiang Huang --- libcontainer/cgroups/fs/apply_raw.go | 24 ++++++++++++------------ libcontainer/cgroups/fs/blkio.go | 4 ++-- libcontainer/cgroups/fs/cpu.go | 4 ++-- libcontainer/cgroups/fs/cpuacct.go | 4 ++-- libcontainer/cgroups/fs/cpuset.go | 4 ++-- libcontainer/cgroups/fs/devices.go | 4 ++-- libcontainer/cgroups/fs/freezer.go | 4 ++-- libcontainer/cgroups/fs/hugetlb.go | 4 ++-- libcontainer/cgroups/fs/memory.go | 4 ++-- libcontainer/cgroups/fs/name.go | 4 ++-- libcontainer/cgroups/fs/net_cls.go | 4 ++-- libcontainer/cgroups/fs/net_prio.go | 4 ++-- libcontainer/cgroups/fs/perf_event.go | 4 ++-- libcontainer/cgroups/fs/util_test.go | 6 +++--- 14 files changed, 39 insertions(+), 39 deletions(-) diff --git a/libcontainer/cgroups/fs/apply_raw.go b/libcontainer/cgroups/fs/apply_raw.go index f3ecd4b1..748bc043 100644 --- a/libcontainer/cgroups/fs/apply_raw.go +++ b/libcontainer/cgroups/fs/apply_raw.go @@ -52,10 +52,10 @@ type subsystem interface { Name() string // Returns the stats, as 'stats', corresponding to the cgroup under 'path'. GetStats(path string, stats *cgroups.Stats) error - // Removes the cgroup represented by 'data'. - Remove(*data) error - // Creates and joins the cgroup represented by data. - Apply(*data) error + // Removes the cgroup represented by 'cgroupData'. + Remove(*cgroupData) error + // Creates and joins the cgroup represented by 'cgroupData'. + Apply(*cgroupData) error // Set the cgroup represented by cgroup. Set(path string, cgroup *configs.Cgroup) error } @@ -92,7 +92,7 @@ func getCgroupRoot() (string, error) { return cgroupRoot, nil } -type data struct { +type cgroupData struct { root string cgroup string c *configs.Cgroup @@ -229,7 +229,7 @@ func (m *Manager) GetPids() ([]int, error) { return cgroups.GetPids(dir) } -func getCgroupData(c *configs.Cgroup, pid int) (*data, error) { +func getCgroupData(c *configs.Cgroup, pid int) (*cgroupData, error) { root, err := getCgroupRoot() if err != nil { return nil, err @@ -240,7 +240,7 @@ func getCgroupData(c *configs.Cgroup, pid int) (*data, error) { cgroup = filepath.Join(c.Parent, cgroup) } - return &data{ + return &cgroupData{ root: root, cgroup: cgroup, c: c, @@ -248,7 +248,7 @@ func getCgroupData(c *configs.Cgroup, pid int) (*data, error) { }, nil } -func (raw *data) parent(subsystem, mountpoint, root string) (string, error) { +func (raw *cgroupData) parentPath(subsystem, mountpoint, root string) (string, error) { initPath, err := cgroups.GetThisCgroupDir(subsystem) if err != nil { return "", err @@ -260,7 +260,7 @@ func (raw *data) parent(subsystem, mountpoint, root string) (string, error) { return filepath.Join(mountpoint, relDir), nil } -func (raw *data) path(subsystem string) (string, error) { +func (raw *cgroupData) path(subsystem string) (string, error) { mnt, root, err := cgroups.FindCgroupMountpointAndRoot(subsystem) // If we didn't mount the subsystem, there is no point we make the path. if err != nil { @@ -272,15 +272,15 @@ func (raw *data) path(subsystem string) (string, error) { return filepath.Join(raw.root, filepath.Base(mnt), raw.cgroup), nil } - parent, err := raw.parent(subsystem, mnt, root) + parentPath, err := raw.parentPath(subsystem, mnt, root) if err != nil { return "", err } - return filepath.Join(parent, raw.cgroup), nil + return filepath.Join(parentPath, raw.cgroup), nil } -func (raw *data) join(subsystem string) (string, error) { +func (raw *cgroupData) join(subsystem string) (string, error) { path, err := raw.path(subsystem) if err != nil { return "", err diff --git a/libcontainer/cgroups/fs/blkio.go b/libcontainer/cgroups/fs/blkio.go index 0cb65cb9..8e51e887 100644 --- a/libcontainer/cgroups/fs/blkio.go +++ b/libcontainer/cgroups/fs/blkio.go @@ -21,7 +21,7 @@ func (s *BlkioGroup) Name() string { return "blkio" } -func (s *BlkioGroup) Apply(d *data) error { +func (s *BlkioGroup) Apply(d *cgroupData) error { dir, err := d.join("blkio") if err != nil && !cgroups.IsNotFound(err) { return err @@ -78,7 +78,7 @@ func (s *BlkioGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *BlkioGroup) Remove(d *data) error { +func (s *BlkioGroup) Remove(d *cgroupData) error { return removePath(d.path("blkio")) } diff --git a/libcontainer/cgroups/fs/cpu.go b/libcontainer/cgroups/fs/cpu.go index 5161a7a6..2eff183f 100644 --- a/libcontainer/cgroups/fs/cpu.go +++ b/libcontainer/cgroups/fs/cpu.go @@ -19,7 +19,7 @@ func (s *CpuGroup) Name() string { return "cpu" } -func (s *CpuGroup) Apply(d *data) error { +func (s *CpuGroup) Apply(d *cgroupData) error { // We always want to join the cpu group, to allow fair cpu scheduling // on a container basis dir, err := d.join("cpu") @@ -64,7 +64,7 @@ func (s *CpuGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *CpuGroup) Remove(d *data) error { +func (s *CpuGroup) Remove(d *cgroupData) error { return removePath(d.path("cpu")) } diff --git a/libcontainer/cgroups/fs/cpuacct.go b/libcontainer/cgroups/fs/cpuacct.go index c855fb32..53afbadd 100644 --- a/libcontainer/cgroups/fs/cpuacct.go +++ b/libcontainer/cgroups/fs/cpuacct.go @@ -28,7 +28,7 @@ func (s *CpuacctGroup) Name() string { return "cpuacct" } -func (s *CpuacctGroup) Apply(d *data) error { +func (s *CpuacctGroup) Apply(d *cgroupData) error { // we just want to join this group even though we don't set anything if _, err := d.join("cpuacct"); err != nil && !cgroups.IsNotFound(err) { return err @@ -41,7 +41,7 @@ func (s *CpuacctGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *CpuacctGroup) Remove(d *data) error { +func (s *CpuacctGroup) Remove(d *cgroupData) error { return removePath(d.path("cpuacct")) } diff --git a/libcontainer/cgroups/fs/cpuset.go b/libcontainer/cgroups/fs/cpuset.go index 19c27bde..b0bc08b9 100644 --- a/libcontainer/cgroups/fs/cpuset.go +++ b/libcontainer/cgroups/fs/cpuset.go @@ -20,7 +20,7 @@ func (s *CpusetGroup) Name() string { return "cpuset" } -func (s *CpusetGroup) Apply(d *data) error { +func (s *CpusetGroup) Apply(d *cgroupData) error { dir, err := d.path("cpuset") if err != nil && !cgroups.IsNotFound(err) { return err @@ -42,7 +42,7 @@ func (s *CpusetGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *CpusetGroup) Remove(d *data) error { +func (s *CpusetGroup) Remove(d *cgroupData) error { return removePath(d.path("cpuset")) } diff --git a/libcontainer/cgroups/fs/devices.go b/libcontainer/cgroups/fs/devices.go index dfd20601..39fa82b3 100644 --- a/libcontainer/cgroups/fs/devices.go +++ b/libcontainer/cgroups/fs/devices.go @@ -14,7 +14,7 @@ func (s *DevicesGroup) Name() string { return "devices" } -func (s *DevicesGroup) Apply(d *data) error { +func (s *DevicesGroup) Apply(d *cgroupData) error { dir, err := d.join("devices") if err != nil { // We will return error even it's `not found` error, devices @@ -56,7 +56,7 @@ func (s *DevicesGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *DevicesGroup) Remove(d *data) error { +func (s *DevicesGroup) Remove(d *cgroupData) error { return removePath(d.path("devices")) } diff --git a/libcontainer/cgroups/fs/freezer.go b/libcontainer/cgroups/fs/freezer.go index b6df93ea..79170cda 100644 --- a/libcontainer/cgroups/fs/freezer.go +++ b/libcontainer/cgroups/fs/freezer.go @@ -18,7 +18,7 @@ func (s *FreezerGroup) Name() string { return "freezer" } -func (s *FreezerGroup) Apply(d *data) error { +func (s *FreezerGroup) Apply(d *cgroupData) error { dir, err := d.join("freezer") if err != nil && !cgroups.IsNotFound(err) { return err @@ -57,7 +57,7 @@ func (s *FreezerGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *FreezerGroup) Remove(d *data) error { +func (s *FreezerGroup) Remove(d *cgroupData) error { return removePath(d.path("freezer")) } diff --git a/libcontainer/cgroups/fs/hugetlb.go b/libcontainer/cgroups/fs/hugetlb.go index 1c2f7f78..e9ced13b 100644 --- a/libcontainer/cgroups/fs/hugetlb.go +++ b/libcontainer/cgroups/fs/hugetlb.go @@ -18,7 +18,7 @@ func (s *HugetlbGroup) Name() string { return "hugetlb" } -func (s *HugetlbGroup) Apply(d *data) error { +func (s *HugetlbGroup) Apply(d *cgroupData) error { dir, err := d.join("hugetlb") if err != nil && !cgroups.IsNotFound(err) { return err @@ -41,7 +41,7 @@ func (s *HugetlbGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *HugetlbGroup) Remove(d *data) error { +func (s *HugetlbGroup) Remove(d *cgroupData) error { return removePath(d.path("hugetlb")) } diff --git a/libcontainer/cgroups/fs/memory.go b/libcontainer/cgroups/fs/memory.go index dd318495..3e83bbac 100644 --- a/libcontainer/cgroups/fs/memory.go +++ b/libcontainer/cgroups/fs/memory.go @@ -21,7 +21,7 @@ func (s *MemoryGroup) Name() string { return "memory" } -func (s *MemoryGroup) Apply(d *data) (err error) { +func (s *MemoryGroup) Apply(d *cgroupData) (err error) { path, err := d.path("memory") if err != nil && !cgroups.IsNotFound(err) { return err @@ -94,7 +94,7 @@ func (s *MemoryGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *MemoryGroup) Remove(d *data) error { +func (s *MemoryGroup) Remove(d *cgroupData) error { return removePath(d.path("memory")) } diff --git a/libcontainer/cgroups/fs/name.go b/libcontainer/cgroups/fs/name.go index 264d0eea..0e423f66 100644 --- a/libcontainer/cgroups/fs/name.go +++ b/libcontainer/cgroups/fs/name.go @@ -15,7 +15,7 @@ func (s *NameGroup) Name() string { return s.GroupName } -func (s *NameGroup) Apply(d *data) error { +func (s *NameGroup) Apply(d *cgroupData) error { return nil } @@ -23,7 +23,7 @@ func (s *NameGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *NameGroup) Remove(d *data) error { +func (s *NameGroup) Remove(d *cgroupData) error { return nil } diff --git a/libcontainer/cgroups/fs/net_cls.go b/libcontainer/cgroups/fs/net_cls.go index 35df2f59..985f80b4 100644 --- a/libcontainer/cgroups/fs/net_cls.go +++ b/libcontainer/cgroups/fs/net_cls.go @@ -14,7 +14,7 @@ func (s *NetClsGroup) Name() string { return "net_cls" } -func (s *NetClsGroup) Apply(d *data) error { +func (s *NetClsGroup) Apply(d *cgroupData) error { dir, err := d.join("net_cls") if err != nil && !cgroups.IsNotFound(err) { return err @@ -37,7 +37,7 @@ func (s *NetClsGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *NetClsGroup) Remove(d *data) error { +func (s *NetClsGroup) Remove(d *cgroupData) error { return removePath(d.path("net_cls")) } diff --git a/libcontainer/cgroups/fs/net_prio.go b/libcontainer/cgroups/fs/net_prio.go index 294ff098..90fc23f1 100644 --- a/libcontainer/cgroups/fs/net_prio.go +++ b/libcontainer/cgroups/fs/net_prio.go @@ -14,7 +14,7 @@ func (s *NetPrioGroup) Name() string { return "net_prio" } -func (s *NetPrioGroup) Apply(d *data) error { +func (s *NetPrioGroup) Apply(d *cgroupData) error { dir, err := d.join("net_prio") if err != nil && !cgroups.IsNotFound(err) { return err @@ -37,7 +37,7 @@ func (s *NetPrioGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *NetPrioGroup) Remove(d *data) error { +func (s *NetPrioGroup) Remove(d *cgroupData) error { return removePath(d.path("net_prio")) } diff --git a/libcontainer/cgroups/fs/perf_event.go b/libcontainer/cgroups/fs/perf_event.go index 7bcb8df8..5693676d 100644 --- a/libcontainer/cgroups/fs/perf_event.go +++ b/libcontainer/cgroups/fs/perf_event.go @@ -14,7 +14,7 @@ func (s *PerfEventGroup) Name() string { return "perf_event" } -func (s *PerfEventGroup) Apply(d *data) error { +func (s *PerfEventGroup) Apply(d *cgroupData) error { // we just want to join this group even though we don't set anything if _, err := d.join("perf_event"); err != nil && !cgroups.IsNotFound(err) { return err @@ -26,7 +26,7 @@ func (s *PerfEventGroup) Set(path string, cgroup *configs.Cgroup) error { return nil } -func (s *PerfEventGroup) Remove(d *data) error { +func (s *PerfEventGroup) Remove(d *cgroupData) error { return removePath(d.path("perf_event")) } diff --git a/libcontainer/cgroups/fs/util_test.go b/libcontainer/cgroups/fs/util_test.go index 0f362560..01bf5f34 100644 --- a/libcontainer/cgroups/fs/util_test.go +++ b/libcontainer/cgroups/fs/util_test.go @@ -17,8 +17,8 @@ import ( ) type cgroupTestUtil struct { - // data to use in tests. - CgroupData *data + // cgroup data to use in tests. + CgroupData *cgroupData // Path to the mock cgroup directory. CgroupPath string @@ -30,7 +30,7 @@ type cgroupTestUtil struct { // Creates a new test util for the specified subsystem func NewCgroupTestUtil(subsystem string, t *testing.T) *cgroupTestUtil { - d := &data{ + d := &cgroupData{ c: &configs.Cgroup{}, } tempDir, err := ioutil.TempDir("", "cgroup_test") From 8c98ae27acf6f271ec89c074dbfb53712e2865a0 Mon Sep 17 00:00:00 2001 From: Qiang Huang Date: Thu, 5 Nov 2015 18:52:14 +0800 Subject: [PATCH 2/3] Refactor cgroupData The former cgroup entry is confusing, separate it to parent and name. Rename entry `c` to `config`. Signed-off-by: Qiang Huang --- libcontainer/cgroups/fs/apply_raw.go | 22 +++++++++---------- libcontainer/cgroups/fs/blkio.go | 2 +- libcontainer/cgroups/fs/blkio_test.go | 28 ++++++++++++------------ libcontainer/cgroups/fs/cpu.go | 2 +- libcontainer/cgroups/fs/cpu_test.go | 14 ++++++------ libcontainer/cgroups/fs/cpuset.go | 2 +- libcontainer/cgroups/fs/cpuset_test.go | 8 +++---- libcontainer/cgroups/fs/devices.go | 2 +- libcontainer/cgroups/fs/devices_test.go | 12 +++++----- libcontainer/cgroups/fs/freezer.go | 2 +- libcontainer/cgroups/fs/freezer_test.go | 8 +++---- libcontainer/cgroups/fs/hugetlb.go | 2 +- libcontainer/cgroups/fs/hugetlb_test.go | 4 ++-- libcontainer/cgroups/fs/memory.go | 4 ++-- libcontainer/cgroups/fs/memory_test.go | 20 ++++++++--------- libcontainer/cgroups/fs/net_cls.go | 2 +- libcontainer/cgroups/fs/net_cls_test.go | 4 ++-- libcontainer/cgroups/fs/net_prio.go | 2 +- libcontainer/cgroups/fs/net_prio_test.go | 4 ++-- libcontainer/cgroups/fs/util_test.go | 2 +- 20 files changed, 72 insertions(+), 74 deletions(-) diff --git a/libcontainer/cgroups/fs/apply_raw.go b/libcontainer/cgroups/fs/apply_raw.go index 748bc043..a6cf181e 100644 --- a/libcontainer/cgroups/fs/apply_raw.go +++ b/libcontainer/cgroups/fs/apply_raw.go @@ -94,8 +94,9 @@ func getCgroupRoot() (string, error) { type cgroupData struct { root string - cgroup string - c *configs.Cgroup + parent string + name string + config *configs.Cgroup pid int } @@ -235,15 +236,11 @@ func getCgroupData(c *configs.Cgroup, pid int) (*cgroupData, error) { return nil, err } - cgroup := c.Name - if c.Parent != "" { - cgroup = filepath.Join(c.Parent, cgroup) - } - return &cgroupData{ root: root, - cgroup: cgroup, - c: c, + parent: c.Parent, + name: c.Name, + config: c, pid: pid, }, nil } @@ -267,9 +264,10 @@ func (raw *cgroupData) path(subsystem string) (string, error) { return "", err } + cgPath := filepath.Join(raw.parent, raw.name) // If the cgroup name/path is absolute do not look relative to the cgroup of the init process. - if filepath.IsAbs(raw.cgroup) { - return filepath.Join(raw.root, filepath.Base(mnt), raw.cgroup), nil + if filepath.IsAbs(cgPath) { + return filepath.Join(raw.root, filepath.Base(mnt), cgPath), nil } parentPath, err := raw.parentPath(subsystem, mnt, root) @@ -277,7 +275,7 @@ func (raw *cgroupData) path(subsystem string) (string, error) { return "", err } - return filepath.Join(parentPath, raw.cgroup), nil + return filepath.Join(parentPath, cgPath), nil } func (raw *cgroupData) join(subsystem string) (string, error) { diff --git a/libcontainer/cgroups/fs/blkio.go b/libcontainer/cgroups/fs/blkio.go index 8e51e887..eddba0bf 100644 --- a/libcontainer/cgroups/fs/blkio.go +++ b/libcontainer/cgroups/fs/blkio.go @@ -27,7 +27,7 @@ func (s *BlkioGroup) Apply(d *cgroupData) error { return err } - if err := s.Set(dir, d.c); err != nil { + if err := s.Set(dir, d.config); err != nil { return err } diff --git a/libcontainer/cgroups/fs/blkio_test.go b/libcontainer/cgroups/fs/blkio_test.go index ba312f3a..def10795 100644 --- a/libcontainer/cgroups/fs/blkio_test.go +++ b/libcontainer/cgroups/fs/blkio_test.go @@ -89,9 +89,9 @@ func TestBlkioSetWeight(t *testing.T) { "blkio.weight": strconv.Itoa(weightBefore), }) - helper.CgroupData.c.BlkioWeight = weightAfter + helper.CgroupData.config.BlkioWeight = weightAfter blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -120,9 +120,9 @@ func TestBlkioSetWeightDevice(t *testing.T) { "blkio.weight_device": weightDeviceBefore, }) - helper.CgroupData.c.BlkioWeightDevice = []*configs.WeightDevice{wd} + helper.CgroupData.config.BlkioWeightDevice = []*configs.WeightDevice{wd} blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -157,9 +157,9 @@ func TestBlkioSetMultipleWeightDevice(t *testing.T) { "blkio.weight_device": weightDeviceBefore, }) - helper.CgroupData.c.BlkioWeightDevice = []*configs.WeightDevice{wd1, wd2} + helper.CgroupData.config.BlkioWeightDevice = []*configs.WeightDevice{wd1, wd2} blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -529,9 +529,9 @@ func TestBlkioSetThrottleReadBpsDevice(t *testing.T) { "blkio.throttle.read_bps_device": throttleBefore, }) - helper.CgroupData.c.BlkioThrottleReadBpsDevice = []*configs.ThrottleDevice{td} + helper.CgroupData.config.BlkioThrottleReadBpsDevice = []*configs.ThrottleDevice{td} blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -559,9 +559,9 @@ func TestBlkioSetThrottleWriteBpsDevice(t *testing.T) { "blkio.throttle.write_bps_device": throttleBefore, }) - helper.CgroupData.c.BlkioThrottleWriteBpsDevice = []*configs.ThrottleDevice{td} + helper.CgroupData.config.BlkioThrottleWriteBpsDevice = []*configs.ThrottleDevice{td} blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -589,9 +589,9 @@ func TestBlkioSetThrottleReadIOpsDevice(t *testing.T) { "blkio.throttle.read_iops_device": throttleBefore, }) - helper.CgroupData.c.BlkioThrottleReadIOPSDevice = []*configs.ThrottleDevice{td} + helper.CgroupData.config.BlkioThrottleReadIOPSDevice = []*configs.ThrottleDevice{td} blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -619,9 +619,9 @@ func TestBlkioSetThrottleWriteIOpsDevice(t *testing.T) { "blkio.throttle.write_iops_device": throttleBefore, }) - helper.CgroupData.c.BlkioThrottleWriteIOPSDevice = []*configs.ThrottleDevice{td} + helper.CgroupData.config.BlkioThrottleWriteIOPSDevice = []*configs.ThrottleDevice{td} blkio := &BlkioGroup{} - if err := blkio.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := blkio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } diff --git a/libcontainer/cgroups/fs/cpu.go b/libcontainer/cgroups/fs/cpu.go index 2eff183f..762a68fe 100644 --- a/libcontainer/cgroups/fs/cpu.go +++ b/libcontainer/cgroups/fs/cpu.go @@ -27,7 +27,7 @@ func (s *CpuGroup) Apply(d *cgroupData) error { return err } - if err := s.Set(dir, d.c); err != nil { + if err := s.Set(dir, d.config); err != nil { return err } diff --git a/libcontainer/cgroups/fs/cpu_test.go b/libcontainer/cgroups/fs/cpu_test.go index f3c1782e..abbe17a2 100644 --- a/libcontainer/cgroups/fs/cpu_test.go +++ b/libcontainer/cgroups/fs/cpu_test.go @@ -23,9 +23,9 @@ func TestCpuSetShares(t *testing.T) { "cpu.shares": strconv.Itoa(sharesBefore), }) - helper.CgroupData.c.CpuShares = sharesAfter + helper.CgroupData.config.CpuShares = sharesAfter cpu := &CpuGroup{} - if err := cpu.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := cpu.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -61,12 +61,12 @@ func TestCpuSetBandWidth(t *testing.T) { "cpu.rt_period_us": strconv.Itoa(rtPeriodBefore), }) - helper.CgroupData.c.CpuQuota = quotaAfter - helper.CgroupData.c.CpuPeriod = periodAfter - helper.CgroupData.c.CpuRtRuntime = rtRuntimeAfter - helper.CgroupData.c.CpuRtPeriod = rtPeriodAfter + helper.CgroupData.config.CpuQuota = quotaAfter + helper.CgroupData.config.CpuPeriod = periodAfter + helper.CgroupData.config.CpuRtRuntime = rtRuntimeAfter + helper.CgroupData.config.CpuRtPeriod = rtPeriodAfter cpu := &CpuGroup{} - if err := cpu.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := cpu.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } diff --git a/libcontainer/cgroups/fs/cpuset.go b/libcontainer/cgroups/fs/cpuset.go index b0bc08b9..088a665b 100644 --- a/libcontainer/cgroups/fs/cpuset.go +++ b/libcontainer/cgroups/fs/cpuset.go @@ -25,7 +25,7 @@ func (s *CpusetGroup) Apply(d *cgroupData) error { if err != nil && !cgroups.IsNotFound(err) { return err } - return s.ApplyDir(dir, d.c, d.pid) + return s.ApplyDir(dir, d.config, d.pid) } func (s *CpusetGroup) Set(path string, cgroup *configs.Cgroup) error { diff --git a/libcontainer/cgroups/fs/cpuset_test.go b/libcontainer/cgroups/fs/cpuset_test.go index 44b2f943..80d9a439 100644 --- a/libcontainer/cgroups/fs/cpuset_test.go +++ b/libcontainer/cgroups/fs/cpuset_test.go @@ -19,9 +19,9 @@ func TestCpusetSetCpus(t *testing.T) { "cpuset.cpus": cpusBefore, }) - helper.CgroupData.c.CpusetCpus = cpusAfter + helper.CgroupData.config.CpusetCpus = cpusAfter cpuset := &CpusetGroup{} - if err := cpuset.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := cpuset.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -48,9 +48,9 @@ func TestCpusetSetMems(t *testing.T) { "cpuset.mems": memsBefore, }) - helper.CgroupData.c.CpusetMems = memsAfter + helper.CgroupData.config.CpusetMems = memsAfter cpuset := &CpusetGroup{} - if err := cpuset.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := cpuset.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } diff --git a/libcontainer/cgroups/fs/devices.go b/libcontainer/cgroups/fs/devices.go index 39fa82b3..1e39618a 100644 --- a/libcontainer/cgroups/fs/devices.go +++ b/libcontainer/cgroups/fs/devices.go @@ -22,7 +22,7 @@ func (s *DevicesGroup) Apply(d *cgroupData) error { return err } - if err := s.Set(dir, d.c); err != nil { + if err := s.Set(dir, d.config); err != nil { return err } diff --git a/libcontainer/cgroups/fs/devices_test.go b/libcontainer/cgroups/fs/devices_test.go index f8422644..b85cf7ca 100644 --- a/libcontainer/cgroups/fs/devices_test.go +++ b/libcontainer/cgroups/fs/devices_test.go @@ -41,10 +41,10 @@ func TestDevicesSetAllow(t *testing.T) { "devices.deny": "a", }) - helper.CgroupData.c.AllowAllDevices = false - helper.CgroupData.c.AllowedDevices = allowedDevices + helper.CgroupData.config.AllowAllDevices = false + helper.CgroupData.config.AllowedDevices = allowedDevices devices := &DevicesGroup{} - if err := devices.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := devices.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -66,10 +66,10 @@ func TestDevicesSetDeny(t *testing.T) { "devices.allow": "a", }) - helper.CgroupData.c.AllowAllDevices = true - helper.CgroupData.c.DeniedDevices = deniedDevices + helper.CgroupData.config.AllowAllDevices = true + helper.CgroupData.config.DeniedDevices = deniedDevices devices := &DevicesGroup{} - if err := devices.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := devices.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } diff --git a/libcontainer/cgroups/fs/freezer.go b/libcontainer/cgroups/fs/freezer.go index 79170cda..8960ec78 100644 --- a/libcontainer/cgroups/fs/freezer.go +++ b/libcontainer/cgroups/fs/freezer.go @@ -24,7 +24,7 @@ func (s *FreezerGroup) Apply(d *cgroupData) error { return err } - if err := s.Set(dir, d.c); err != nil { + if err := s.Set(dir, d.config); err != nil { return err } diff --git a/libcontainer/cgroups/fs/freezer_test.go b/libcontainer/cgroups/fs/freezer_test.go index d5b107af..c4cd7fba 100644 --- a/libcontainer/cgroups/fs/freezer_test.go +++ b/libcontainer/cgroups/fs/freezer_test.go @@ -16,9 +16,9 @@ func TestFreezerSetState(t *testing.T) { "freezer.state": string(configs.Frozen), }) - helper.CgroupData.c.Freezer = configs.Thawed + helper.CgroupData.config.Freezer = configs.Thawed freezer := &FreezerGroup{} - if err := freezer.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := freezer.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -39,9 +39,9 @@ func TestFreezerSetInvalidState(t *testing.T) { invalidArg configs.FreezerState = "Invalid" ) - helper.CgroupData.c.Freezer = invalidArg + helper.CgroupData.config.Freezer = invalidArg freezer := &FreezerGroup{} - if err := freezer.Set(helper.CgroupPath, helper.CgroupData.c); err == nil { + if err := freezer.Set(helper.CgroupPath, helper.CgroupData.config); err == nil { t.Fatal("Failed to return invalid argument error") } } diff --git a/libcontainer/cgroups/fs/hugetlb.go b/libcontainer/cgroups/fs/hugetlb.go index e9ced13b..b1136537 100644 --- a/libcontainer/cgroups/fs/hugetlb.go +++ b/libcontainer/cgroups/fs/hugetlb.go @@ -24,7 +24,7 @@ func (s *HugetlbGroup) Apply(d *cgroupData) error { return err } - if err := s.Set(dir, d.c); err != nil { + if err := s.Set(dir, d.config); err != nil { return err } diff --git a/libcontainer/cgroups/fs/hugetlb_test.go b/libcontainer/cgroups/fs/hugetlb_test.go index 4eeb3fca..132a2640 100644 --- a/libcontainer/cgroups/fs/hugetlb_test.go +++ b/libcontainer/cgroups/fs/hugetlb_test.go @@ -40,14 +40,14 @@ func TestHugetlbSetHugetlb(t *testing.T) { } for _, pageSize := range HugePageSizes { - helper.CgroupData.c.HugetlbLimit = []*configs.HugepageLimit{ + helper.CgroupData.config.HugetlbLimit = []*configs.HugepageLimit{ { Pagesize: pageSize, Limit: hugetlbAfter, }, } hugetlb := &HugetlbGroup{} - if err := hugetlb.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := hugetlb.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } } diff --git a/libcontainer/cgroups/fs/memory.go b/libcontainer/cgroups/fs/memory.go index 3e83bbac..e5ffde4b 100644 --- a/libcontainer/cgroups/fs/memory.go +++ b/libcontainer/cgroups/fs/memory.go @@ -26,14 +26,14 @@ func (s *MemoryGroup) Apply(d *cgroupData) (err error) { if err != nil && !cgroups.IsNotFound(err) { return err } - if memoryAssigned(d.c) { + if memoryAssigned(d.config) { if path != "" { if err := os.MkdirAll(path, 0755); err != nil { return err } } - if err := s.Set(path, d.c); err != nil { + if err := s.Set(path, d.config); err != nil { return err } } diff --git a/libcontainer/cgroups/fs/memory_test.go b/libcontainer/cgroups/fs/memory_test.go index d7b5e5f4..36b92684 100644 --- a/libcontainer/cgroups/fs/memory_test.go +++ b/libcontainer/cgroups/fs/memory_test.go @@ -33,10 +33,10 @@ func TestMemorySetMemory(t *testing.T) { "memory.soft_limit_in_bytes": strconv.Itoa(reservationBefore), }) - helper.CgroupData.c.Memory = memoryAfter - helper.CgroupData.c.MemoryReservation = reservationAfter + helper.CgroupData.config.Memory = memoryAfter + helper.CgroupData.config.MemoryReservation = reservationAfter memory := &MemoryGroup{} - if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -70,9 +70,9 @@ func TestMemorySetMemoryswap(t *testing.T) { "memory.memsw.limit_in_bytes": strconv.Itoa(memoryswapBefore), }) - helper.CgroupData.c.MemorySwap = memoryswapAfter + helper.CgroupData.config.MemorySwap = memoryswapAfter memory := &MemoryGroup{} - if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -98,9 +98,9 @@ func TestMemorySetKernelMemory(t *testing.T) { "memory.kmem.limit_in_bytes": strconv.Itoa(kernelMemoryBefore), }) - helper.CgroupData.c.KernelMemory = kernelMemoryAfter + helper.CgroupData.config.KernelMemory = kernelMemoryAfter memory := &MemoryGroup{} - if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -126,9 +126,9 @@ func TestMemorySetMemorySwappinessDefault(t *testing.T) { "memory.swappiness": strconv.Itoa(swappinessBefore), }) - helper.CgroupData.c.Memory = swappinessAfter + helper.CgroupData.config.Memory = swappinessAfter memory := &MemoryGroup{} - if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } @@ -279,7 +279,7 @@ func TestMemorySetOomControl(t *testing.T) { }) memory := &MemoryGroup{} - if err := memory.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := memory.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } diff --git a/libcontainer/cgroups/fs/net_cls.go b/libcontainer/cgroups/fs/net_cls.go index 985f80b4..b09a1760 100644 --- a/libcontainer/cgroups/fs/net_cls.go +++ b/libcontainer/cgroups/fs/net_cls.go @@ -20,7 +20,7 @@ func (s *NetClsGroup) Apply(d *cgroupData) error { return err } - if err := s.Set(dir, d.c); err != nil { + if err := s.Set(dir, d.config); err != nil { return err } diff --git a/libcontainer/cgroups/fs/net_cls_test.go b/libcontainer/cgroups/fs/net_cls_test.go index 439e656d..a9a7d08c 100644 --- a/libcontainer/cgroups/fs/net_cls_test.go +++ b/libcontainer/cgroups/fs/net_cls_test.go @@ -19,9 +19,9 @@ func TestNetClsSetClassid(t *testing.T) { "net_cls.classid": classidBefore, }) - helper.CgroupData.c.NetClsClassid = classidAfter + helper.CgroupData.config.NetClsClassid = classidAfter netcls := &NetClsGroup{} - if err := netcls.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := netcls.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } diff --git a/libcontainer/cgroups/fs/net_prio.go b/libcontainer/cgroups/fs/net_prio.go index 90fc23f1..59117cad 100644 --- a/libcontainer/cgroups/fs/net_prio.go +++ b/libcontainer/cgroups/fs/net_prio.go @@ -20,7 +20,7 @@ func (s *NetPrioGroup) Apply(d *cgroupData) error { return err } - if err := s.Set(dir, d.c); err != nil { + if err := s.Set(dir, d.config); err != nil { return err } diff --git a/libcontainer/cgroups/fs/net_prio_test.go b/libcontainer/cgroups/fs/net_prio_test.go index 532392b4..6722b4df 100644 --- a/libcontainer/cgroups/fs/net_prio_test.go +++ b/libcontainer/cgroups/fs/net_prio_test.go @@ -22,9 +22,9 @@ func TestNetPrioSetIfPrio(t *testing.T) { helper := NewCgroupTestUtil("net_prio", t) defer helper.cleanup() - helper.CgroupData.c.NetPrioIfpriomap = prioMap + helper.CgroupData.config.NetPrioIfpriomap = prioMap netPrio := &NetPrioGroup{} - if err := netPrio.Set(helper.CgroupPath, helper.CgroupData.c); err != nil { + if err := netPrio.Set(helper.CgroupPath, helper.CgroupData.config); err != nil { t.Fatal(err) } diff --git a/libcontainer/cgroups/fs/util_test.go b/libcontainer/cgroups/fs/util_test.go index 01bf5f34..cec45bab 100644 --- a/libcontainer/cgroups/fs/util_test.go +++ b/libcontainer/cgroups/fs/util_test.go @@ -31,7 +31,7 @@ type cgroupTestUtil struct { // Creates a new test util for the specified subsystem func NewCgroupTestUtil(subsystem string, t *testing.T) *cgroupTestUtil { d := &cgroupData{ - c: &configs.Cgroup{}, + config: &configs.Cgroup{}, } tempDir, err := ioutil.TempDir("", "cgroup_test") if err != nil { From 209c8d9979e0a29baccf4e479b3066e992ef48c8 Mon Sep 17 00:00:00 2001 From: Qiang Huang Date: Thu, 5 Nov 2015 19:08:35 +0800 Subject: [PATCH 3/3] Add some comments about cgroup We fixed some bugs and introduced some code hard to be understood, add some comments for them. Signed-off-by: Qiang Huang --- libcontainer/cgroups/fs/apply_raw.go | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/libcontainer/cgroups/fs/apply_raw.go b/libcontainer/cgroups/fs/apply_raw.go index a6cf181e..68ebcfef 100644 --- a/libcontainer/cgroups/fs/apply_raw.go +++ b/libcontainer/cgroups/fs/apply_raw.go @@ -246,10 +246,15 @@ func getCgroupData(c *configs.Cgroup, pid int) (*cgroupData, error) { } func (raw *cgroupData) parentPath(subsystem, mountpoint, root string) (string, error) { + // Use GetThisCgroupDir instead of GetInitCgroupDir, because the creating + // process could in container and shared pid namespace with host, and + // /proc/1/cgroup could point to whole other world of cgroups. initPath, err := cgroups.GetThisCgroupDir(subsystem) if err != nil { return "", err } + // This is needed for nested containers, because in /proc/self/cgroup we + // see pathes from host, which don't exist in container. relDir, err := filepath.Rel(root, initPath) if err != nil { return "", err @@ -267,6 +272,7 @@ func (raw *cgroupData) path(subsystem string) (string, error) { cgPath := filepath.Join(raw.parent, raw.name) // If the cgroup name/path is absolute do not look relative to the cgroup of the init process. if filepath.IsAbs(cgPath) { + // Sometimes subsystems can be mounted togethger as 'cpu,cpuacct'. return filepath.Join(raw.root, filepath.Base(mnt), cgPath), nil }