From 5e4812cdb55d14d7e8523d6582f7f45cddc3b694 Mon Sep 17 00:00:00 2001 From: Kotresh HR Date: Sun, 2 Mar 2025 00:39:41 +0530 Subject: [PATCH] qa: Add function to fetch inode from metadata pool Add a function to fetch the inode from the metadata pool. This is done by fetching the omap value from the directory object and decode it to the in-memory inode format using ceph-dencoder. Fixes: https://tracker.ceph.com/issues/69339 Signed-off-by: Kotresh HR --- qa/tasks/cephfs/filesystem.py | 22 +++++++++++++++++++++- 1 file changed, 21 insertions(+), 1 deletion(-) diff --git a/qa/tasks/cephfs/filesystem.py b/qa/tasks/cephfs/filesystem.py index 85eac792ca8e9..3671ed06d13ab 100644 --- a/qa/tasks/cephfs/filesystem.py +++ b/qa/tasks/cephfs/filesystem.py @@ -1322,8 +1322,10 @@ class FilesystemBase(MDSClusterBase): status = self.status() - def dencoder(self, obj_type, obj_blob, skip=0): + def dencoder(self, obj_type, obj_blob, skip=0, stray_okay=False): args = [os.path.join(self._prefix, "ceph-dencoder"), 'type', obj_type] + if stray_okay: + args.extend(["stray_okay"]) if skip != 0 : args.extend(["skip", str(skip)]) args.extend(['import', '-', 'decode', 'dump_json']) @@ -1545,6 +1547,24 @@ class FilesystemBase(MDSClusterBase): args = ["setxattr", obj_name, xattr_name, data] self.rados(args, pool=pool) + def read_meta_inode(self, dir_ino, file_name, pool=None): + """ + Get decoded in-memory inode from the metadata pool + """ + if pool is None: + pool = self.get_metadata_pool_name() + + dirfrag_obj_name = "{0:x}.00000000".format(dir_ino) + args=["getomapval", dirfrag_obj_name, file_name+"_head", "-"] + try: + proc = self.rados(args, pool=pool, stdout=BytesIO()) + except CommandFailedError as e: + log.error(e.__str__()) + raise ObjectNotFound(dirfrag_obj_name) + + obj_blob = proc.stdout.getvalue() + return json.loads(self.dencoder("inode_t", obj_blob, 25, True).strip()) + def read_remote_inode(self, ino_no, pool=None): """ Read the remote_inode xattr from the data pool, return a dict in the -- 2.39.5