mirror of
https://github.com/opencontainers/runc.git
synced 2026-07-11 14:13:58 +08:00
087b953dc5
Make sure we don't error out collecting statistics for cases where pids.max == "max". In that case, we can use a limit of 0 which means "unlimited". In addition, change the name of the stats attribute (Max) to mirror the name of the resources attribute in the spec (Limit) so that it's consistent internally. Signed-off-by: Aleksa Sarai <asarai@suse.de>
74 lines
1.6 KiB
Go
74 lines
1.6 KiB
Go
// +build linux
|
|
|
|
package fs
|
|
|
|
import (
|
|
"fmt"
|
|
"path/filepath"
|
|
"strconv"
|
|
|
|
"github.com/opencontainers/runc/libcontainer/cgroups"
|
|
"github.com/opencontainers/runc/libcontainer/configs"
|
|
)
|
|
|
|
type PidsGroup struct {
|
|
}
|
|
|
|
func (s *PidsGroup) Name() string {
|
|
return "pids"
|
|
}
|
|
|
|
func (s *PidsGroup) Apply(d *cgroupData) error {
|
|
_, err := d.join("pids")
|
|
if err != nil && !cgroups.IsNotFound(err) {
|
|
return err
|
|
}
|
|
return nil
|
|
}
|
|
|
|
func (s *PidsGroup) Set(path string, cgroup *configs.Cgroup) error {
|
|
if cgroup.Resources.PidsLimit != 0 {
|
|
// "max" is the fallback value.
|
|
limit := "max"
|
|
|
|
if cgroup.Resources.PidsLimit > 0 {
|
|
limit = strconv.FormatInt(cgroup.Resources.PidsLimit, 10)
|
|
}
|
|
|
|
if err := writeFile(path, "pids.max", limit); err != nil {
|
|
return err
|
|
}
|
|
}
|
|
|
|
return nil
|
|
}
|
|
|
|
func (s *PidsGroup) Remove(d *cgroupData) error {
|
|
return removePath(d.path("pids"))
|
|
}
|
|
|
|
func (s *PidsGroup) GetStats(path string, stats *cgroups.Stats) error {
|
|
current, err := getCgroupParamUint(path, "pids.current")
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse pids.current - %s", err)
|
|
}
|
|
|
|
maxString, err := getCgroupParamString(path, "pids.max")
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse pids.max - %s", err)
|
|
}
|
|
|
|
// Default if pids.max == "max" is 0 -- which represents "no limit".
|
|
var max uint64
|
|
if maxString != "max" {
|
|
max, err = parseUint(maxString, 10, 64)
|
|
if err != nil {
|
|
return fmt.Errorf("failed to parse pids.max - unable to parse %q as a uint from Cgroup file %q", maxString, filepath.Join(path, "pids.max"))
|
|
}
|
|
}
|
|
|
|
stats.PidsStats.Current = current
|
|
stats.PidsStats.Limit = max
|
|
return nil
|
|
}
|