From: Sage Weil Date: Wed, 17 Mar 2021 19:39:15 +0000 (-0400) Subject: mgr/cephadm: stop conflicting daemon when deploying to a specific port X-Git-Tag: v17.1.0~2562^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a2b7587e04651fd6e3409c421ee9c6cbaa020479;p=ceph.git mgr/cephadm: stop conflicting daemon when deploying to a specific port If we are deploying a daemon to bind to a specific port and there is an existing daemon we are removing that also binds to that port, stop it first. Unless we are both binding to different IPs. This resolves the case where daemons bind to * and we redeploy with a subnet to bind to. It would eventually converge before, but would throw a bind error in the process and take longer. Signed-off-by: Sage Weil --- diff --git a/src/pybind/mgr/cephadm/serve.py b/src/pybind/mgr/cephadm/serve.py index c442f3092a42..0e986007f70b 100644 --- a/src/pybind/mgr/cephadm/serve.py +++ b/src/pybind/mgr/cephadm/serve.py @@ -588,6 +588,23 @@ class CephadmServe: for slot in slots_to_add: for daemon_type in service_to_daemon_types(service_type): + # first remove daemon on conflicting port? + if slot.port: + for d in daemons_to_remove: + if d.hostname != slot.hostname or d.ports != [slot.port]: + continue + if d.ip and slot.ip and d.ip != slot.ip: + continue + self.log.info( + f'Removing {d.name()} before deploying to {slot} to avoid a port conflict' + ) + # NOTE: we don't check ok-to-stop here to avoid starvation if + # there is only 1 gateway. + self._remove_daemon(d.name(), d.hostname) + daemons_to_remove.remove(d) + break + + # deploy new daemon daemon_id = self.mgr.get_unique_name( daemon_type, slot.hostname,