100 lines
3.9 KiB
Diff
100 lines
3.9 KiB
Diff
|
From 3fea9a564c4112d04f6324df0d8b212e78feb5b3 Mon Sep 17 00:00:00 2001
|
||
|
From: Jake Hunsaker <jhunsake@redhat.com>
|
||
|
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 <jhunsake@redhat.com>
|
||
|
---
|
||
|
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,22 @@ class Plugin():
|
||
|
# Initialise the default --dry-run predicate
|
||
|
self.set_predicate(SoSPredicate(self))
|
||
|
|
||
|
+ def get_default_plugin_opts(self):
|
||
|
+ return {
|
||
|
+ 'timeout': PluginOpt(
|
||
|
+ 'timeout', default=-1, val_type=int,
|
||
|
+ desc='Timeout in seconds for plugin to finish all collections'
|
||
|
+ ),
|
||
|
+ 'cmd-timeout': PluginOpt(
|
||
|
+ 'cmd-timeout', default=-1, val_type=int,
|
||
|
+ desc='Timeout in seconds for individual commands to finish'
|
||
|
+ ),
|
||
|
+ 'postproc': PluginOpt(
|
||
|
+ 'postproc', default=True, val_type=bool,
|
||
|
+ desc='Enable post-processing of collected data'
|
||
|
+ )
|
||
|
+ }
|
||
|
+
|
||
|
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', [])
|
||
|
|