]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mgr/cephadm: allow mgr colo if mgr_standby_modules=false
authorSage Weil <sage@newdream.net>
Mon, 12 Apr 2021 14:17:17 +0000 (10:17 -0400)
committerSage Weil <sage@newdream.net>
Fri, 16 Apr 2021 20:00:31 +0000 (16:00 -0400)
If the standby mgr daemons' modules aren't listening on any ports, then we
can schedule multiple on the same host.

Note that this may make 'orch ps' output misleading, as ports will be
reported for each mgr instance, but only one of them will actually be
listening at any one time (if they are behaving, at least!).  Treat a
mgr port check error as non-fatal.

Signed-off-by: Sage Weil <sage@newdream.net>
src/cephadm/cephadm
src/pybind/mgr/cephadm/services/cephadmservice.py

index c7f2b6104339f764e0d0e2e582f7a11415e75553..09d1dce846e1a604f3e9c26ca23897114a63b7c7 100755 (executable)
@@ -2540,7 +2540,14 @@ def deploy_daemon(ctx, fsid, daemon_type, daemon_id, c, uid, gid,
 
     ports = ports or []
     if any([port_in_use(ctx, port) for port in ports]):
-        raise Error("TCP Port(s) '{}' required for {} already in use".format(','.join(map(str, ports)), daemon_type))
+        if daemon_type == 'mgr':
+            # non-fatal for mgr when we are in mgr_standby_modules=false, but we can't
+            # tell whether that is the case here.
+            logger.warning(
+                f"ceph-mgr TCP port(s) {','.join(map(str, ports))} already in use"
+            )
+        else:
+            raise Error("TCP Port(s) '{}' required for {} already in use".format(','.join(map(str, ports)), daemon_type))
 
     data_dir = get_data_dir(fsid, ctx.data_dir, daemon_type, daemon_id)
     if reconfig and not os.path.exists(data_dir):
index f5ec2d908c42b51509f093ffd88e7f0c2e904b9b..12afdfbcd34637db0d6a11ed9123567cd7f4d591 100644 (file)
@@ -551,6 +551,18 @@ class MonService(CephService):
 class MgrService(CephService):
     TYPE = 'mgr'
 
+    def allow_colo(self) -> bool:
+        if self.mgr.get_ceph_option('mgr_standby_modules'):
+            # traditional mgr mode: standby daemons' modules listen on
+            # ports and redirect to the primary.  we must not schedule
+            # multiple mgrs on the same host or else ports will
+            # conflict.
+            return False
+        else:
+            # standby daemons do nothing, and therefore port conflicts
+            # are not a concern.
+            return True
+
     def prepare_create(self, daemon_spec: CephadmDaemonDeploySpec) -> CephadmDaemonDeploySpec:
         """
         Create a new manager instance on a host.