diff options
author | Stephen Finucane <sfinucan@redhat.com> | 2019-12-13 16:18:33 +0000 |
---|---|---|
committer | Stephen Finucane <sfinucan@redhat.com> | 2019-12-13 16:18:33 +0000 |
commit | e3e2ba55eeeb86a9bc0624bb2592e46583e839e7 (patch) | |
tree | 50d8c554d15bb43b4acd22c9d5d6fab731b2b5de /oslo_config | |
parent | 6f5a925c3a90800088913f7adde52f7faa96ae51 (diff) | |
download | oslo-config-e3e2ba55eeeb86a9bc0624bb2592e46583e839e7.tar.gz |
Ensure option groups don't change during logging
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
Diffstat (limited to 'oslo_config')
-rw-r--r-- | oslo_config/cfg.py | 2 |
1 files changed, 1 insertions, 1 deletions
diff --git a/oslo_config/cfg.py b/oslo_config/cfg.py index ca3ae56..5dcb3f1 100644 --- a/oslo_config/cfg.py +++ b/oslo_config/cfg.py @@ -2576,7 +2576,7 @@ class ConfigOpts(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'] |