]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: Inventory: Fix `dictionary changed size during iteration`
authorSebastian Wagner <sewagner@redhat.com>
Fri, 26 Nov 2021 16:53:14 +0000 (17:53 +0100)
committerSebastian Wagner <sewagner@redhat.com>
Mon, 3 Jan 2022 13:59:54 +0000 (14:59 +0100)
Use `.copy()` for that.

Signed-off-by: Sebastian Wagner <sewagner@redhat.com>
(cherry picked from commit d770bb5c45d6f45c80543b6873c450922f3a13e5)

Conflicts:
src/pybind/mgr/cephadm/inventory.py

src/pybind/mgr/cephadm/inventory.py

index 0d820e13d7cef571baa33fa0a1d2f005e59d623c..8423f77ef2a2d99125f1e7f0176e26704db07d26 100644 (file)
@@ -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: