From fe3eded4cd85704bc8c3ce7af957ec1b6045dc9e Mon Sep 17 00:00:00 2001 From: Xiubo Li Date: Tue, 12 Apr 2022 12:37:13 +0800 Subject: [PATCH] qa: add filesystem sync stuck test support This will test the sync of the filesystem, which maybe stuck for at most 5 seconds. This was because the related code will wait for all the unsafe requests to get safe reply from MDSes, but the MDSes just think that it's unnecessary to flush the mdlog immediately after early reply, and the mdlog will be flushed every 5 seconds in the tick thread. This should have been fixed in kclient and libcephfs by triggering mdlog flush before waiting requests' safe reply. Fixes: https://tracker.ceph.com/issues/55283 Signed-off-by: Xiubo Li (cherry picked from commit b6fc5480f6ba6352fa72062e1376d0dd6b9074cd) --- qa/tasks/cephfs/test_misc.py | 31 +++++++++++++++++++++++++++++++ 1 file changed, 31 insertions(+) diff --git a/qa/tasks/cephfs/test_misc.py b/qa/tasks/cephfs/test_misc.py index a6cb3da4efce..33c1142ff46a 100644 --- a/qa/tasks/cephfs/test_misc.py +++ b/qa/tasks/cephfs/test_misc.py @@ -7,6 +7,7 @@ import errno import time import json import logging +import os log = logging.getLogger(__name__) @@ -200,6 +201,36 @@ class TestMisc(CephFSTestCase): assert info['path'] == "/foo" + def test_filesystem_sync_stuck_for_around_5s(self): + """ + To check whether the fsync will be stuck to wait for the mdlog to be + flushed for at most 5 seconds. + """ + + dir_path = "fsync_do_not_wait_mdlog_testdir" + self.mount_a.run_shell(["mkdir", dir_path]) + + # run create/delete directories and test the sync time duration + for i in range(300): + for j in range(5): + self.mount_a.run_shell(["mkdir", os.path.join(dir_path, f"{i}_{j}")]) + start = time.time() + self.mount_a.run_shell(["sync"]) + duration = time.time() - start + log.info(f"mkdir i = {i}, duration = {duration}") + self.assertLess(duration, 4) + + for j in range(5): + self.mount_a.run_shell(["rm", "-rf", os.path.join(dir_path, f"{i}_{j}")]) + start = time.time() + self.mount_a.run_shell(["sync"]) + duration = time.time() - start + log.info(f"rmdir i = {i}, duration = {duration}") + self.assertLess(duration, 4) + + self.mount_a.run_shell(["rm", "-rf", dir_path]) + + class TestCacheDrop(CephFSTestCase): CLIENTS_REQUIRED = 1 -- 2.47.3