diff --git a/tuned/plugins/plugin_disk.py b/tuned/plugins/plugin_disk.py index 1a7868f..44682fa 100644 --- a/tuned/plugins/plugin_disk.py +++ b/tuned/plugins/plugin_disk.py @@ -2,6 +2,7 @@ import os, copy import tuned.plugins import tuned.logs import tuned.monitors +import tuned.utils.commands import struct log = tuned.logs.get() @@ -23,9 +24,10 @@ class DiskPlugin(tuned.plugins.Plugin): self._elevator_set = False self._old_elevator = "" + self._load_monitor = tuned.monitors.get_repository().create("disk", devices) + if not tuned.utils.storage.Storage.get_instance().data.has_key("disk"): tuned.utils.storage.Storage.get_instance().data["disk"] = {} - self._load_monitor = tuned.monitors.get_repository().create("disk", devices) @classmethod def tunable_devices(cls): @@ -50,46 +52,18 @@ class DiskPlugin(tuned.plugins.Plugin): } def _apply_elevator(self, dev): - storage = tuned.utils.storage.Storage.get_instance() - if storage.data["disk"].has_key(dev): - self._old_elevator = storage.data["disk"][dev] - self._revert_elevator(dev) - del storage.data["disk"][dev] + sys_file = os.path.join("/sys/block/", dev, "queue/scheduler") + tuned.utils.commands.revert_file("disk", "elevator_" + dev, sys_file) if len(self._options["elevator"]) == 0: return False - try: - f = open(os.path.join("/sys/block/", dev, "queue/scheduler"), "r") - self._old_elevator = f.read() - f.close() - except (OSError,IOError) as e: - log.error("Getting elevator of %s error: %s" % (dev, e)) - - storage = tuned.utils.storage.Storage.get_instance() - storage.data["disk"] = {dev : self._old_elevator} - storage.save() - - log.debug("Applying elevator: %s < %s" % (dev, self._options["elevator"])) - try: - f = open(os.path.join("/sys/block/", dev, "queue/scheduler"), "w") - f.write(self._options["elevator"]) - f.close() - except (OSError,IOError) as e: - log.error("Setting elevator on %s error: %s" % (dev, e)) + tuned.utils.commands.set_file("disk", "elevator_" + dev, sys_file, self._options["elevator"]) return True def _revert_elevator(self, dev): - if len(self._old_elevator) == 0: - return - - log.debug("Applying elevator: %s < %s" % (dev, self._old_elevator)) - try: - f = open(os.path.join("/sys/block/", dev, "queue/scheduler"), "w") - f.write(self._old_elevator) - f.close() - except (OSError,IOError) as e: - log.error("Setting elevator on %s error: %s" % (dev, e)) + sys_file = os.path.join("/sys/block/", dev, "queue/scheduler") + tuned.utils.commands.revert_file("disk", "elevator_" + dev, sys_file) def _update_idle(self, dev): idle = self.devidle.setdefault(dev, {}) diff --git a/tuned/utils/commands.py b/tuned/utils/commands.py new file mode 100644 index 0000000..28f0bb8 --- /dev/null +++ b/tuned/utils/commands.py @@ -0,0 +1,73 @@ +# Copyright (C) 2008-2012 Red Hat, Inc. +# +# This program is free software; you can redistribute it and/or +# modify it under the terms of the GNU General Public License +# as published by the Free Software Foundation; either version 2 +# of the License, or (at your option) any later version. +# +# This program is distributed in the hope that it will be useful, +# but WITHOUT ANY WARRANTY; without even the implied warranty of +# MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the +# GNU General Public License for more details. +# +# You should have received a copy of the GNU General Public License +# along with this program; if not, write to the Free Software +# Foundation, Inc., 51 Franklin Street, Fifth Floor, Boston, MA 02110-1301, USA. +# + +import os, copy +import tuned.plugins +import tuned.logs +import tuned.monitors +import tuned.utils.storage +import struct + +log = tuned.logs.get() + + +def _write_to_file(f, data): + log.debug("Writing to file: %s < %s" % (f, data)) + try: + fd = open(f, "w") + fd.write(data) + fd.close() + except (OSError,IOError) as e: + log.error("Writing to file %s error: %s" % (f, e)) + +def _read_file(f): + old_value = "" + try: + f = open(f, "r") + old_value = f.read() + f.close() + except (OSError,IOError) as e: + log.error("Reading %s error: %s" % (f, e)) + return old_value + + +def revert_file(key, subkey, f): + storage = tuned.utils.storage.Storage.get_instance() + if not storage.data.has_key(key): + log.error("Storage file does not contain item with key %s" % (key)) + return + + if not storage.data[key].has_key(subkey): + return + + old_value = storage.data[key][subkey] + _write_to_file(f, old_value) + + del storage.data[key][subkey] + +def set_file(key, subkey, f, data): + storage = tuned.utils.storage.Storage.get_instance() + if not storage.data.has_key(key): + log.error("Storage file does not contain item with key %s" % (key)) + return + + old_value = _read_file(f) + storage.data[key][subkey] = old_value + storage.save() + + _write_to_file(f, data) +