From: Sebastian Wagner Date: Tue, 5 Jan 2021 15:25:50 +0000 (+0100) Subject: mgr/cephadm: move _remove_daemon to serve.py X-Git-Tag: v17.0.0~90^2~5 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=402a20b4c3ea5d5722a47358d4b4099ed65bdd8c;p=ceph.git mgr/cephadm: move _remove_daemon to serve.py `_remove_daemon` can potentially make the CLI unresponsive and should only be called from the serve() thread. Signed-off-by: Sebastian Wagner --- diff --git a/src/pybind/mgr/cephadm/module.py b/src/pybind/mgr/cephadm/module.py index 9cb65d8b3bc8e..37cb9fd2da483 100644 --- a/src/pybind/mgr/cephadm/module.py +++ b/src/pybind/mgr/cephadm/module.py @@ -2027,34 +2027,7 @@ To check that the host is reachable: @forall_hosts def _remove_daemons(self, name: str, host: str) -> str: - return self._remove_daemon(name, host) - - def _remove_daemon(self, name: str, host: str) -> str: - """ - Remove a daemon - """ - (daemon_type, daemon_id) = name.split('.', 1) - daemon = orchestrator.DaemonDescription( - daemon_type=daemon_type, - daemon_id=daemon_id, - hostname=host) - - with set_exception_subject('service', daemon.service_id(), overwrite=True): - - self.cephadm_services[daemon_type_to_service(daemon_type)].pre_remove(daemon) - - args = ['--name', name, '--force'] - self.log.info('Removing daemon %s from %s' % (name, host)) - out, err, code = self._run_cephadm( - host, name, 'rm-daemon', args) - if not code: - # remove item from cache - self.cache.rm_daemon(host, name) - self.cache.invalidate_host_daemons(host) - - self.cephadm_services[daemon_type_to_service(daemon_type)].post_remove(daemon) - - return "Removed {} from host '{}'".format(name, host) + return CephadmServe(self)._remove_daemon(name, host) def _check_pool_exists(self, pool: str, service_name: str) -> None: logger.info(f'Checking pool "{pool}" exists for service {service_name}') diff --git a/src/pybind/mgr/cephadm/serve.py b/src/pybind/mgr/cephadm/serve.py index a258feeedbce4..20dc1c0325cfc 100644 --- a/src/pybind/mgr/cephadm/serve.py +++ b/src/pybind/mgr/cephadm/serve.py @@ -594,7 +594,7 @@ class CephadmServe: r = True # NOTE: we are passing the 'force' flag here, which means # we can delete a mon instances data. - self.mgr._remove_daemon(d.name(), d.hostname) + self._remove_daemon(d.name(), d.hostname) if r is None: r = False @@ -611,7 +611,7 @@ class CephadmServe: # (mon and mgr specs should always exist; osds aren't matched # to a service spec) self.log.info('Removing orphan daemon %s...' % dd.name()) - self.mgr._remove_daemon(dd.name(), dd.hostname) + self._remove_daemon(dd.name(), dd.hostname) # ignore unmanaged services if spec and spec.unmanaged: @@ -833,3 +833,30 @@ class CephadmServe: self.mgr.events.for_daemon( daemon_spec.name(), OrchestratorEvent.ERROR, f'Failed to {what}: {err}') return msg + + def _remove_daemon(self, name: str, host: str) -> str: + """ + Remove a daemon + """ + (daemon_type, daemon_id) = name.split('.', 1) + daemon = orchestrator.DaemonDescription( + daemon_type=daemon_type, + daemon_id=daemon_id, + hostname=host) + + with set_exception_subject('service', daemon.service_id(), overwrite=True): + + self.mgr.cephadm_services[daemon_type_to_service(daemon_type)].pre_remove(daemon) + + args = ['--name', name, '--force'] + self.log.info('Removing daemon %s from %s' % (name, host)) + out, err, code = self.mgr._run_cephadm( + host, name, 'rm-daemon', args) + if not code: + # remove item from cache + self.mgr.cache.rm_daemon(host, name) + self.mgr.cache.invalidate_host_daemons(host) + + self.mgr.cephadm_services[daemon_type_to_service(daemon_type)].post_remove(daemon) + + return "Removed {} from host '{}'".format(name, host) diff --git a/src/pybind/mgr/cephadm/services/osd.py b/src/pybind/mgr/cephadm/services/osd.py index 8bbec38d582f3..70364cc504808 100644 --- a/src/pybind/mgr/cephadm/services/osd.py +++ b/src/pybind/mgr/cephadm/services/osd.py @@ -360,7 +360,7 @@ class RemoveUtil(object): continue assert osd.fullname is not None assert osd.hostname is not None - self.mgr._remove_daemon(osd.fullname, osd.hostname) + CephadmServe(self.mgr)._remove_daemon(osd.fullname, osd.hostname) logger.info(f"Successfully removed OSD <{osd.osd_id}> on {osd.hostname}") logger.debug(f"Removing {osd.osd_id} from the queue.")