From 9498b5f77b7c7c32bf3bc0f08617d39b047c4132 Mon Sep 17 00:00:00 2001 From: Joshua Schmid Date: Fri, 15 May 2020 11:32:03 +0200 Subject: [PATCH] mgr/cephadm: add preview caching to inventory.py Signed-off-by: Joshua Schmid --- src/pybind/mgr/cephadm/inventory.py | 43 ++++++++++++++++++++++++++++- 1 file changed, 42 insertions(+), 1 deletion(-) diff --git a/src/pybind/mgr/cephadm/inventory.py b/src/pybind/mgr/cephadm/inventory.py index 3cfe74f41cb1d..d4e6dc797b59b 100644 --- a/src/pybind/mgr/cephadm/inventory.py +++ b/src/pybind/mgr/cephadm/inventory.py @@ -163,12 +163,15 @@ class HostCache(): self.daemons = {} # type: Dict[str, Dict[str, orchestrator.DaemonDescription]] self.last_daemon_update = {} # type: Dict[str, datetime.datetime] self.devices = {} # type: Dict[str, List[inventory.Device]] + self.osdspec_previews = {} # type: Dict[str, List[Dict[str, Any]]] self.networks = {} # type: Dict[str, Dict[str, List[str]]] self.last_device_update = {} # type: Dict[str, datetime.datetime] self.daemon_refresh_queue = [] # type: List[str] self.device_refresh_queue = [] # type: List[str] + self.osdspec_previews_refresh_queue = [] # type: List[str] self.daemon_config_deps = {} # type: Dict[str, Dict[str, Dict[str,Any]]] self.last_host_check = {} # type: Dict[str, datetime.datetime] + self.loading_osdspec_preview = {} # type: Dict[str, bool] def load(self): # type: () -> None @@ -189,6 +192,8 @@ class HostCache(): # and always trigger a new scrape on mgr restart. self.daemon_refresh_queue.append(host) self.daemons[host] = {} + self.osdspec_previews[host] = [] + self.loading_osdspec_preview[host] = False self.devices[host] = [] self.networks[host] = {} self.daemon_config_deps[host] = {} @@ -198,6 +203,8 @@ class HostCache(): for d in j.get('devices', []): self.devices[host].append(inventory.Device.from_json(d)) self.networks[host] = j.get('networks', {}) + self.osdspec_previews[host] = j.get('osdspec_previews', []) + for name, d in j.get('daemon_config_deps', {}).items(): self.daemon_config_deps[host][name] = { 'deps': d.get('deps', []), @@ -217,6 +224,19 @@ class HostCache(): host, e)) pass + def update_osdspec_previews(self, search_host: str = ''): + # Set global 'pending' flag for host + self.loading_osdspec_preview[search_host] = True + previews = [] + # query OSDSpecs for host and generate/get the preview + for preview in self.mgr.osd_service.get_previews(search_host): + # There can be multiple previews for one host due to multiple OSDSpecs. + previews.append(preview) + self.mgr.log.debug(f"Loading OSDSpec previews to HostCache") + self.osdspec_previews[search_host] = previews + # Unset global 'pending' flag for host + self.loading_osdspec_preview[search_host] = False + def update_host_daemons(self, host, dm): # type: (str, Dict[str, orchestrator.DaemonDescription]) -> None self.daemons[host] = dm @@ -246,9 +266,11 @@ class HostCache(): self.daemons[host] = {} self.devices[host] = [] self.networks[host] = {} + self.osdspec_previews[host] = [] self.daemon_config_deps[host] = {} self.daemon_refresh_queue.append(host) self.device_refresh_queue.append(host) + self.osdspec_previews_refresh_queue.append(host) def invalidate_host_daemons(self, host): # type: (str) -> None @@ -269,6 +291,7 @@ class HostCache(): j = { # type: ignore 'daemons': {}, 'devices': [], + 'osdspec_previews': [], 'daemon_config_deps': {}, } if host in self.last_daemon_update: @@ -285,8 +308,11 @@ class HostCache(): 'deps': depi.get('deps', []), 'last_config': depi['last_config'].strftime(DATEFMT), } + if self.osdspec_previews[host]: + j['osdspec_previews'] = self.osdspec_previews[host] + if host in self.last_host_check: - j['last_host_check']= self.last_host_check[host].strftime(DATEFMT) + j['last_host_check'] = self.last_host_check[host].strftime(DATEFMT) self.mgr.set_store(HOST_CACHE_PREFIX + host, json.dumps(j)) def rm_host(self, host): @@ -295,6 +321,10 @@ class HostCache(): del self.daemons[host] if host in self.devices: del self.devices[host] + if host in self.osdspec_previews: + del self.osdspec_previews[host] + if host in self.loading_osdspec_preview: + del self.loading_osdspec_preview[host] if host in self.networks: del self.networks[host] if host in self.last_daemon_update: @@ -384,6 +414,17 @@ class HostCache(): return True return False + def host_needs_osdspec_preview_refresh(self, host): + if host in self.mgr.offline_hosts: + logger.debug(f'Host "{host}" marked as offline. Skipping osdspec preview refresh') + return False + if host in self.osdspec_previews_refresh_queue: + self.osdspec_previews_refresh_queue.remove(host) + return True + # Since this is dependent on other factors (device and spec) this does not need + # to be updated periodically. + return False + def host_needs_check(self, host): # type: (str) -> bool cutoff = datetime.datetime.utcnow() - datetime.timedelta( -- 2.39.5