]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
cephadm: fence old ranks for SMB service
authorAvan Thakkar <athakkar@redhat.com>
Fri, 20 Dec 2024 16:02:40 +0000 (21:32 +0530)
committerAvan Thakkar <athakkar@redhat.com>
Wed, 12 Feb 2025 19:49:21 +0000 (01:19 +0530)
Implemented functionality to fence old SMB service ranks,
ensuring the rank map reflects the correct state of all nodes in the cluster.

Fixes: https://tracker.ceph.com/issues/68512
Signed-off-by: Avan Thakkar <athakkar@redhat.com>
src/pybind/mgr/cephadm/services/smb.py

index 4382736042f066043dac3109b60d77e4276a5b52..6651af55da88ccff53247068ff8cec9e9568a75c 100644 (file)
@@ -33,15 +33,37 @@ class SMBService(CephService):
         smb_spec = cast(SMBSpec, spec)
         return 'clustered' in smb_spec.features
 
+    def fence(self, daemon_id: str) -> None:
+        logger.info(f'Fencing old smb.{daemon_id}')
+        ret, out, err = self.mgr.mon_command({
+            'prefix': 'auth rm',
+            'entity': f'client.smb.fs.cluster.{daemon_id}',
+        })
+
     def fence_old_ranks(
         self,
         spec: ServiceSpec,
         rank_map: Dict[int, Dict[int, Optional[str]]],
         num_ranks: int,
     ) -> None:
-        logger.warning(
-            'fence_old_ranks: Unsupported %r %r', rank_map, num_ranks
-        )
+        smb_spec = cast(SMBSpec, spec)
+        for rank, m in list(rank_map.items()):
+            if rank >= num_ranks:
+                for daemon_id in m.values():
+                    if daemon_id is not None:
+                        logger.info(f'Fencing old smb.{smb_spec.cluster_id}')
+                        self.fence(smb_spec.cluster_id)
+                del rank_map[rank]
+                self.mgr.spec_store.save_rank_map(spec.service_name(), rank_map)
+            else:
+                max_gen = max(m.keys())
+                for gen, daemon_id in list(m.items()):
+                    if gen < max_gen:
+                        if daemon_id is not None:
+                            logger.info(f'Fencing old smb.{smb_spec.cluster_id}')
+                            self.fence(smb_spec.cluster_id)
+                        del rank_map[rank][gen]
+                        self.mgr.spec_store.save_rank_map(spec.service_name(), rank_map)
 
     def prepare_create(
         self, daemon_spec: CephadmDaemonDeploySpec