From: Sebastian Wagner Date: Fri, 8 Jan 2021 11:06:10 +0000 (+0100) Subject: mgr/cephadm: make OSDRemovalQueue not inherent from set X-Git-Tag: v15.2.9~53^2~4 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=16b213f591155bed03cf47b934702df02549bf67;p=ceph.git mgr/cephadm: make OSDRemovalQueue not inherent from set Instead, let's make it a member. Signed-off-by: Sebastian Wagner (cherry picked from commit 086afa9a69cb99258abfab270420b4968d7c3717) --- diff --git a/src/pybind/mgr/cephadm/services/osd.py b/src/pybind/mgr/cephadm/services/osd.py index 2f26a095b222..15f3bd04cb76 100644 --- a/src/pybind/mgr/cephadm/services/osd.py +++ b/src/pybind/mgr/cephadm/services/osd.py @@ -325,8 +325,8 @@ class RemoveUtil(object): # Check all osds for their state and take action (remove, purge etc) to_remove_osds = self.mgr.to_remove_osds.all_osds() - new_queue = set() - for osd in to_remove_osds: + new_queue: Set[OSD] = set() + for osd in to_remove_osds: # type: OSD if not osd.force: # skip criteria if not osd.is_empty: @@ -491,7 +491,8 @@ class RemoveUtil(object): for osd in json.loads(v): logger.debug(f"Loading osd ->{osd} from store") osd_obj = OSD.from_json(osd, ctx=self) - self.mgr.to_remove_osds.add(osd_obj) + if osd_obj is not None: + self.mgr.to_remove_osds.add(osd_obj) class NotFoundError(Exception): @@ -549,7 +550,7 @@ class OSD: self.fullname = fullname # mgr obj to make mgr/mon calls - self.rm_util = remove_util + self.rm_util: RemoveUtil = remove_util def start(self) -> None: if self.started: @@ -675,36 +676,36 @@ class OSD: return f"(osd_id={self.osd_id}, draining={self.draining})" -class OSDRemovalQueue(Set): +class OSDRemovalQueue(object): def __init__(self) -> None: - super().__init__() + self.osds: Set[OSD] = set() def as_osd_ids(self) -> List[int]: - return [osd.osd_id for osd in self] + return [osd.osd_id for osd in self.osds] def queue_size(self) -> int: - return len(self) + return len(self.osds) def draining_osds(self) -> List["OSD"]: - return [osd for osd in self if osd.is_draining] + return [osd for osd in self.osds if osd.is_draining] def idling_osds(self) -> List["OSD"]: - return [osd for osd in self if not osd.is_draining and not osd.is_empty] + return [osd for osd in self.osds if not osd.is_draining and not osd.is_empty] def empty_osds(self) -> List["OSD"]: - return [osd for osd in self if osd.is_empty] + return [osd for osd in self.osds if osd.is_empty] def all_osds(self) -> List["OSD"]: - return [osd for osd in self] + return [osd for osd in self.osds] def not_in_cluster(self) -> List["OSD"]: - return [osd for osd in self if not osd.exists] + return [osd for osd in self.osds if not osd.exists] def enqueue(self, osd: "OSD") -> None: if not osd.exists: raise NotFoundError() - self.add(osd) + self.osds.add(osd) osd.start() def rm(self, osd: "OSD") -> None: @@ -713,7 +714,21 @@ class OSDRemovalQueue(Set): osd.stop() try: logger.debug(f'Removing {osd} from the queue.') - self.remove(osd) + self.osds.remove(osd) except KeyError: logger.debug(f"Could not find {osd} in queue.") raise KeyError + + def remove(self, osd: OSD) -> None: + self.osds.remove(osd) + + def add(self, osd: OSD) -> None: + self.osds.add(osd) + + def intersection_update(self, other: Set[OSD]) -> None: + self.osds.intersection_update(other) + + def __eq__(self, other: Any) -> bool: + if not isinstance(other, OSDRemovalQueue): + return False + return self.osds == other.osds diff --git a/src/pybind/mgr/cephadm/tests/test_osd_removal.py b/src/pybind/mgr/cephadm/tests/test_osd_removal.py index 5ac4209ccff0..76f067bb55a4 100644 --- a/src/pybind/mgr/cephadm/tests/test_osd_removal.py +++ b/src/pybind/mgr/cephadm/tests/test_osd_removal.py @@ -73,7 +73,7 @@ class TestOSDRemoval: rm_util._run_mon_cmd.assert_called_with( {'prefix': 'osd purge-actual', 'id': 1, 'yes_i_really_mean_it': True}) - def test_load(self, cephadm_module): + def test_load(self, cephadm_module, rm_util): data = json.dumps([ { "osd_id": 35, @@ -92,8 +92,9 @@ class TestOSDRemoval: cephadm_module.set_store('osd_remove_queue', data) cephadm_module.rm_util.load_from_store() - assert repr( - cephadm_module.to_remove_osds) == 'OSDRemovalQueue({(osd_id=35, draining=True)})' + expected = OSDRemovalQueue() + expected.add(OSD(osd_id=35, remove_util=rm_util, draining=True)) + assert cephadm_module.to_remove_osds == expected class TestOSD: