From: Sage Weil Date: Tue, 20 Apr 2021 14:08:56 +0000 (-0400) Subject: mgr/cephadm: do not place osds on _no_schedule hosts X-Git-Tag: v16.2.5~39^2~4^2^2~32 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=9cf3e25763cadbfdc2a71f31f2813a2d6a2c37c5;p=ceph.git mgr/cephadm: do not place osds on _no_schedule hosts Signed-off-by: Sage Weil (cherry picked from commit f5cee666d2277fcf06c15930dc00617b86aa0c0e) --- diff --git a/src/pybind/mgr/cephadm/inventory.py b/src/pybind/mgr/cephadm/inventory.py index 11ed505b334d9..df9381a3dcdf9 100644 --- a/src/pybind/mgr/cephadm/inventory.py +++ b/src/pybind/mgr/cephadm/inventory.py @@ -82,6 +82,12 @@ class Inventory: self._inventory[host]['labels'].remove(label) self.save() + def has_label(self, host: str, label: str) -> bool: + return ( + host in self._inventory + and label in self._inventory[host].get('labels', []) + ) + def get_addr(self, host: str) -> str: self.assert_host(host) return self._inventory[host].get('addr', host) diff --git a/src/pybind/mgr/cephadm/services/osd.py b/src/pybind/mgr/cephadm/services/osd.py index b776a88f45473..73e0bd591aca4 100644 --- a/src/pybind/mgr/cephadm/services/osd.py +++ b/src/pybind/mgr/cephadm/services/osd.py @@ -42,6 +42,9 @@ class OSDService(CephService): self.mgr.log.debug("skipping apply of %s on %s (no change)" % ( host, drive_group)) return None + # skip this host if we cannot schedule here + if self.mgr.inventory.has_label(host, '_no_schedule'): + return None cmd = self.driveselection_to_ceph_volume(drive_selection, osd_id_claims.get(host, [])) @@ -144,7 +147,7 @@ class OSDService(CephService): def prepare_drivegroup(self, drive_group: DriveGroupSpec) -> List[Tuple[str, DriveSelection]]: # 1) use fn_filter to determine matching_hosts matching_hosts = drive_group.placement.filter_matching_hostspecs( - self.mgr.inventory.all_specs()) + self.mgr._schedulable_hosts()) # 2) Map the inventory to the InventoryHost object host_ds_map = [] @@ -253,7 +256,7 @@ class OSDService(CephService): if not osdspecs: self.mgr.log.debug("No OSDSpecs found") return [] - return sum([spec.placement.filter_matching_hostspecs(self.mgr.inventory.all_specs()) for spec in osdspecs], []) + return sum([spec.placement.filter_matching_hostspecs(self.mgr._schedulable_hosts()) for spec in osdspecs], []) def resolve_osdspecs_for_host(self, host: str, specs: Optional[List[DriveGroupSpec]] = None) -> List[DriveGroupSpec]: @@ -263,7 +266,7 @@ class OSDService(CephService): specs = [cast(DriveGroupSpec, spec) for (sn, spec) in self.mgr.spec_store.spec_preview.items() if spec.service_type == 'osd'] for spec in specs: - if host in spec.placement.filter_matching_hostspecs(self.mgr.inventory.all_specs()): + if host in spec.placement.filter_matching_hostspecs(self.mgr._schedulable_hosts()): self.mgr.log.debug(f"Found OSDSpecs for host: <{host}> -> <{spec}>") matching_specs.append(spec) return matching_specs