]>
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
)
23 raise RuntimeError("rank {0} failed to reach desired subtree state", rank
)
25 def test_export_pin(self
):
26 self
.fs
.set_max_mds(2)
27 self
.fs
.wait_for_daemons()
29 status
= self
.fs
.status()
31 self
.mount_a
.run_shell(["mkdir", "-p", "1/2/3"])
32 self
._wait
_subtrees
(status
, 0, [])
35 self
.mount_a
.setfattr("1", "ceph.dir.pin", "-1")
36 self
._wait
_subtrees
(status
, 0, [])
39 self
.mount_a
.setfattr("1", "ceph.dir.pin", "-2341")
40 self
._wait
_subtrees
(status
, 0, [])
43 self
.mount_a
.setfattr("1", "ceph.dir.pin", "1")
44 self
._wait
_subtrees
(status
, 1, [('/1', 1)])
46 # Check export_targets is set properly
47 status
= self
.fs
.status()
49 r0
= status
.get_rank(self
.fs
.id, 0)
50 self
.assertTrue(sorted(r0
['export_targets']) == [1])
52 # redundant pin /1/2 to rank 1
53 self
.mount_a
.setfattr("1/2", "ceph.dir.pin", "1")
54 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 1)])
56 # change pin /1/2 to rank 0
57 self
.mount_a
.setfattr("1/2", "ceph.dir.pin", "0")
58 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 0)])
59 self
._wait
_subtrees
(status
, 0, [('/1', 1), ('/1/2', 0)])
61 # change pin /1/2/3 to (presently) non-existent rank 2
62 self
.mount_a
.setfattr("1/2/3", "ceph.dir.pin", "2")
63 self
._wait
_subtrees
(status
, 0, [('/1', 1), ('/1/2', 0)])
64 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 0)])
66 # change pin /1/2 back to rank 1
67 self
.mount_a
.setfattr("1/2", "ceph.dir.pin", "1")
68 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 1)])
70 # add another directory pinned to 1
71 self
.mount_a
.run_shell(["mkdir", "-p", "1/4/5"])
72 self
.mount_a
.setfattr("1/4/5", "ceph.dir.pin", "1")
73 self
._wait
_subtrees
(status
, 1, [('/1', 1), ('/1/2', 1), ('/1/4/5', 1)])
76 self
.mount_a
.setfattr("1", "ceph.dir.pin", "0")
77 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/2', 1), ('/1/4/5', 1)])
79 # change pin /1/2 to default (-1); does the subtree root properly respect it's parent pin?
80 self
.mount_a
.setfattr("1/2", "ceph.dir.pin", "-1")
81 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/4/5', 1)])
83 if len(list(status
.get_standbys())):
84 self
.fs
.set_max_mds(3)
85 self
.fs
.wait_for_state('up:active', rank
=2)
86 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/4/5', 1), ('/1/2/3', 2)])
88 # Check export_targets is set properly
89 status
= self
.fs
.status()
91 r0
= status
.get_rank(self
.fs
.id, 0)
92 self
.assertTrue(sorted(r0
['export_targets']) == [1,2])
93 r1
= status
.get_rank(self
.fs
.id, 1)
94 self
.assertTrue(sorted(r1
['export_targets']) == [0])
95 r2
= status
.get_rank(self
.fs
.id, 2)
96 self
.assertTrue(sorted(r2
['export_targets']) == [])
99 self
.mount_a
.run_shell(["mkdir", "-p", "a/b", "aa/bb"])
100 self
.mount_a
.setfattr("a", "ceph.dir.pin", "1")
101 self
.mount_a
.setfattr("aa/bb", "ceph.dir.pin", "0")
102 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/4/5', 1), ('/1/2/3', 2), ('/a', 1), ('/aa/bb', 0)])
103 self
.mount_a
.run_shell(["mv", "aa", "a/b/"])
104 self
._wait
_subtrees
(status
, 0, [('/1', 0), ('/1/4/5', 1), ('/1/2/3', 2), ('/a', 1), ('/a/b/aa/bb', 0)])