summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorStephen Finucane <sfinucan@redhat.com>2019-12-13 16:18:33 +0000
committerStephen Finucane <stephenfin@redhat.com>2019-12-19 09:17:47 +0000
commitc1394f6e2d3e55a8d4e4332915d26fbfd5f4ee9e (patch)
tree1f9e1b9bc86cd4707f9e47d67b2d1b1ce6749514
parenta3f25681520695c30701f843d826ba4312422354 (diff)
downloadoslo-config-stable/rocky.tar.gz
Ensure option groups don't change during loggingrocky-em6.4.2stable/rocky
oslo.config allows us to configure groups and options dynamically. This can cause a race with our logging as we attempt to iterate through option groups that are changing under our feet. This wouldn't be a huge issue, since these are just logs are we can always log again, if needed, but we store groups in a dictionary and Python doesn't like us changing the size of a dict it's iterating through: RuntimeError: dictionary changed size during iteration Given that we're only reading through this option group and don't need to worry about a group _disappearing_, the solution is pretty simple: create a copy of our option group names ahead of time so we don't need to worry about new ones coming and messing things up. No tests are included since this is a race and the only way I see to reproduce this would involve lots of ugly threading. Change-Id: Id3b28465d645a24f0fcebff2dd68a9bd30e21594 Signed-off-by: Stephen Finucane <sfinucan@redhat.com> Closes-Bug: #1856312 (cherry picked from commit e3e2ba55eeeb86a9bc0624bb2592e46583e839e7) (cherry picked from commit 22c286c63b15b6f0acf6f696b98226a9257bf745) (cherry picked from commit 0a9c6c156a6eedf149528fd853f72a8ddd83e147)
-rw-r--r--oslo_config/cfg.py2
1 files changed, 1 insertions, 1 deletions
diff --git a/oslo_config/cfg.py b/oslo_config/cfg.py
index ca3f4d0..9994d04 100644
--- a/oslo_config/cfg.py
+++ b/oslo_config/cfg.py
@@ -3019,7 +3019,7 @@ class ConfigOpts(collections.Mapping):
logger.log(lvl, "%-30s = %s", opt_name,
_sanitize(opt, getattr(self, opt_name)))
- for group_name in self._groups:
+ for group_name in list(self._groups):
group_attr = self.GroupAttr(self, self._get_group(group_name))
for opt_name in sorted(self._groups[group_name]._opts):
opt = self._get_opt_info(opt_name, group_name)['opt']