From 3fea9a564c4112d04f6324df0d8b212e78feb5b3 Mon Sep 17 00:00:00 2001 From: Jake Hunsaker Date: Wed, 3 Nov 2021 11:02:54 -0400 Subject: [PATCH] [Plugin] Ensure specific plugin timeouts are only set for that plugin It was discovered that setting a specific plugin timeout via the `-k $plugin.timeout` option could influence the timeout setting for other plugins that are not also having their timeout explicitly set. Fix this by moving the default plugin opts into `Plugin.__init__()` so that each plugin is ensured a private copy of these default plugin options. Additionally, add more timeout data to plugin manifest entries to allow for better tracking of this setting. Adds a test case for this scenario. Closes: #2744 Signed-off-by: Jake Hunsaker --- sos/report/__init__.py | 2 +- sos/report/plugins/__init__.py | 28 +++++++++++++------ tests/vendor_tests/redhat/rhbz2018033.py | 35 ++++++++++++++++++++++++ 3 files changed, 55 insertions(+), 10 deletions(-) create mode 100644 tests/vendor_tests/redhat/rhbz2018033.py diff --git a/sos/report/__init__.py b/sos/report/__init__.py index ef86b28d..c95e6300 100644 --- a/sos/report/__init__.py +++ b/sos/report/__init__.py @@ -766,7 +766,7 @@ class SoSReport(SoSComponent): if self.all_options: self.ui_log.info(_("The following options are available for ALL " "plugins:")) - for opt in self.all_options[0][0]._default_plug_opts: + for opt in self.all_options[0][0].get_default_plugin_opts(): val = opt[3] if val == -1: val = TIMEOUT_DEFAULT diff --git a/sos/report/plugins/__init__.py b/sos/report/plugins/__init__.py index 49f1af27..3e717993 100644 --- a/sos/report/plugins/__init__.py +++ b/sos/report/plugins/__init__.py @@ -474,12 +474,6 @@ class Plugin(object): # Default predicates predicate = None cmd_predicate = None - _default_plug_opts = [ - ('timeout', 'Timeout in seconds for plugin to finish', 'fast', -1), - ('cmd-timeout', 'Timeout in seconds for a command', 'fast', -1), - ('postproc', 'Enable post-processing collected plugin data', 'fast', - True) - ] def __init__(self, commons): @@ -506,7 +500,7 @@ class Plugin(object): else logging.getLogger('sos') # add the default plugin opts - self.option_list.extend(self._default_plug_opts) + self.option_list.extend(self.get_default_plugin_opts()) # get the option list into a dictionary for opt in self.option_list: @@ -591,6 +583,14 @@ class Plugin(): # Initialise the default --dry-run predicate self.set_predicate(SoSPredicate(self)) + def get_default_plugin_opts(self): + return [ + ('timeout', 'Timeout in seconds for plugin to finish', 'fast', -1), + ('cmd-timeout', 'Timeout in seconds for a command', 'fast', -1), + ('postproc', 'Enable post-processing collected plugin data', 'fast', + True) + ] + def set_plugin_manifest(self, manifest): """Pass in a manifest object to the plugin to write to @@ -547,7 +541,9 @@ class Plugin(object): self.manifest.add_field('setup_start', '') self.manifest.add_field('setup_end', '') self.manifest.add_field('setup_time', '') + self.manifest.add_field('timeout', self.timeout) self.manifest.add_field('timeout_hit', False) + self.manifest.add_field('command_timeout', self.cmdtimeout) self.manifest.add_list('commands', []) self.manifest.add_list('files', [])