From b10bafce4832c6df32133dee562b066a10895968 Mon Sep 17 00:00:00 2001 From: Adriaan Schmidt Date: Thu, 7 Mar 2024 14:38:52 +0100 Subject: [PATCH] instance: add priority as a property Currently instance priorities are only used at startup to sort the instance classes. To enable dynamic creation of instances, we need to store the priorities, so new instances can be sorted accordingly. Signed-off-by: Adriaan Schmidt --- tests/unit/plugins/test_base.py | 14 +++++++------- tuned/plugins/base.py | 5 +++-- tuned/plugins/instance/instance.py | 7 ++++++- tuned/profiles/unit.py | 11 ++++++++++- tuned/units/manager.py | 12 +++++++----- 5 files changed, 33 insertions(+), 16 deletions(-) diff --git a/tests/unit/plugins/test_base.py b/tests/unit/plugins/test_base.py index 9fe77900c..7f59624c2 100644 --- a/tests/unit/plugins/test_base.py +++ b/tests/unit/plugins/test_base.py @@ -50,13 +50,13 @@ def test_option_bool(self): def test_create_instance(self): instance = self._plugin.create_instance(\ - 'first_instance','test','test','test','test',\ + 'first_instance',0,'test','test','test','test',\ {'default_option1':'default_value2'}) self.assertIsNotNone(instance) def test_destroy_instance(self): instance = self._plugin.create_instance(\ - 'first_instance','test','test','test','test',\ + 'first_instance',0,'test','test','test','test',\ {'default_option1':'default_value2'}) instance.plugin.init_devices() @@ -66,7 +66,7 @@ def test_destroy_instance(self): def test_get_matching_devices(self): """ without udev regex """ instance = self._plugin.create_instance(\ - 'first_instance','right_device*',None,'test','test',\ + 'first_instance',0,'right_device*',None,'test','test',\ {'default_option1':'default_value2'}) self.assertEqual(self._plugin._get_matching_devices(\ @@ -75,7 +75,7 @@ def test_get_matching_devices(self): """ with udev regex """ instance = self._plugin.create_instance(\ - 'second_instance','right_device*','device[1-2]','test','test',\ + 'second_instance',0,'right_device*','device[1-2]','test','test',\ {'default_option1':'default_value2'}) device1 = DummyDevice('device1',{'name':'device1'}) @@ -104,7 +104,7 @@ def test_check_commands(self): plugin_instance_factory,None,None) def test_execute_all_non_device_commands(self): - instance = self._commands_plugin.create_instance('test_instance','',\ + instance = self._commands_plugin.create_instance('test_instance',0,'',\ '','','',{'size':'XXL'}) self._commands_plugin._execute_all_non_device_commands(instance) @@ -112,7 +112,7 @@ def test_execute_all_non_device_commands(self): self.assertEqual(self._commands_plugin._size,'XXL') def test_execute_all_device_commands(self): - instance = self._commands_plugin.create_instance('test_instance','',\ + instance = self._commands_plugin.create_instance('test_instance',0,'',\ '','','',{'device_setting':'010'}) device1 = DummyDevice('device1',{}) @@ -133,7 +133,7 @@ def test_process_assignment_modifiers(self): '<100','200'),'100') def test_get_current_value(self): - instance = self._commands_plugin.create_instance('test_instance','',\ + instance = self._commands_plugin.create_instance('test_instance',0,'',\ '','','',{}) command = [com for com in self._commands_plugin._commands.values()\ diff --git a/tuned/plugins/base.py b/tuned/plugins/base.py index 8eaf48ada..afeb37f85 100644 --- a/tuned/plugins/base.py +++ b/tuned/plugins/base.py @@ -93,15 +93,16 @@ def _option_bool(self, value): # Interface for manipulation with instances of the plugin. # - def create_instance(self, name, devices_expression, devices_udev_regex, script_pre, script_post, options): + def create_instance(self, name, priority, devices_expression, devices_udev_regex, script_pre, script_post, options): """Create new instance of the plugin and seize the devices.""" if name in self._instances: raise Exception("Plugin instance with name '%s' already exists." % name) effective_options = self._get_effective_options(options) - instance = self._instance_factory.create(self, name, devices_expression, devices_udev_regex, \ + instance = self._instance_factory.create(self, name, priority, devices_expression, devices_udev_regex, \ script_pre, script_post, effective_options) self._instances[name] = instance + self._instances = collections.OrderedDict(sorted(self._instances.items(), key=lambda x: x[1].priority)) return instance diff --git a/tuned/plugins/instance/instance.py b/tuned/plugins/instance/instance.py index 1e286729d..d789d3538 100644 --- a/tuned/plugins/instance/instance.py +++ b/tuned/plugins/instance/instance.py @@ -4,7 +4,7 @@ class Instance(object): """ """ - def __init__(self, plugin, name, devices_expression, devices_udev_regex, script_pre, script_post, options): + def __init__(self, plugin, name, priority, devices_expression, devices_udev_regex, script_pre, script_post, options): self._plugin = plugin self._name = name self._devices_expression = devices_expression @@ -14,6 +14,7 @@ def __init__(self, plugin, name, devices_expression, devices_udev_regex, script_ self._options = options self._active = True + self._priority = priority self._has_static_tuning = False self._has_dynamic_tuning = False self._assigned_devices = set() @@ -38,6 +39,10 @@ def active(self): def active(self, value): self._active = value + @property + def priority(self): + return self._priority + @property def devices_expression(self): return self._devices_expression diff --git a/tuned/profiles/unit.py b/tuned/profiles/unit.py index 3f7535aa8..8c13429f7 100644 --- a/tuned/profiles/unit.py +++ b/tuned/profiles/unit.py @@ -6,11 +6,12 @@ class Unit(object): Unit description. """ - __slots__ = [ "_name", "_type", "_enabled", "_replace", "_drop", "_devices", "_devices_udev_regex", \ + __slots__ = [ "_name", "_priority", "_type", "_enabled", "_replace", "_drop", "_devices", "_devices_udev_regex", \ "_cpuinfo_regex", "_uname_regex", "_script_pre", "_script_post", "_options" ] def __init__(self, name, config): self._name = name + self._priority = config.pop("priority", None) self._type = config.pop("type", self._name) self._enabled = config.pop("enabled", True) in [True, "True", "true", 1, "1"] self._replace = config.pop("replace", False) in [True, "True", "true", 1, "1"] @@ -29,6 +30,14 @@ def __init__(self, name, config): def name(self): return self._name + @property + def priority(self): + return self._priority + + @priority.setter + def priority(self, value): + self._priority = value + @property def type(self): return self._type diff --git a/tuned/units/manager.py b/tuned/units/manager.py index 2612c1c4e..51f3490c7 100644 --- a/tuned/units/manager.py +++ b/tuned/units/manager.py @@ -73,14 +73,15 @@ def create(self, instances_config): log.debug("skipping instance '%s', uname does not match" % instance_name) continue - instance_info.options.setdefault("priority", self._def_instance_priority) - instance_info.options["priority"] = int(instance_info.options["priority"]) + if instance_info.priority is None: + instance_info.priority = int(self._def_instance_priority) + else: + instance_info.priority = int(instance_info.priority) instance_info_list.append(instance_info) - instance_info_list.sort(key=lambda x: x.options["priority"]) + instance_info_list.sort(key=lambda x: x.priority) plugins_by_name = collections.OrderedDict() for instance_info in instance_info_list: - instance_info.options.pop("priority") plugins_by_name[instance_info.type] = None for plugin_name, none in list(plugins_by_name.items()): @@ -102,7 +103,8 @@ def create(self, instances_config): if plugin is None: continue log.debug("creating '%s' (%s)" % (instance_info.name, instance_info.type)) - new_instance = plugin.create_instance(instance_info.name, instance_info.devices, instance_info.devices_udev_regex, \ + new_instance = plugin.create_instance(instance_info.name, instance_info.priority, \ + instance_info.devices, instance_info.devices_udev_regex, \ instance_info.script_pre, instance_info.script_post, instance_info.options) instances.append(new_instance) for instance in instances: