From 07c8ed9652c351ea32ef5bfa42c92e742ea7218b Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Tue, 2 Feb 2021 17:09:15 -0600 Subject: [PATCH] mgr/cephadm: only reapply osd spec if devices have changed This avoids a lot of useless work when the devices have not changed. Signed-off-by: Sage Weil (cherry picked from commit b129c1312113f56a227caeb535f656f5a090a85f) --- src/pybind/mgr/cephadm/inventory.py | 17 +++++++++++++++++ src/pybind/mgr/cephadm/services/osd.py | 7 +++++++ 2 files changed, 24 insertions(+) diff --git a/src/pybind/mgr/cephadm/inventory.py b/src/pybind/mgr/cephadm/inventory.py index 944d88c03fe2a..600fc64ac6c47 100644 --- a/src/pybind/mgr/cephadm/inventory.py +++ b/src/pybind/mgr/cephadm/inventory.py @@ -174,6 +174,9 @@ class SpecStore(): service_name, specs)) return specs + def get_created(self, spec: ServiceSpec) -> Optional[datetime.datetime]: + return self.spec_created.get(spec.service_name()) + class HostCache(): """ @@ -609,6 +612,20 @@ class HostCache(): # already up to date: return False + def osdspec_needs_apply(self, host: str, spec: ServiceSpec) -> bool: + if ( + host not in self.devices + or host not in self.last_device_change + or host not in self.last_device_update + or host not in self.osdspec_last_applied + or spec.service_name() not in self.osdspec_last_applied[host] + ): + return True + created = self.mgr.spec_store.get_created(spec) + if created and created > self.last_device_change[host]: + return True + return self.osdspec_last_applied[host][spec.service_name()] < self.last_device_change[host]; + def update_last_etc_ceph_ceph_conf(self, host: str) -> None: if not self.mgr.last_monmap: return diff --git a/src/pybind/mgr/cephadm/services/osd.py b/src/pybind/mgr/cephadm/services/osd.py index c9182b43d7507..8aa36d8479974 100644 --- a/src/pybind/mgr/cephadm/services/osd.py +++ b/src/pybind/mgr/cephadm/services/osd.py @@ -13,6 +13,7 @@ from datetime import datetime import orchestrator from cephadm.serve import CephadmServe from cephadm.utils import forall_hosts +from ceph.utils import datetime_now from orchestrator import OrchestratorError from mgr_module import MonCommandFailed @@ -36,6 +37,12 @@ class OSDService(CephService): @forall_hosts def create_from_spec_one(host: str, drive_selection: DriveSelection) -> Optional[str]: + # skip this host if there has been no change in inventory + if not self.mgr.cache.osdspec_needs_apply(host, drive_group): + self.mgr.log.debug("skipping apply of %s on %s (no change)" % ( + host, drive_group)) + return None + cmd = self.driveselection_to_ceph_volume(drive_selection, osd_id_claims.get(host, [])) if not cmd: -- 2.39.5