]> git.proxmox.com Git - ceph.git/blob - ceph/qa/tasks/cephfs/test_cap_flush.py
import ceph 16.2.6
[ceph.git] / ceph / qa / tasks / cephfs / test_cap_flush.py
1
2 import os
3 import time
4 from textwrap import dedent
5 from tasks.cephfs.cephfs_test_case import CephFSTestCase, for_teuthology
6
7 class TestCapFlush(CephFSTestCase):
8 @for_teuthology
9 def test_replay_create(self):
10 """
11 MDS starts to handle client caps when it enters clientreplay stage.
12 When handling a client cap in clientreplay stage, it's possible that
13 corresponding inode does not exist because the client request which
14 creates inode hasn't been replayed.
15 """
16
17 dir_path = os.path.join(self.mount_a.mountpoint, "testdir")
18 py_script = dedent("""
19 import os
20 os.mkdir("{0}")
21 fd = os.open("{0}", os.O_RDONLY)
22 os.fchmod(fd, 0o777)
23 os.fsync(fd)
24 """).format(dir_path)
25 self.mount_a.run_python(py_script)
26
27 self.fs.mds_asok(["flush", "journal"])
28
29 # client will only get unsafe replay
30 self.fs.mds_asok(["config", "set", "mds_log_pause", "1"])
31
32 file_name = "testfile"
33 file_path = dir_path + "/" + file_name
34
35 # Create a file and modify its mode. ceph-fuse will mark Ax cap dirty
36 py_script = dedent("""
37 import os
38 os.chdir("{0}")
39 os.setgid(65534)
40 os.setuid(65534)
41 fd = os.open("{1}", os.O_CREAT | os.O_RDWR, 0o644)
42 os.fchmod(fd, 0o640)
43 """).format(dir_path, file_name)
44 self.mount_a.run_python(py_script, sudo=True)
45
46 # Modify file mode by different user. ceph-fuse will send a setattr request
47 self.mount_a.run_shell(["chmod", "600", file_path], wait=False, sudo=True)
48
49 time.sleep(10)
50
51 # Restart mds. Client will re-send the unsafe request and cap flush
52 self.fs.rank_fail()
53 self.fs.wait_for_daemons()
54
55 mode = self.mount_a.run_shell(['stat', '-c' '%a', file_path]).stdout.getvalue().strip()
56 # If the cap flush get dropped, mode should be 0644.
57 # (Ax cap stays in dirty state, which prevents setattr reply from updating file mode)
58 self.assertEqual(mode, "600")