mirror of
https://github.com/ceph/ceph
synced 2025-02-21 09:57:26 +00:00
tasks/cephfs: add TestForwardScrub.test_backtrace_repair
Signed-off-by: John Spray <john.spray@redhat.com>
This commit is contained in:
parent
b2588f7cf5
commit
5f77f09b01
@ -3,6 +3,7 @@ overrides:
|
||||
ceph:
|
||||
log-whitelist:
|
||||
- inode wrongly marked free
|
||||
- bad backtrace on inode
|
||||
- inode table repaired for inode
|
||||
- Scrub error on inode
|
||||
|
||||
|
@ -675,6 +675,30 @@ class Filesystem(MDSCluster):
|
||||
|
||||
return json.loads(p.stdout.getvalue().strip())
|
||||
|
||||
def _write_data_xattr(self, ino_no, xattr_name, data, pool=None):
|
||||
"""
|
||||
Write to an xattr of the 0th data object of an inode. Will
|
||||
succeed whether the object and/or xattr already exist or not.
|
||||
|
||||
:param ino_no: integer inode number
|
||||
:param xattr_name: string name of the xattr
|
||||
:param data: byte array data to write to the xattr
|
||||
:param pool: name of data pool or None to use primary data pool
|
||||
:return: None
|
||||
"""
|
||||
remote = self.mds_daemons[self.mds_ids[0]].remote
|
||||
if pool is None:
|
||||
pool = self.get_data_pool_name()
|
||||
|
||||
obj_name = "{0:x}.00000000".format(ino_no)
|
||||
args = [
|
||||
os.path.join(self._prefix, "rados"), "-p", pool, "setxattr",
|
||||
obj_name, xattr_name, data
|
||||
]
|
||||
remote.run(
|
||||
args=args,
|
||||
stdout=StringIO())
|
||||
|
||||
def read_backtrace(self, ino_no, pool=None):
|
||||
"""
|
||||
Read the backtrace from the data pool, return a dict in the format
|
||||
|
@ -262,3 +262,33 @@ class TestForwardScrub(CephFSTestCase):
|
||||
self.assertGreater(
|
||||
table['0']['data']['inotable']['free'][0]['start'],
|
||||
inos['./file3_sixmegs'])
|
||||
|
||||
def test_backtrace_repair(self):
|
||||
"""
|
||||
That the MDS can repair an inodes backtrace in the data pool
|
||||
if it is found to be damaged.
|
||||
"""
|
||||
# Create a file for subsequent checks
|
||||
self.mount_a.run_shell(["mkdir", "parent_a"])
|
||||
self.mount_a.run_shell(["touch", "parent_a/alpha"])
|
||||
file_ino = self.mount_a.path_to_ino("parent_a/alpha")
|
||||
|
||||
# That backtrace and layout are written after initial flush
|
||||
self.fs.mds_asok(["flush", "journal"])
|
||||
backtrace = self.fs.read_backtrace(file_ino)
|
||||
self.assertEqual(['alpha', 'parent_a'],
|
||||
[a['dname'] for a in backtrace['ancestors']])
|
||||
|
||||
with self.assert_cluster_log("bad backtrace on inode", invert_match=True):
|
||||
self.fs.mds_asok(["scrub_path", "/", "repair", "recursive"])
|
||||
|
||||
# Go corrupt the backtrace
|
||||
self.fs._write_data_xattr(file_ino, "inode_backtrace_t",
|
||||
"oh i'm sorry did i overwrite your xattr?")
|
||||
|
||||
with self.assert_cluster_log("bad backtrace on inode"):
|
||||
self.fs.mds_asok(["scrub_path", "/", "repair", "recursive"])
|
||||
self.fs.mds_asok(["flush", "journal"])
|
||||
backtrace = self.fs.read_backtrace(file_ino)
|
||||
self.assertEqual(['alpha', 'parent_a'],
|
||||
[a['dname'] for a in backtrace['ancestors']])
|
||||
|
Loading…
Reference in New Issue
Block a user