From 0781f7407117387c700ab2d0fca2bb0e57e4b899 Mon Sep 17 00:00:00 2001 From: Christopher Hoffman Date: Wed, 20 Sep 2023 16:31:51 +0000 Subject: [PATCH] qa: add split/merge dirfrag tests for scrub Signed-off-by: Christopher Hoffman (cherry picked from commit 18ec6e5ed9127a14aad174c7a5873b28df78bf74) --- qa/tasks/cephfs/test_scrub_checks.py | 82 ++++++++++++++++++++++++++++ 1 file changed, 82 insertions(+) diff --git a/qa/tasks/cephfs/test_scrub_checks.py b/qa/tasks/cephfs/test_scrub_checks.py index f17a6ceb115..a33bc0111ae 100644 --- a/qa/tasks/cephfs/test_scrub_checks.py +++ b/qa/tasks/cephfs/test_scrub_checks.py @@ -199,6 +199,8 @@ class TestScrubChecks(CephFSTestCase): MDSS_REQUIRED = 1 CLIENTS_REQUIRED = 1 + def get_dsplits(self, dir_ino): + return self.fs.rank_asok(['dump', 'inode', str(dir_ino)])['dirfragtree']['splits'] def test_scrub_checks(self): self._checks(0) @@ -362,6 +364,86 @@ class TestScrubChecks(CephFSTestCase): # fragstat should be fixed self.mount_a.run_shell(["rmdir", test_dir]) + def test_scrub_merge_dirfrags(self): + """ + That a directory is merged during scrub. + """ + + test_path = "testdir" + abs_test_path = f"/{test_path}" + split_size = 20 + merge_size = 5 + split_bits = 1 + self.config_set('mds', 'mds_bal_split_size', split_size) + self.config_set('mds', 'mds_bal_merge_size', merge_size) + self.config_set('mds', 'mds_bal_split_bits', split_bits) + + self.mount_a.run_shell(["mkdir", test_path]) + dir_ino=self.mount_a.path_to_ino(test_path) + + self.assertEqual(len(self.get_dsplits(dir_ino)), 0) + self.mount_a.create_n_files(f"{test_path}/file", split_size * 2) + + self.mount_a.umount_wait() + + self.fs.flush() + self.fs.mds_fail_restart() + self.fs.wait_for_daemons() + + split_size = 100 + merge_size = 30 + self.config_set('mds', 'mds_bal_split_size', split_size) + self.config_set('mds', 'mds_bal_merge_size', merge_size) + + #Assert to ensure split is present + self.assertGreater(len(self.get_dsplits(dir_ino)), 0) + out_json = self.fs.run_scrub(["start", abs_test_path, "recursive"]) + self.assertNotEqual(out_json, None) + + #Wait until no splits to confirm merge by scrub + self.wait_until_true( + lambda: len(self.get_dsplits(dir_ino)) == 0, + timeout=30 + ) + + def test_scrub_split_dirfrags(self): + """ + That a directory is split during scrub. + """ + + test_path = "testdir" + abs_test_path = f"/{test_path}" + split_size = 20 + merge_size = 5 + split_bits = 1 + + self.mount_a.run_shell(["mkdir", test_path]) + dir_ino=self.mount_a.path_to_ino(test_path) + + self.assertEqual(len(self.get_dsplits(dir_ino)), 0) + self.mount_a.create_n_files(f"{test_path}/file", split_size + 1) + + self.mount_a.umount_wait() + + self.fs.flush() + self.fs.mds_fail_restart() + self.fs.wait_for_daemons() + + self.config_set('mds', 'mds_bal_split_size', split_size) + self.config_set('mds', 'mds_bal_merge_size', merge_size) + self.config_set('mds', 'mds_bal_split_bits', split_bits) + + #Assert to ensure no splits are present + self.assertEqual(len(self.get_dsplits(dir_ino)), 0) + out_json = self.fs.run_scrub(["start", abs_test_path, "recursive"]) + self.assertNotEqual(out_json, None) + + #Wait until split is present to confirm split by scrub + self.wait_until_true( + lambda: len(self.get_dsplits(dir_ino)) > 0, + timeout=30 + ) + def test_stray_evaluation_with_scrub(self): """ test that scrub can iterate over ~mdsdir and evaluate strays -- 2.39.5