From ec1c20622eadae2036d47ffb82b90971c328b691 Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Fri, 19 Jun 2020 13:52:22 -0700 Subject: [PATCH] qa: adapt tests for empty pinned dir export Previously, empty pinned directories were not migrated. Signed-off-by: Patrick Donnelly (cherry picked from commit 69e3f556a73f20ce099d3cf41fd839761ef5198b) --- qa/tasks/cephfs/test_journal_repair.py | 25 ++---------- qa/tasks/cephfs/test_sessionmap.py | 5 +-- qa/tasks/cephfs/test_snapshots.py | 21 ++++------ qa/tasks/cephfs/test_strays.py | 56 +++++++------------------- 4 files changed, 29 insertions(+), 78 deletions(-) diff --git a/qa/tasks/cephfs/test_journal_repair.py b/qa/tasks/cephfs/test_journal_repair.py index 61037b96d7320..b810e1a28eff8 100644 --- a/qa/tasks/cephfs/test_journal_repair.py +++ b/qa/tasks/cephfs/test_journal_repair.py @@ -159,11 +159,8 @@ class TestJournalRepair(CephFSTestCase): # Set max_mds to 2 self.fs.set_max_mds(2) - - # See that we have two active MDSs - self.wait_until_equal(lambda: len(self.fs.get_active_names()), 2, 30, - reject_fn=lambda v: v > 2 or v < 1) - active_mds_names = self.fs.get_active_names() + status = self.fs.wait_for_daemons() + active_mds_names = self.fs.get_active_names(status=status) # Switch off any unneeded MDS daemons for unneeded_mds in set(self.mds_cluster.mds_ids) - set(active_mds_names): @@ -171,27 +168,13 @@ class TestJournalRepair(CephFSTestCase): self.mds_cluster.mds_fail(unneeded_mds) # Create a dir on each rank - self.mount_a.run_shell(["mkdir", "alpha"]) - self.mount_a.run_shell(["mkdir", "bravo"]) + self.mount_a.run_shell_payload("mkdir {alpha,bravo} && touch {alpha,bravo}/file") self.mount_a.setfattr("alpha/", "ceph.dir.pin", "0") self.mount_a.setfattr("bravo/", "ceph.dir.pin", "1") - def subtrees_assigned(): - got_subtrees = self.fs.mds_asok(["get", "subtrees"], mds_id=active_mds_names[0]) - - for s in got_subtrees: - if s['dir']['path'] == '/bravo': - if s['auth_first'] == 1: - return True - else: - # Should not happen - raise RuntimeError("/bravo is subtree but not rank 1!") - - return False - # Ensure the pinning has taken effect and the /bravo dir is now # migrated to rank 1. - self.wait_until_true(subtrees_assigned, 30) + self._wait_subtrees([('/bravo', 1), ('/alpha', 0)], rank=0, status=status) # Do some IO (this should be split across ranks according to # the rank-pinned dirs) diff --git a/qa/tasks/cephfs/test_sessionmap.py b/qa/tasks/cephfs/test_sessionmap.py index eedbe38d9e8ea..87e789770b50a 100644 --- a/qa/tasks/cephfs/test_sessionmap.py +++ b/qa/tasks/cephfs/test_sessionmap.py @@ -196,10 +196,9 @@ class TestSessionMap(CephFSTestCase): self.skipTest("Requires FUSE client to use is_blacklisted()") self.fs.set_max_mds(2) - self.fs.wait_for_daemons() - status = self.fs.status() + status = self.fs.wait_for_daemons() - self.mount_a.run_shell(["mkdir", "d0", "d1"]) + self.mount_a.run_shell_payload("mkdir {d0,d1} && touch {d0,d1}/file") self.mount_a.setfattr("d0", "ceph.dir.pin", "0") self.mount_a.setfattr("d1", "ceph.dir.pin", "1") self._wait_subtrees([('/d0', 0), ('/d1', 1)], status=status) diff --git a/qa/tasks/cephfs/test_snapshots.py b/qa/tasks/cephfs/test_snapshots.py index 0a35d99d4d636..40a09f3a8db2b 100644 --- a/qa/tasks/cephfs/test_snapshots.py +++ b/qa/tasks/cephfs/test_snapshots.py @@ -55,7 +55,7 @@ class TestSnapshots(CephFSTestCase): # setup subtrees self.mount_a.run_shell(["mkdir", "-p", "d1/dir"]) self.mount_a.setfattr("d1", "ceph.dir.pin", "1") - self.wait_until_true(lambda: self._check_subtree(1, '/d1', status=status), timeout=30) + self._wait_subtrees([("/d1", 1)], rank=1, path="/d1") last_created = self._get_last_created_snap(rank=0,status=status) @@ -231,9 +231,7 @@ class TestSnapshots(CephFSTestCase): self.mount_a.setfattr("d0", "ceph.dir.pin", "0") self.mount_a.setfattr("d0/d1", "ceph.dir.pin", "1") self.mount_a.setfattr("d0/d2", "ceph.dir.pin", "2") - self.wait_until_true(lambda: self._check_subtree(2, '/d0/d2', status=status), timeout=30) - self.wait_until_true(lambda: self._check_subtree(1, '/d0/d1', status=status), timeout=5) - self.wait_until_true(lambda: self._check_subtree(0, '/d0', status=status), timeout=5) + self._wait_subtrees([("/d0", 0), ("/d0/d1", 1), ("/d0/d2", 2)], rank="all", status=status, path="/d0") def _check_snapclient_cache(snaps_dump, cache_dump=None, rank=0): if cache_dump is None: @@ -354,11 +352,10 @@ class TestSnapshots(CephFSTestCase): self.fs.set_max_mds(2) status = self.fs.wait_for_daemons() - self.mount_a.run_shell(["mkdir", "-p", "d0/d1"]) + self.mount_a.run_shell(["mkdir", "-p", "d0/d1/empty"]) self.mount_a.setfattr("d0", "ceph.dir.pin", "0") self.mount_a.setfattr("d0/d1", "ceph.dir.pin", "1") - self.wait_until_true(lambda: self._check_subtree(1, '/d0/d1', status=status), timeout=30) - self.wait_until_true(lambda: self._check_subtree(0, '/d0', status=status), timeout=5) + self._wait_subtrees([("/d0", 0), ("/d0/d1", 1)], rank="all", status=status, path="/d0") self.mount_a.write_test_pattern("d0/d1/file_a", 8 * 1024 * 1024) self.mount_a.run_shell(["mkdir", "d0/.snap/s1"]) @@ -376,11 +373,10 @@ class TestSnapshots(CephFSTestCase): self.fs.set_max_mds(2) status = self.fs.wait_for_daemons() - self.mount_a.run_shell(["mkdir", "d0", "d1"]) + self.mount_a.run_shell_payload("mkdir -p {d0,d1}/empty") self.mount_a.setfattr("d0", "ceph.dir.pin", "0") self.mount_a.setfattr("d1", "ceph.dir.pin", "1") - self.wait_until_true(lambda: self._check_subtree(1, '/d1', status=status), timeout=30) - self.wait_until_true(lambda: self._check_subtree(0, '/d0', status=status), timeout=5) + self._wait_subtrees([("/d0", 0), ("/d1", 1)], rank=0, status=status) self.mount_a.run_shell(["mkdir", "d0/d3"]) self.mount_a.run_shell(["mkdir", "d0/.snap/s1"]) @@ -404,12 +400,11 @@ class TestSnapshots(CephFSTestCase): self.fs.set_max_mds(2) status = self.fs.wait_for_daemons() - self.mount_a.run_shell(["mkdir", "d0", "d1"]) + self.mount_a.run_shell_payload("mkdir -p {d0,d1}/empty") self.mount_a.setfattr("d0", "ceph.dir.pin", "0") self.mount_a.setfattr("d1", "ceph.dir.pin", "1") - self.wait_until_true(lambda: self._check_subtree(1, '/d1', status=status), timeout=30) - self.wait_until_true(lambda: self._check_subtree(0, '/d0', status=status), timeout=5) + self._wait_subtrees([("/d0", 0), ("/d1", 1)], rank=0, status=status) self.mount_a.run_python(dedent(""" import os diff --git a/qa/tasks/cephfs/test_strays.py b/qa/tasks/cephfs/test_strays.py index a5058441e7cad..f5c3cc2a1d7a7 100644 --- a/qa/tasks/cephfs/test_strays.py +++ b/qa/tasks/cephfs/test_strays.py @@ -517,34 +517,16 @@ class TestStrays(CephFSTestCase): return rank_0_id, rank_1_id - def _force_migrate(self, to_id, path, watch_ino): + def _force_migrate(self, path, rank=1): """ :param to_id: MDS id to move it to :param path: Filesystem path (string) to move :param watch_ino: Inode number to look for at destination to confirm move :return: None """ - self.mount_a.run_shell(["setfattr", "-n", "ceph.dir.pin", "-v", "1", path]) - - # Poll the MDS cache dump to watch for the export completing - migrated = False - migrate_timeout = 60 - migrate_elapsed = 0 - while not migrated: - data = self.fs.mds_asok(["dump", "cache"], to_id) - for inode_data in data: - if inode_data['ino'] == watch_ino: - log.debug("Found ino in cache: {0}".format(json.dumps(inode_data, indent=2))) - if inode_data['is_auth'] is True: - migrated = True - break - - if not migrated: - if migrate_elapsed > migrate_timeout: - raise RuntimeError("Migration hasn't happened after {0}s!".format(migrate_elapsed)) - else: - migrate_elapsed += 1 - time.sleep(1) + self.mount_a.run_shell(["setfattr", "-n", "ceph.dir.pin", "-v", str(rank), path]) + rpath = "/"+path + self._wait_subtrees([(rpath, rank)], rank=rank, path=rpath) def _is_stopped(self, rank): mds_map = self.fs.get_mds_map() @@ -565,8 +547,7 @@ class TestStrays(CephFSTestCase): self.mount_a.create_n_files("delete_me/file", file_count) - self._force_migrate(rank_1_id, "delete_me", - self.mount_a.path_to_ino("delete_me/file_0")) + self._force_migrate("delete_me") self.mount_a.run_shell(["rm", "-rf", Raw("delete_me/*")]) self.mount_a.umount_wait() @@ -610,26 +591,21 @@ class TestStrays(CephFSTestCase): # Create a non-purgeable stray in a ~mds1 stray directory # by doing a hard link and deleting the original file - self.mount_a.run_shell(["mkdir", "dir_1", "dir_2"]) - self.mount_a.run_shell(["touch", "dir_1/original"]) - self.mount_a.run_shell(["ln", "dir_1/original", "dir_2/linkto"]) + self.mount_a.run_shell_payload(""" +mkdir dir_1 dir_2 +touch dir_1/original +ln dir_1/original dir_2/linkto +""") - self._force_migrate(rank_1_id, "dir_1", - self.mount_a.path_to_ino("dir_1/original")) + self._force_migrate("dir_1") + self._force_migrate("dir_2", rank=0) # empty mds cache. otherwise mds reintegrates stray when unlink finishes self.mount_a.umount_wait() - self.fs.mds_asok(['flush', 'journal'], rank_0_id) self.fs.mds_asok(['flush', 'journal'], rank_1_id) - self.fs.mds_fail_restart() - self.fs.wait_for_daemons() - - active_mds_names = self.fs.get_active_names() - rank_0_id = active_mds_names[0] - rank_1_id = active_mds_names[1] + self.fs.mds_asok(['cache', 'drop'], rank_1_id) self.mount_a.mount_wait() - self.mount_a.run_shell(["rm", "-f", "dir_1/original"]) self.mount_a.umount_wait() @@ -638,7 +614,7 @@ class TestStrays(CephFSTestCase): # Shut down rank 1 self.fs.set_max_mds(1) - self.fs.wait_for_daemons(timeout=120) + status = self.fs.wait_for_daemons(timeout=120) # See that the stray counter on rank 0 has incremented self.assertEqual(self.get_mdc_stat("strays_created", rank_0_id), 1) @@ -955,8 +931,7 @@ class TestStrays(CephFSTestCase): self.mount_a.create_n_files("delete_me/file", file_count) - self._force_migrate(rank_1_id, "delete_me", - self.mount_a.path_to_ino("delete_me/file_0")) + self._force_migrate("delete_me") begin = datetime.datetime.now() self.mount_a.run_shell(["rm", "-rf", Raw("delete_me/*")]) @@ -969,4 +944,3 @@ class TestStrays(CephFSTestCase): duration = (end - begin).total_seconds() self.assertLess(duration, (file_count * tick_period) * 0.25) - -- 2.39.5