]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
qa: detect partial migrations during large config of dist epin
authorPatrick Donnelly <pdonnell@redhat.com>
Sat, 17 Feb 2024 15:26:14 +0000 (10:26 -0500)
committerPatrick Donnelly <pdonnell@redhat.com>
Wed, 20 Mar 2024 14:56:56 +0000 (10:56 -0400)
This method would wrongly "succeed" when looking for setup of distributed
ephemerally pinned directory fragments. If the migrator splits a subtree during
the course of migration (to reduce the migration size) then the operation may
not actually be complete.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
qa/tasks/cephfs/cephfs_test_case.py

index dea8a310e31b0f476db8147194fb3b0ce55d71e2..7334a597217353d3e0f41d79dc6c4a7b1b45e959 100644 (file)
@@ -339,6 +339,7 @@ class CephFSTestCase(CephTestCase):
                             subtrees = []
                             for r in self.fs.get_ranks(status=status):
                                 s = self.fs.rank_asok(["get", "subtrees"], status=status, rank=r['rank'])
+                                log.debug(f"{json.dumps(s, indent=2)}")
                                 s = filter(lambda s: s['auth_first'] == r['rank'] and s['auth_second'] == -2, s)
                                 subtrees += s
                         else:
@@ -384,11 +385,15 @@ class CephFSTestCase(CephTestCase):
             with contextutil.safe_while(sleep=5, tries=20) as proceed:
                 while proceed():
                     subtrees = self._get_subtrees(status=status, rank=rank, path=path)
-                    subtrees = list(filter(lambda s: s['distributed_ephemeral_pin'] == True and
-                                                     s['auth_first'] == s['export_pin_target'],
-                                           subtrees))
-                    log.info(f"len={len(subtrees)} {subtrees}")
+                    dist = list(filter(lambda s: s['distributed_ephemeral_pin'] == True and
+                                                 s['auth_first'] == s['export_pin_target'],
+                                       subtrees))
+                    log.info(f"len={len(dist)}\n{json.dumps(dist, indent=2)}")
+
                     if len(subtrees) >= count:
+                        if len(subtrees) > len(dist):
+                            # partial migration
+                            continue
                         return subtrees
         except contextutil.MaxWhileTries as e:
             raise RuntimeError("rank {0} failed to reach desired subtree state".format(rank)) from e