From 71a0b2d5237e8b0cc95803638a0a358d014f6ca7 Mon Sep 17 00:00:00 2001 From: =?UTF-8?q?Jaroslav=20=C5=A0karvada?= Date: Mon, 29 Sep 2014 23:12:38 +0200 Subject: [PATCH] plugin_disk: added err_cnt to hdparm calls MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit Disabled set_apm and set_spindown commands after 5 consecutive errors (individual counters). Signed-off-by: Jaroslav Škarvada --- tuned/consts.py | 5 ++++ tuned/plugins/plugin_disk.py | 47 +++++++++++++++++++++++++++++++++--- 2 files changed, 48 insertions(+), 4 deletions(-) diff --git a/tuned/consts.py b/tuned/consts.py index ad3a3c0..5dc68bb 100644 --- a/tuned/consts.py +++ b/tuned/consts.py @@ -8,6 +8,11 @@ DBUS_OBJECT = "/Tuned" DEFAULT_PROFILE = "balanced" DEFAULT_STORAGE_FILE = "/run/tuned/save.pickle" LOAD_DIRECTORIES = ["/usr/lib/tuned", "/etc/tuned"] + +# max. number of consecutive errors to give up +ERROR_THRESHOLD = 5 + +# bootloader plugin configuration GRUB2_CFG_FILES = ["/boot/grub2/grub.cfg", "/boot/efi/EFI/redhat/grub.cfg", "/boot/efi/EFI/fedora/grub.cfg"] GRUB2_TUNED_TEMPLATE_NAME = "00_tuned" GRUB2_TEMPLATE_HEADER_BEGIN = "### BEGIN /etc/grub.d/" + GRUB2_TUNED_TEMPLATE_NAME + " ###" diff --git a/tuned/plugins/plugin_disk.py b/tuned/plugins/plugin_disk.py index 1ae082b..7929071 100644 --- a/tuned/plugins/plugin_disk.py +++ b/tuned/plugins/plugin_disk.py @@ -1,6 +1,7 @@ import hotplug from decorators import * import tuned.logs +import tuned.consts as consts from tuned.utils.commands import commands import os import re @@ -78,6 +79,9 @@ class DiskPlugin(hotplug.Plugin): def _instance_init(self, instance): instance._has_static_tuning = True + self._set_apm_errcnt = 0 + self._set_spindown_errcnt = 0 + if self._option_bool(instance.options["dynamic"]): instance._has_dynamic_tuning = True instance._load_monitor = self._monitors_repository.create("disk", instance.devices) @@ -93,6 +97,14 @@ class DiskPlugin(hotplug.Plugin): self._monitors_repository.delete(instance._load_monitor) instance._load_monitor = None + def _check_set_apm_err_threshold(self): + if self._set_apm_errcnt >= consts.ERROR_THRESHOLD: + log.info("disabling set_apm command, too many consecutive errors") + + def _check_set_spindown_err_threshold(self): + if self._set_spindown_errcnt >= consts.ERROR_THRESHOLD: + log.info("disabling set_spindown command, too many consecutive errors") + def _instance_update_dynamic(self, instance, device): load = instance._load_monitor.get_device_load(device) if load is None: @@ -124,8 +136,23 @@ class DiskPlugin(hotplug.Plugin): new_spindown_level = self._spindown_levels[idle["level"]] log.debug("tuning level changed to %d (power %d, spindown %d)" % (idle["level"], new_power_level, new_spindown_level)) - self._cmd.execute(["hdparm", "-S%d" % new_spindown_level, "-B%d" % new_power_level, "/dev/%s" % device]) - + if self._set_spindown_errcnt < consts.ERROR_THRESHOLD and self._set_apm_errcnt < consts.ERROR_THRESHOLD: + (rc, out) = self._cmd.execute(["hdparm", "-S%d" % new_spindown_level, "-B%d" % new_power_level, "/dev/%s" % device]) + if rc != 0: + self._set_spindown_errcnt += 1 + self._set_apm_errcnt += 1 + self._check_set_spindown_err_threshold() + self._check_set_apm_err_threshold() + elif self._set_spindown_errcnt < consts.ERROR_THRESHOLD: + (rc, out) = self._cmd.execute(["hdparm", "-S%d" % new_spindown_level, "/dev/%s" % device]) + if rc != 0: + self._set_spindown_errcnt += 1 + self._check_set_spindown_err_threshold() + elif self._set_apm_errcnt < consts.ERROR_THRESHOLD: + (rc, out) = self._cmd.execute(["hdparm", "-B%d" % new_power_level, "/dev/%s" % device]) + if rc != 0: + self._set_apm_errcnt += 1 + self._check_set_apm_err_threshold() log.debug("%s load: read %0.2f, write %0.2f" % (device, stats["read"], stats["write"])) log.debug("%s idle: read %d, write %d, level %d" % (device, idle["read"], idle["write"], idle["level"])) @@ -209,7 +236,13 @@ class DiskPlugin(hotplug.Plugin): @command_set("apm", per_device=True) def _set_apm(self, value, device): - self._cmd.execute(["hdparm", "-B", str(value), "/dev/" + device]) + if self._set_apm_errcnt < consts.ERROR_THRESHOLD: + (rc, out) = self._cmd.execute(["hdparm", "-B", str(value), "/dev/" + device]) + if rc: + self._set_apm_errcnt += 1 + self._check_set_apm_err_threshold() + else: + self._set_apm_errcnt = 0 @command_get("apm") def _get_apm(self, device): @@ -224,7 +257,13 @@ class DiskPlugin(hotplug.Plugin): @command_set("spindown", per_device=True) def _set_spindown(self, value, device): - self._cmd.execute(["hdparm", "-S", str(value), "/dev/" + device]) + if self._set_spindown_errcnt < consts.ERROR_THRESHOLD: + (rc, out) = self._cmd.execute(["hdparm", "-S", str(value), "/dev/" + device]) + if rc: + self._set_spindown_errcnt += 1 + self._check_set_spindown_err_threshold() + else: + self._set_spindown_errcnt = 0 @command_get("spindown") def _get_spindown(self, device):