The following pull request was submitted through Github. It can be accessed and reviewed at: https://github.com/lxc/lxd/pull/6600
This e-mail was sent by the LXC bot, direct replies will not reach the author unless they happen to be subscribed to this list. === Description (from pull-request) === Added the rest of controllers to support different properties and controllers for issue #6305
From 56a84185b16375fa78482259dc205a1e46d7e47e Mon Sep 17 00:00:00 2001 From: Aaditya Murthy <amurthy...@gmail.com> Date: Wed, 11 Dec 2019 23:43:20 -0600 Subject: [PATCH 1/3] Replaced cgroupget/set calls for memory, pid controllers Signed-off-by: Lucinda Nguyen <lucinda.ongu...@gmail.com> --- .idea/.gitignore | 2 + .idea/lxd.iml | 8 +++ .idea/misc.xml | 6 ++ .idea/modules.xml | 8 +++ .idea/vcs.xml | 6 ++ lxd/cgroup/abstraction.go | 117 ++++++++++++++++++++++++++++++++++++++ lxd/cgroup/init.go | 4 +- lxd/container_lxc.go | 46 ++++++++------- 8 files changed, 174 insertions(+), 23 deletions(-) create mode 100644 .idea/.gitignore create mode 100644 .idea/lxd.iml create mode 100644 .idea/misc.xml create mode 100644 .idea/modules.xml create mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore new file mode 100644 index 0000000000..e7e9d11d4b --- /dev/null +++ b/.idea/.gitignore @@ -0,0 +1,2 @@ +# Default ignored files +/workspace.xml diff --git a/.idea/lxd.iml b/.idea/lxd.iml new file mode 100644 index 0000000000..c956989b29 --- /dev/null +++ b/.idea/lxd.iml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<module type="WEB_MODULE" version="4"> + <component name="NewModuleRootManager"> + <content url="file://$MODULE_DIR$" /> + <orderEntry type="inheritedJdk" /> + <orderEntry type="sourceFolder" forTests="false" /> + </component> +</module> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml new file mode 100644 index 0000000000..28a804d893 --- /dev/null +++ b/.idea/misc.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="JavaScriptSettings"> + <option name="languageLevel" value="ES6" /> + </component> +</project> \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml new file mode 100644 index 0000000000..3e4d197abb --- /dev/null +++ b/.idea/modules.xml @@ -0,0 +1,8 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="ProjectModuleManager"> + <modules> + <module fileurl="file://$PROJECT_DIR$/.idea/lxd.iml" filepath="$PROJECT_DIR$/.idea/lxd.iml" /> + </modules> + </component> +</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml new file mode 100644 index 0000000000..94a25f7f4c --- /dev/null +++ b/.idea/vcs.xml @@ -0,0 +1,6 @@ +<?xml version="1.0" encoding="UTF-8"?> +<project version="4"> + <component name="VcsDirectoryMappings"> + <mapping directory="$PROJECT_DIR$" vcs="Git" /> + </component> +</project> \ No newline at end of file diff --git a/lxd/cgroup/abstraction.go b/lxd/cgroup/abstraction.go index 8144aab6a5..d6ccc0b2c4 100644 --- a/lxd/cgroup/abstraction.go +++ b/lxd/cgroup/abstraction.go @@ -29,3 +29,120 @@ func (cg *CGroup) SetMaxProcesses(max int64) error { return ErrUnknownVersion } + +func (cg *CGroup) GetMaxProcess() (string, error) { + version := cgControllers["pids"] + if version == Unavailable { + return "", ErrControllerMissing + } + if version == V1 || version == V2 { + return cg.rw.Get(version, "pids", "pids.max") + } + return "",ErrUnknownVersion +} + +func (cg *CGroup) GetMemorySoftLimit() (string, error) { + version := cgControllers["memory"] + if version == Unavailable { + return "", ErrControllerMissing + } + if version == V1 { + return cg.rw.Get(version, "memory", "memory.soft_limit_in_bytes") + } + if version == V2 { + return cg.rw.Get(version, "memory", "memory.low") + } + return "", ErrUnknownVersion +} + +func (cg *CGroup) SetMemorySoftLimit(softLim string) error { + // Confirm we have the controller + version := cgControllers["memory"] + if version == Unavailable { + return ErrControllerMissing + } + // V1/V2 behavior + if version == V1 || version == V2 { + if softLim == "-1" { + return cg.rw.Set(version, "memory", "memory.soft_limit_in_bytes", "max") + } + } + if version == V1 { + return cg.rw.Set(version, "memory", "memory.soft_limit_in_bytes",softLim) + } + if version == V2 { + return cg.rw.Set(version, "memory","memory.low", softLim) + } + + return ErrUnknownVersion +} + + +func (cg *CGroup) GetMaxMemory() (string, error) { + version := cgControllers["memory"] + if version == Unavailable { + return "", ErrControllerMissing + } + if version == V1 { + return cg.rw.Get(version, "memory", "memory.limit_in_bytes") + } + if version == V2 { + return cg.rw.Get(version, "memory", "memory.max") + } + return "", ErrUnknownVersion +} +func (cg *CGroup) SetMemoryMax(max string) error { + // Confirm we have the controller + version := cgControllers["memory"] + if version == Unavailable { + return ErrControllerMissing + } + // V1/V2 behavior + if version == V1 { + return cg.rw.Set(version, "memory", "memory.limit_in_bytes",max) + } + if version == V2 { + return cg.rw.Set(version, "memory","memory.low", max) + } + return ErrUnknownVersion +} + +func (cg *CGroup) GetCurrentMemory() (string, error) { + version := cgControllers["memory"] + if version == Unavailable { + return "", ErrControllerMissing + } + if version == V1 { + return cg.rw.Get(version, "memory", "memory.usage_in_bytes") + } + if version == V2 { + return cg.rw.Get(version, "memory", "memory.current") + } + return "", ErrUnknownVersion +} + +func (cg *CGroup) GetCurrentProcesses() (string, error) { + version := cgControllers["pids"] + if version == Unavailable { + return "", ErrControllerMissing + } + if version == V1 || version == V2 { + return cg.rw.Get(version, "pids", "pids.current") + } + + return "", ErrUnknownVersion +} + + +func (cg *CGroup) GetCpuAcctUsage() (string, error) { + version := cgControllers["cpuacct"] + //only supported in V1 currently + if version == Unavailable || version == V2 { + return "", ErrControllerMissing + } + if version == V1 { + return cg.rw.Get(version, "cpuacct", "cpuacct.usage") + } + + return "", ErrUnknownVersion +} \ No newline at end of file diff --git a/lxd/cgroup/init.go b/lxd/cgroup/init.go index ac78c19db9..6b29a0f7c5 100644 --- a/lxd/cgroup/init.go +++ b/lxd/cgroup/init.go @@ -72,6 +72,7 @@ func init() { hasV2 := false // Go through the file line by line. scanSelfCg := bufio.NewScanner(selfCg) + logger.Warnf(selfCg.Name() +"path being read") for scanSelfCg.Scan() { line := strings.TrimSpace(scanSelfCg.Text()) fields := strings.SplitN(line, ":", 3) @@ -90,8 +91,9 @@ func init() { // Parse V2 controllers. path := fields[2] hybridPath := filepath.Join(cgPath, "unified", path, "cgroup.controllers") + logger.Warnf(hybridPath + "hybrid") dedicatedPath := filepath.Join(cgPath, path, "cgroup.controllers") - + logger.Warnf(dedicatedPath + "dedicated") controllers, err := os.Open(hybridPath) if err != nil { if !os.IsNotExist(err) { diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index 9de0a935bf..7a859ea00d 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -1120,13 +1120,13 @@ func (c *containerLXC) initLXC(config bool) error { } if memoryEnforce == "soft" { - err = lxcSetConfigItem(cc, "lxc.cgroup.memory.soft_limit_in_bytes", fmt.Sprintf("%d", valueInt)) + err = cg.SetMemorySoftLimit(fmt.Sprintf("%d", valueInt)) if err != nil { return err } } else { if c.state.OS.CGroupSwapAccounting && (memorySwap == "" || shared.IsTrue(memorySwap)) { - err = lxcSetConfigItem(cc, "lxc.cgroup.memory.limit_in_bytes", fmt.Sprintf("%d", valueInt)) + err = cg.SetMemoryMax(fmt.Sprintf("%d", valueInt)) if err != nil { return err } @@ -1135,13 +1135,13 @@ func (c *containerLXC) initLXC(config bool) error { return err } } else { - err = lxcSetConfigItem(cc, "lxc.cgroup.memory.limit_in_bytes", fmt.Sprintf("%d", valueInt)) + err = cg.SetMemoryMax(fmt.Sprintf("%d", valueInt)) if err != nil { return err } } // Set soft limit to value 10% less than hard limit - err = lxcSetConfigItem(cc, "lxc.cgroup.memory.soft_limit_in_bytes", fmt.Sprintf("%.0f", float64(valueInt)*0.9)) + err = cg.SetMemorySoftLimit( fmt.Sprintf("%.0f", float64(valueInt)*0.9)) if err != nil { return err } @@ -4271,24 +4271,22 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { oldMemswLimit = "" } } - - oldLimit, err := c.CGroupGet("memory.limit_in_bytes") + oldLimit,err := cg.GetMaxMemory() if err != nil { oldLimit = "" } - - oldSoftLimit, err := c.CGroupGet("memory.soft_limit_in_bytes") + oldSoftLimit, err := cg.GetMemorySoftLimit() if err != nil { oldSoftLimit = "" } revertMemory := func() { if oldSoftLimit != "" { - c.CGroupSet("memory.soft_limit_in_bytes", oldSoftLimit) + cg.SetMemorySoftLimit(oldSoftLimit) } if oldLimit != "" { - c.CGroupSet("memory.limit_in_bytes", oldLimit) + cg.SetMemoryMax(oldLimit) } if oldMemswLimit != "" { @@ -4304,14 +4302,12 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { return err } } - - err = c.CGroupSet("memory.limit_in_bytes", "-1") + err = cg.SetMemoryMax("-1") if err != nil { revertMemory() return err } - - err = c.CGroupSet("memory.soft_limit_in_bytes", "-1") + err = cg.SetMemorySoftLimit("-1") if err != nil { revertMemory() return err @@ -4320,14 +4316,14 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { // Set the new values if memoryEnforce == "soft" { // Set new limit - err = c.CGroupSet("memory.soft_limit_in_bytes", memory) + err = cg.SetMemorySoftLimit(memory) if err != nil { revertMemory() return err } } else { if c.state.OS.CGroupSwapAccounting && (memorySwap == "" || shared.IsTrue(memorySwap)) { - err = c.CGroupSet("memory.limit_in_bytes", memory) + err = cg.SetMemoryMax(memory) if err != nil { revertMemory() return err @@ -4339,7 +4335,7 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { return err } } else { - err = c.CGroupSet("memory.limit_in_bytes", memory) + err = cg.SetMemoryMax(memory) if err != nil { revertMemory() return err @@ -4352,8 +4348,7 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { revertMemory() return err } - - err = c.CGroupSet("memory.soft_limit_in_bytes", fmt.Sprintf("%.0f", float64(valueInt)*0.9)) + err = cg.SetMemorySoftLimit(fmt.Sprintf("%.0f", float64(valueInt)*0.9)) if err != nil { revertMemory() return err @@ -5749,7 +5744,9 @@ func (c *containerLXC) cpuState() api.InstanceStateCPU { } // CPU usage in seconds - value, err := c.CGroupGet("cpuacct.usage") + cg , err := c.cgroup(c.c) + + value, err := cg.GetCpuAcctUsage() if err != nil { cpu.Usage = -1 return cpu @@ -5820,7 +5817,8 @@ func (c *containerLXC) memoryState() api.InstanceStateMemory { } // Memory in bytes - value, err := c.CGroupGet("memory.usage_in_bytes") + cg, err := c.cgroup(c.c) + value, err := cg.GetCurrentMemory() valueInt, err1 := strconv.ParseInt(value, 10, 64) if err == nil && err1 == nil { memory.Usage = valueInt @@ -5922,7 +5920,11 @@ func (c *containerLXC) processesState() int64 { } if c.state.OS.CGroupPidsController { - value, err := c.CGroupGet("pids.current") + cg, err := c.cgroup(nil) + if err!= nil { + return 0 + } + value, err := cg.GetCurrentProcesses() if err != nil { return -1 } From 6899b33494b3b69a3feee75cf91934591b7ed441 Mon Sep 17 00:00:00 2001 From: Aaditya Murthy <amurthy...@gmail.com> Date: Thu, 12 Dec 2019 00:52:11 -0600 Subject: [PATCH 2/3] Controller abstraction for V1 and V2 Signed-off-by: Lucinda Nguyen <lucinda.ongu...@gmail.com> --- lxd/cgroup/abstraction.go | 175 ++++++++++++++++++++++++++++++++++++-- lxd/container_lxc.go | 66 +++++++------- 2 files changed, 201 insertions(+), 40 deletions(-) diff --git a/lxd/cgroup/abstraction.go b/lxd/cgroup/abstraction.go index d6ccc0b2c4..a6e62444fa 100644 --- a/lxd/cgroup/abstraction.go +++ b/lxd/cgroup/abstraction.go @@ -38,7 +38,7 @@ func (cg *CGroup) GetMaxProcess() (string, error) { if version == V1 || version == V2 { return cg.rw.Get(version, "pids", "pids.max") } - return "",ErrUnknownVersion + return "", ErrUnknownVersion } func (cg *CGroup) GetMemorySoftLimit() (string, error) { @@ -62,15 +62,16 @@ func (cg *CGroup) SetMemorySoftLimit(softLim string) error { return ErrControllerMissing } // V1/V2 behavior - if version == V1 || version == V2 { + if version == V1 { if softLim == "-1" { return cg.rw.Set(version, "memory", "memory.soft_limit_in_bytes", "max") } - } - if version == V1 { return cg.rw.Set(version, "memory", "memory.soft_limit_in_bytes",softLim) } if version == V2 { + if softLim == "-1" { + return cg.rw.Set(version, "memory", "memory.low", "max") + } return cg.rw.Set(version, "memory","memory.low", softLim) } @@ -102,12 +103,12 @@ func (cg *CGroup) SetMemoryMax(max string) error { return cg.rw.Set(version, "memory", "memory.limit_in_bytes",max) } if version == V2 { - return cg.rw.Set(version, "memory","memory.low", max) + return cg.rw.Set(version, "memory","memory.max", max) } return ErrUnknownVersion } -func (cg *CGroup) GetCurrentMemory() (string, error) { +func (cg *CGroup) GetMemoryUsage() (string, error) { version := cgControllers["memory"] if version == Unavailable { return "", ErrControllerMissing @@ -121,7 +122,7 @@ func (cg *CGroup) GetCurrentMemory() (string, error) { return "", ErrUnknownVersion } -func (cg *CGroup) GetCurrentProcesses() (string, error) { +func (cg *CGroup) GetProcessesUsage() (string, error) { version := cgControllers["pids"] if version == Unavailable { return "", ErrControllerMissing @@ -133,7 +134,30 @@ func (cg *CGroup) GetCurrentProcesses() (string, error) { return "", ErrUnknownVersion } +func (cg *CGroup) SetMemorySwapMax(max string) error { + //Confirm we have the controller + version := cgControllers["memory"] + if version == Unavailable { + return ErrControllerMissing + } + // V1/V2 behavior + if version == V1 { + if max == "-1" { + return cg.rw.Set(version, "memory","memory.memsw.limit_in_bytes", "max") + } + return cg.rw.Set(version, "memory","memory.memsw.limit_in_bytes", max) + } + if version == V2 { + if max == "-1" { + return cg.rw.Set(version, "memory","memory.swap.max", "max") + + } + + return cg.rw.Set(version, "memory","memory.swap.max", max) + } + return ErrUnknownVersion +} func (cg *CGroup) GetCpuAcctUsage() (string, error) { version := cgControllers["cpuacct"] //only supported in V1 currently @@ -145,4 +169,141 @@ func (cg *CGroup) GetCpuAcctUsage() (string, error) { } return "", ErrUnknownVersion +} + +func (cg *CGroup) GetMemoryMaxUsage() (string, error) { + version := cgControllers["memory"] + //only supported in V1 currently + if version == Unavailable || version == V2 { + return "", ErrControllerMissing + } + if version == V1 { + return cg.rw.Get(version, "memory", "memory.max_usage_in_bytes") + } + + return "", ErrUnknownVersion +} + +func (cg *CGroup) GetMemorySwMaxUsage() (string, error) { + version := cgControllers["memory"] + //only supported in V1 currently + if version == Unavailable || version == V2 { + return "", ErrControllerMissing + } + if version == V1 { + return cg.rw.Get(version, "memory", "memory.memsw.max_usage_in_bytes") + } + return "", ErrUnknownVersion +} + +func (cg *CGroup) SetMemorySwappiness(value string) error { + // Confirm we have the controller + version := cgControllers["memory"] + if version == Unavailable || version == V2{ + return ErrControllerMissing + } + // V1 behavior + if version == V1 { + return cg.rw.Set(version, "memory","memory.swappiness", value) + } + return ErrUnknownVersion +} + + +func (cg *CGroup) GetMemorySwapLimit() (string, error) { + version := cgControllers["memory"] + if version == Unavailable { + return "", ErrControllerMissing + } + if version == V1 { + return cg.rw.Get(version, "memory", "memory.memsw.limit_in_bytes") + } + if version == V2 { + return cg.rw.Get(version, "memory", "memory.swap.max") + } + return "", ErrUnknownVersion +} + +func (cg *CGroup) GetMemorySwapUsage() (string, error) { + version := cgControllers["memory"] + //only supported in V1 currently + if version == Unavailable { + return "", ErrControllerMissing + } + if version == V1 { + return cg.rw.Get(version, "memory", "memory.memsw.usage_in_bytes") + } + if version == V2 { + return cg.rw.Get(version, "memory", "memory.swap.current") + } + return "", ErrUnknownVersion +} + +func (cg *CGroup) GetBlkioWeight() (string, error) { + // Confirm we have the controller + version := cgControllers["blkio"] + if version == Unavailable || version == V2 { + return "", ErrControllerMissing + } + // V1/V2 behavior + if version == V1 { + return cg.rw.Get(version, "blkio", "blkio.weight") + } + + return "", ErrUnknownVersion +} + +func (cg *CGroup) SetCpusShare(value string) error { + //Confirm we have the controller + version := cgControllers["cpu"] + if version == Unavailable { + return ErrControllerMissing + } + // V1/V2 behavior + if version == V1 { + return cg.rw.Set(version, "cpu","cpu.shares", value) + } + if version == V2 { + return cg.rw.Set(version, "cpu","cpu.weight", value) + } + return ErrUnknownVersion +} + +func (cg *CGroup) SetCpuCfsPeriod(value string) error { + //Confirm we have the controller + version := cgControllers["cpu"] + if version == Unavailable || version == V2 { + return ErrControllerMissing + } + // V1 behavior + if version == V1 { + return cg.rw.Set(version, "cpu","cpu.cfs_period_us", value) + } + + return ErrUnknownVersion +} + +func (cg *CGroup) SetCpuCfsQuota(value string) error { + //Confirm we have the controller + version := cgControllers["cpu"] + if version == Unavailable || version == V2 { + return ErrControllerMissing + } + // V1/V2 behavior + if version == V1 { + return cg.rw.Set(version, "cpu","cpu.cfs_quota_us", value) + } + return ErrUnknownVersion +} + +func (cg *CGroup) SetNetIfPrio(value string) error { + version := cgControllers["net_prio"] + if version == Unavailable || version == V2 { + return ErrControllerMissing + } + // V1 behavior + if version == V1 { + return cg.rw.Set(version, "net_prio","net_prio.ifpriomap", value) + } + return ErrUnknownVersion } \ No newline at end of file diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go index 7a859ea00d..ba150368c2 100644 --- a/lxd/container_lxc.go +++ b/lxd/container_lxc.go @@ -1150,7 +1150,7 @@ func (c *containerLXC) initLXC(config bool) error { // Configure the swappiness if memorySwap != "" && !shared.IsTrue(memorySwap) { - err = lxcSetConfigItem(cc, "lxc.cgroup.memory.swappiness", "0") + err = cg.SetMemorySwappiness("0") if err != nil { return err } @@ -1159,8 +1159,7 @@ func (c *containerLXC) initLXC(config bool) error { if err != nil { return err } - - err = lxcSetConfigItem(cc, "lxc.cgroup.memory.swappiness", fmt.Sprintf("%d", 60-10+priority)) + err = cg.SetMemorySwappiness(fmt.Sprintf("%d", 60-10+priority)) if err != nil { return err } @@ -1178,21 +1177,21 @@ func (c *containerLXC) initLXC(config bool) error { } if cpuShares != "1024" { - err = lxcSetConfigItem(cc, "lxc.cgroup.cpu.shares", cpuShares) + err = cg.SetCpusShare(cpuShares) if err != nil { return err } } if cpuCfsPeriod != "-1" { - err = lxcSetConfigItem(cc, "lxc.cgroup.cpu.cfs_period_us", cpuCfsPeriod) + err = cg.SetCpuCfsPeriod(cpuCfsPeriod) if err != nil { return err } } if cpuCfsQuota != "-1" { - err = lxcSetConfigItem(cc, "lxc.cgroup.cpu.cfs_quota_us", cpuCfsQuota) + err = cg.SetCpuCfsQuota(cpuCfsQuota) if err != nil { return err } @@ -3861,6 +3860,10 @@ func (c *containerLXC) VolatileSet(changes map[string]string) error { } func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { + cg, err := c.cgroup(c.c) + if err != nil { + return err + } // Set sane defaults for unset keys if args.Project == "" { args.Project = "default" @@ -3883,7 +3886,7 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { } // Validate the new config - err := instance.ValidConfig(c.state.OS, args.Config, false, false) + err = instance.ValidConfig(c.state.OS, args.Config, false, false) if err != nil { return errors.Wrap(err, "Invalid config") } @@ -4097,10 +4100,7 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { } // Load cgroup abstraction - cg, err := c.cgroup(nil) - if err != nil { - return err - } + // If apparmor changed, re-validate the apparmor profile if shared.StringInSlice("raw.apparmor", changedConfig) || shared.StringInSlice("security.nesting", changedConfig) { @@ -4224,8 +4224,7 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { if priority == 0 { priority = 10 } - - err = c.CGroupSet("blkio.weight", fmt.Sprintf("%d", priority)) + cg.SetBlkioWeight(fmt.Sprintf("%d", priority)) if err != nil { return err } @@ -4266,7 +4265,7 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { // Store the old values for revert oldMemswLimit := "" if c.state.OS.CGroupSwapAccounting { - oldMemswLimit, err = c.CGroupGet("memory.memsw.limit_in_bytes") + oldMemswLimit, err = cg.GetMemorySwapLimit() if err != nil { oldMemswLimit = "" } @@ -4290,13 +4289,13 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { } if oldMemswLimit != "" { - c.CGroupSet("memory.memsw.limit_in_bytes", oldMemswLimit) + cg.SetMemorySwapMax(oldMemswLimit) } } // Reset everything if c.state.OS.CGroupSwapAccounting { - err = c.CGroupSet("memory.memsw.limit_in_bytes", "-1") + err = cg.SetMemorySwapMax("-1") if err != nil { revertMemory() return err @@ -4328,8 +4327,7 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { revertMemory() return err } - - err = c.CGroupSet("memory.memsw.limit_in_bytes", memory) + err = cg.SetMemorySwapMax(memory) if err != nil { revertMemory() return err @@ -4360,7 +4358,7 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { memorySwap := c.expandedConfig["limits.memory.swap"] memorySwapPriority := c.expandedConfig["limits.memory.swap.priority"] if memorySwap != "" && !shared.IsTrue(memorySwap) { - err = c.CGroupSet("memory.swappiness", "0") + err = cg.SetMemorySwappiness("0") if err != nil { return err } @@ -4372,8 +4370,7 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { return err } } - - err = c.CGroupSet("memory.swappiness", fmt.Sprintf("%d", 60-10+priority)) + err = cg.SetMemorySwappiness(fmt.Sprintf("%d", 60-10+priority)) if err != nil { return err } @@ -4398,18 +4395,16 @@ func (c *containerLXC) Update(args db.InstanceArgs, userRequested bool) error { if err != nil { return err } - - err = c.CGroupSet("cpu.shares", cpuShares) + err = cg.SetCpusShare(cpuShares) if err != nil { return err } - - err = c.CGroupSet("cpu.cfs_period_us", cpuCfsPeriod) + err = cg.SetCpuCfsPeriod(cpuCfsPeriod) if err != nil { return err } - err = c.CGroupSet("cpu.cfs_quota_us", cpuCfsQuota) + err = cg.SetCpuCfsQuota(cpuCfsQuota) if err != nil { return err } @@ -5811,21 +5806,21 @@ func (c *containerLXC) diskState() map[string]api.InstanceStateDisk { func (c *containerLXC) memoryState() api.InstanceStateMemory { memory := api.InstanceStateMemory{} + cg, err := c.cgroup(c.c) if !c.state.OS.CGroupMemoryController { return memory } // Memory in bytes - cg, err := c.cgroup(c.c) - value, err := cg.GetCurrentMemory() + value, err := cg.GetMemoryUsage() valueInt, err1 := strconv.ParseInt(value, 10, 64) if err == nil && err1 == nil { memory.Usage = valueInt } // Memory peak in bytes - value, err = c.CGroupGet("memory.max_usage_in_bytes") + value, err = cg.GetMemoryMaxUsage() valueInt, err1 = strconv.ParseInt(value, 10, 64) if err == nil && err1 == nil { memory.UsagePeak = valueInt @@ -5834,7 +5829,7 @@ func (c *containerLXC) memoryState() api.InstanceStateMemory { if c.state.OS.CGroupSwapAccounting { // Swap in bytes if memory.Usage > 0 { - value, err := c.CGroupGet("memory.memsw.usage_in_bytes") + value, err := cg.GetMemorySwapUsage() valueInt, err1 := strconv.ParseInt(value, 10, 64) if err == nil && err1 == nil { memory.SwapUsage = valueInt - memory.Usage @@ -5843,7 +5838,7 @@ func (c *containerLXC) memoryState() api.InstanceStateMemory { // Swap peak in bytes if memory.UsagePeak > 0 { - value, err = c.CGroupGet("memory.memsw.max_usage_in_bytes") + value, err = cg.GetMemorySwMaxUsage() valueInt, err1 = strconv.ParseInt(value, 10, 64) if err == nil && err1 == nil { memory.SwapUsagePeak = valueInt - memory.UsagePeak @@ -5924,7 +5919,7 @@ func (c *containerLXC) processesState() int64 { if err!= nil { return 0 } - value, err := cg.GetCurrentProcesses() + value, err := cg.GetProcessesUsage() if err != nil { return -1 } @@ -6498,6 +6493,11 @@ func (c *containerLXC) removeDiskDevices() error { // Network I/O limits func (c *containerLXC) setNetworkPriority() error { + cg, err := c.cgroup(c.c) + if err != nil { + return err + } + // Check that the container is running if !c.IsRunning() { return fmt.Errorf("Can't set network priority on stopped container") @@ -6529,7 +6529,7 @@ func (c *containerLXC) setNetworkPriority() error { success := false var last_error error for _, netif := range netifs { - err = c.CGroupSet("net_prio.ifpriomap", fmt.Sprintf("%s %d", netif.Name, networkInt)) + err = cg.SetNetIfPrio(fmt.Sprintf("%s %d", netif.Name, networkInt)) if err == nil { success = true } else { From 7269a7fbd3a2ca3f178bfaa1039206d0009bdd9a Mon Sep 17 00:00:00 2001 From: Aaditya Murthy <amurthy...@gmail.com> Date: Thu, 12 Dec 2019 00:56:39 -0600 Subject: [PATCH 3/3] removed duplicated directory Signed-off-by: Lucinda Nguyen <lucinda@tutorial-island.localhost> --- .idea/.gitignore | 2 -- .idea/lxd.iml | 8 -------- .idea/misc.xml | 6 ------ .idea/modules.xml | 8 -------- .idea/vcs.xml | 6 ------ 5 files changed, 30 deletions(-) delete mode 100644 .idea/.gitignore delete mode 100644 .idea/lxd.iml delete mode 100644 .idea/misc.xml delete mode 100644 .idea/modules.xml delete mode 100644 .idea/vcs.xml diff --git a/.idea/.gitignore b/.idea/.gitignore deleted file mode 100644 index e7e9d11d4b..0000000000 --- a/.idea/.gitignore +++ /dev/null @@ -1,2 +0,0 @@ -# Default ignored files -/workspace.xml diff --git a/.idea/lxd.iml b/.idea/lxd.iml deleted file mode 100644 index c956989b29..0000000000 --- a/.idea/lxd.iml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<module type="WEB_MODULE" version="4"> - <component name="NewModuleRootManager"> - <content url="file://$MODULE_DIR$" /> - <orderEntry type="inheritedJdk" /> - <orderEntry type="sourceFolder" forTests="false" /> - </component> -</module> \ No newline at end of file diff --git a/.idea/misc.xml b/.idea/misc.xml deleted file mode 100644 index 28a804d893..0000000000 --- a/.idea/misc.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="JavaScriptSettings"> - <option name="languageLevel" value="ES6" /> - </component> -</project> \ No newline at end of file diff --git a/.idea/modules.xml b/.idea/modules.xml deleted file mode 100644 index 3e4d197abb..0000000000 --- a/.idea/modules.xml +++ /dev/null @@ -1,8 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="ProjectModuleManager"> - <modules> - <module fileurl="file://$PROJECT_DIR$/.idea/lxd.iml" filepath="$PROJECT_DIR$/.idea/lxd.iml" /> - </modules> - </component> -</project> \ No newline at end of file diff --git a/.idea/vcs.xml b/.idea/vcs.xml deleted file mode 100644 index 94a25f7f4c..0000000000 --- a/.idea/vcs.xml +++ /dev/null @@ -1,6 +0,0 @@ -<?xml version="1.0" encoding="UTF-8"?> -<project version="4"> - <component name="VcsDirectoryMappings"> - <mapping directory="$PROJECT_DIR$" vcs="Git" /> - </component> -</project> \ No newline at end of file
_______________________________________________ lxc-devel mailing list lxc-devel@lists.linuxcontainers.org http://lists.linuxcontainers.org/listinfo/lxc-devel