[lxc-devel] [lxd/master] Make blkio limits more robust
stgraber on Github
lxc-bot at linuxcontainers.org
Fri Feb 5 09:38:41 UTC 2016
A non-text attachment was scrubbed...
Name: not available
Type: text/x-mailbox
Size: 562 bytes
Desc: not available
URL: <http://lists.linuxcontainers.org/pipermail/lxc-devel/attachments/20160205/46ed5a9f/attachment.bin>
-------------- next part --------------
From af1239c6d8fa46838bff758823cdbddaff906fea Mon Sep 17 00:00:00 2001
From: =?UTF-8?q?St=C3=A9phane=20Graber?= <stgraber at ubuntu.com>
Date: Fri, 5 Feb 2016 09:11:44 +0100
Subject: [PATCH] Make blkio limits more robust
MIME-Version: 1.0
Content-Type: text/plain; charset=UTF-8
Content-Transfer-Encoding: 8bit
Lets not completely fail startup/update on things the user cannot do
anything about. It's almost impossible to know what devices we can set
block limits on, so if we can't, just move on.
Closes #1568
Signed-off-by: Stéphane Graber <stgraber at ubuntu.com>
---
lxd/container_lxc.go | 68 +++++++++++++++++++++++++++++++++-------------------
1 file changed, 43 insertions(+), 25 deletions(-)
diff --git a/lxd/container_lxc.go b/lxd/container_lxc.go
index 325bb41..50a21dd 100644
--- a/lxd/container_lxc.go
+++ b/lxd/container_lxc.go
@@ -563,37 +563,51 @@ func (c *containerLXC) initLXC() error {
}
}
- diskLimits, err := c.getDiskLimits()
- if err != nil {
- return err
+ hasDiskLimits := false
+ for _, m := range c.expandedDevices {
+ if m["type"] != "disk" {
+ continue
+ }
+
+ if m["limits.read"] != "" || m["limits.write"] != "" || m["limits.max"] != "" {
+ hasDiskLimits = true
+ break
+ }
}
- for block, limit := range diskLimits {
- if limit.readBps > 0 {
- err = lxcSetConfigItem(cc, "lxc.cgroup.blkio.throttle.read_bps_device", fmt.Sprintf("%s %d", block, limit.readBps))
- if err != nil {
- return err
- }
+ if hasDiskLimits {
+ diskLimits, err := c.getDiskLimits()
+ if err != nil {
+ return err
}
- if limit.readIops > 0 {
- err = lxcSetConfigItem(cc, "lxc.cgroup.blkio.throttle.read_iops_device", fmt.Sprintf("%s %d", block, limit.readIops))
- if err != nil {
- return err
+ for block, limit := range diskLimits {
+ if limit.readBps > 0 {
+ err = lxcSetConfigItem(cc, "lxc.cgroup.blkio.throttle.read_bps_device", fmt.Sprintf("%s %d", block, limit.readBps))
+ if err != nil {
+ return err
+ }
}
- }
- if limit.writeBps > 0 {
- err = lxcSetConfigItem(cc, "lxc.cgroup.blkio.throttle.write_bps_device", fmt.Sprintf("%s %d", block, limit.writeBps))
- if err != nil {
- return err
+ if limit.readIops > 0 {
+ err = lxcSetConfigItem(cc, "lxc.cgroup.blkio.throttle.read_iops_device", fmt.Sprintf("%s %d", block, limit.readIops))
+ if err != nil {
+ return err
+ }
}
- }
- if limit.writeIops > 0 {
- err = lxcSetConfigItem(cc, "lxc.cgroup.blkio.throttle.write_iops_device", fmt.Sprintf("%s %d", block, limit.writeIops))
- if err != nil {
- return err
+ if limit.writeBps > 0 {
+ err = lxcSetConfigItem(cc, "lxc.cgroup.blkio.throttle.write_bps_device", fmt.Sprintf("%s %d", block, limit.writeBps))
+ if err != nil {
+ return err
+ }
+ }
+
+ if limit.writeIops > 0 {
+ err = lxcSetConfigItem(cc, "lxc.cgroup.blkio.throttle.write_iops_device", fmt.Sprintf("%s %d", block, limit.writeIops))
+ if err != nil {
+ return err
+ }
}
}
}
@@ -3508,14 +3522,18 @@ func (c *containerLXC) getDiskLimits() (map[string]deviceBlockLimit, error) {
device := deviceBlockLimit{readBps: readBps, readIops: readIops, writeBps: writeBps, writeIops: writeIops}
for _, block := range blocks {
- dev := strings.TrimPrefix(block, "/dev/")
+ if !strings.HasPrefix(block, "/dev/") {
+ continue
+ }
+ dev := strings.TrimPrefix(block, "/dev/")
if strings.Contains(dev, "/") {
continue
}
if !shared.PathExists(fmt.Sprintf("/sys/class/block/%s/dev", dev)) {
- return nil, fmt.Errorf("Disk %s is missing /sys/class/block entry", dev)
+ shared.Log.Error("Disk is missing /sys/class/block entry", log.Ctx{"device": dev})
+ continue
}
block, err := ioutil.ReadFile(fmt.Sprintf("/sys/class/block/%s/dev", dev))
More information about the lxc-devel
mailing list