From 3012a8cb9cd7e3ac7fdaade0cac1d1a4463accf9 Mon Sep 17 00:00:00 2001 From: Sebastian Wagner Date: Fri, 26 Nov 2021 17:53:14 +0100 Subject: [PATCH] mgr/cephadm: Inventory: Fix `dictionary changed size during iteration` Use `.copy()` for that. Signed-off-by: Sebastian Wagner (cherry picked from commit d770bb5c45d6f45c80543b6873c450922f3a13e5) Conflicts: src/pybind/mgr/cephadm/inventory.py --- src/pybind/mgr/cephadm/inventory.py | 27 ++++++++------------------- 1 file changed, 8 insertions(+), 19 deletions(-) diff --git a/src/pybind/mgr/cephadm/inventory.py b/src/pybind/mgr/cephadm/inventory.py index 0d820e13d7cef..8423f77ef2a2d 100644 --- a/src/pybind/mgr/cephadm/inventory.py +++ b/src/pybind/mgr/cephadm/inventory.py @@ -718,16 +718,13 @@ class HostCache(): def get_hosts(self): # type: () -> List[str] - r = [] - for host, di in self.daemons.items(): - r.append(host) - return r + return list(self.daemons) def get_facts(self, host: str) -> Dict[str, Any]: return self.facts.get(host, {}) def _get_daemons(self) -> Iterator[orchestrator.DaemonDescription]: - for dm in self.daemons.values(): + for dm in self.daemons.copy().values(): yield from dm.values() def get_daemons(self): @@ -766,7 +763,7 @@ class HostCache(): dd.events = self.mgr.events.get_for_daemon(dd.name()) return dd - for host, dm in self.daemons.items(): + for host, dm in self.daemons.copy().items(): yield host, {name: alter(host, d) for name, d in dm.items()} def get_daemons_by_service(self, service_name): @@ -776,16 +773,12 @@ class HostCache(): return list(dd for dd in self._get_daemons() if dd.service_name() == service_name) - def get_daemons_by_type(self, service_type): - # type: (str) -> List[orchestrator.DaemonDescription] + def get_daemons_by_type(self, service_type: str, host: str = '') -> List[orchestrator.DaemonDescription]: assert service_type not in ['keepalived', 'haproxy'] - result = [] # type: List[orchestrator.DaemonDescription] - for host, dm in self.daemons.items(): - for name, d in dm.items(): - if d.daemon_type in service_to_daemon_types(service_type): - result.append(d) - return result + daemons = self.daemons[host].values() if host else self._get_daemons() + + return [d for d in daemons if d.daemon_type in service_to_daemon_types(service_type)] def get_daemon_types(self, hostname: str) -> List[str]: """Provide a list of the types of daemons on the host""" @@ -797,11 +790,7 @@ class HostCache(): def get_daemon_names(self): # type: () -> List[str] - r = [] - for host, dm in self.daemons.items(): - for name, dd in dm.items(): - r.append(name) - return r + return [d.name() for d in self._get_daemons()] def get_daemon_last_config_deps(self, host: str, name: str) -> Tuple[Optional[List[str]], Optional[datetime.datetime]]: if host in self.daemon_config_deps: -- 2.39.5