]>
git.proxmox.com Git - ceph.git/blob - ceph/qa/tasks/cephfs/test_exports.py
3 from tasks
.cephfs
.fuse_mount
import FuseMount
4 from tasks
.cephfs
.cephfs_test_case
import CephFSTestCase
6 log
= logging
.getLogger(__name__
)
8 class TestExports(CephFSTestCase
):
11 def _wait_subtrees(self
, status
, rank
, test
):
15 for i
in range(timeout
/pause
):
16 subtrees
= self
.fs
.mds_asok(["get", "subtrees"], mds_id
=status
.get_rank(self
.fs
.id, rank
)['name'])
17 subtrees
= filter(lambda s
: s
['dir']['path'].startswith('/'), subtrees
)
18 filtered
= sorted([(s
['dir']['path'], s
['auth_first']) for s
in subtrees
])
19 log
.info("%s =?= %s", filtered
, test
)
21 # Confirm export_pin in output is correct:
23 self
.assertTrue(s
['export_pin'] == s
['auth_first'])
26 raise RuntimeError("rank {0} failed to reach desired subtree state", rank
)
28 def test_export_pin(self
):
29 self
.fs
.set_max_mds(2)
30 self
.fs
.wait_for_daemons()
32 status
= self
.fs
.status()
34 self
.mount_a
.run_shell(["mkdir", "-p", "1/2/3"])
35 self
._wait
_subtrees
(status
, 0, [])
38 self
.mount_a
.setfattr("1", "ceph.dir.pin", "-1")
39 self
._wait
_subtrees
(status
, 0, [])
42 self
.mount_a
.setfattr("1", "ceph.dir.pin", "-2341")
43 self
._wait
_subtrees
(status
, 0, [])
46 self
.mount_a
.setfattr("1", "ceph.dir.pin", "1")
47 self
._wait
_subtrees
(status
, 1, [('/1', 1)])
49 # Check export_targets is set properly
50 status
= self
.fs
.status()
52 r0
= status
.get_rank(self
.fs
.id, 0)
53 self
.assertTrue(sorted(r0
['export_targets']) == [1])
55 # redundant pin /1/2 to rank 1
56 self
.mount_a
.setfattr("1/2", "ceph.dir.pin", "1")
57 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 1)])
59 # change pin /1/2 to rank 0
60 self
.mount_a
.setfattr("1/2", "ceph.dir.pin", "0")
61 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 0)])
62 self
._wait
_subtrees
(status
, 0, [('/1', 1), ('/1/2', 0)])
64 # change pin /1/2/3 to (presently) non-existent rank 2
65 self
.mount_a
.setfattr("1/2/3", "ceph.dir.pin", "2")
66 self
._wait
_subtrees
(status
, 0, [('/1', 1), ('/1/2', 0)])
67 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 0)])
69 # change pin /1/2 back to rank 1
70 self
.mount_a
.setfattr("1/2", "ceph.dir.pin", "1")
71 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 1)])
73 # add another directory pinned to 1
74 self
.mount_a
.run_shell(["mkdir", "-p", "1/4/5"])
75 self
.mount_a
.setfattr("1/4/5", "ceph.dir.pin", "1")
76 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 1), ('/1/4/5', 1)])
79 self
.mount_a
.setfattr("1", "ceph.dir.pin", "0")
80 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/2', 1), ('/1/4/5', 1)])
82 # change pin /1/2 to default (-1); does the subtree root properly respect it's parent pin?
83 self
.mount_a
.setfattr("1/2", "ceph.dir.pin", "-1")
84 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/4/5', 1)])
86 if len(list(status
.get_standbys())):
87 self
.fs
.set_max_mds(3)
88 self
.fs
.wait_for_state('up:active', rank
=2)
89 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/4/5', 1), ('/1/2/3', 2)])
91 # Check export_targets is set properly
92 status
= self
.fs
.status()
94 r0
= status
.get_rank(self
.fs
.id, 0)
95 self
.assertTrue(sorted(r0
['export_targets']) == [1,2])
96 r1
= status
.get_rank(self
.fs
.id, 1)
97 self
.assertTrue(sorted(r1
['export_targets']) == [0])
98 r2
= status
.get_rank(self
.fs
.id, 2)
99 self
.assertTrue(sorted(r2
['export_targets']) == [])
102 self
.mount_a
.run_shell(["mkdir", "-p", "a/b", "aa/bb"])
103 self
.mount_a
.setfattr("a", "ceph.dir.pin", "1")
104 self
.mount_a
.setfattr("aa/bb", "ceph.dir.pin", "0")
105 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/4/5', 1), ('/1/2/3', 2), ('/a', 1), ('/aa/bb', 0)])
106 self
.mount_a
.run_shell(["mv", "aa", "a/b/"])
107 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/4/5', 1), ('/1/2/3', 2), ('/a', 1), ('/a/b/aa/bb', 0)])