From a2b7587e04651fd6e3409c421ee9c6cbaa020479 Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 17 Mar 2021 15:39:15 -0400 Subject: [PATCH] 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 --- src/pybind/mgr/cephadm/serve.py | 17 +++++++++++++++++ 1 file changed, 17 insertions(+) diff --git a/src/pybind/mgr/cephadm/serve.py b/src/pybind/mgr/cephadm/serve.py index c442f3092a4..0e986007f70 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, -- 2.39.5