From c664031f83370b72a715108f2c254b2e4505f62d Mon Sep 17 00:00:00 2001 From: Patrick Donnelly Date: Mon, 19 Sep 2022 13:31:40 -0400 Subject: [PATCH] tools/cephfs/DataScan: add debugging for directory injection Continuation of 16fc2c392b0a4de13dbe4dfcc7dad01d8e58ce40. Signed-off-by: Patrick Donnelly (cherry picked from commit 94d2e24b5cb2bbbfb2d55f6cc538d448091e3d4e) --- src/tools/cephfs/DataScan.cc | 22 ++++++++++++++++++---- 1 file changed, 18 insertions(+), 4 deletions(-) diff --git a/src/tools/cephfs/DataScan.cc b/src/tools/cephfs/DataScan.cc index 9f942964dd270..7733b519b32a6 100644 --- a/src/tools/cephfs/DataScan.cc +++ b/src/tools/cephfs/DataScan.cc @@ -988,7 +988,9 @@ int DataScan::scan_links() try { snapid_t dnfirst; decode(dnfirst, q); - if (dnfirst <= CEPH_MAXSNAP) { + if (dnfirst == CEPH_NOSNAP) { + dout(20) << "injected ino detected" << dendl; + } else if (dnfirst <= CEPH_MAXSNAP) { if (dnfirst - 1 > last_snap) last_snap = dnfirst - 1; } @@ -1060,8 +1062,10 @@ int DataScan::scan_links() snaps.insert(make_move_iterator(begin(srnode.snaps)), make_move_iterator(end(srnode.snaps))); } - if (dnfirst == CEPH_NOSNAP) - injected_inos[ino] = link_info_t(dir_ino, frag_id, dname, inode.inode); + if (dnfirst == CEPH_NOSNAP) { + injected_inos[ino] = link_info_t(dir_ino, frag_id, dname, inode.inode); + dout(20) << "adding " << ino << " for future processing to fix dnfirst" << dendl; + } } } else if (dentry_type == 'L' || dentry_type == 'l') { inodeno_t ino; @@ -1235,6 +1239,7 @@ int DataScan::scan_links() InodeStore inode; snapid_t first; + dout(20) << " fixing linkage (dnfirst) of " << p.second.dirino << ":" << p.second.name << dendl; int r = read_dentry(p.second.dirino, p.second.frag, p.second.name, &inode, &first); if (r < 0) { derr << "Unexpected error reading dentry " @@ -1243,10 +1248,13 @@ int DataScan::scan_links() return r; } - if (first != CEPH_NOSNAP) + if (first != CEPH_NOSNAP) { + dout(20) << " ????" << dendl; continue; + } first = last_snap + 1; + dout(20) << " first is now " << first << dendl; r = metadata_driver->inject_linkage(p.second.dirino, p.second.name, p.second.frag, inode, first); if (r < 0) return r; @@ -1864,9 +1872,14 @@ int MetadataDriver::inject_with_backtrace( << " at 0x" << parent_ino << "/" << dname << std::dec << " with size=" << dentry.inode->size << " bytes" << dendl; + /* NOTE: dnfirst fixed in scan_links */ r = inject_linkage(parent_ino, dname, fragment, dentry); } else { // This is the linkage for an ancestor directory + dout(10) << "Linking ancestor directory of inode 0x" << std::hex << ino + << " at 0x" << std::hex << parent_ino + << ":" << dname << dendl; + InodeStore ancestor_dentry; auto inode = ancestor_dentry.get_inode(); inode->mode = 0755 | S_IFDIR; @@ -1885,6 +1898,7 @@ int MetadataDriver::inject_with_backtrace( inode->gid = g_conf()->mds_root_ino_gid; inode->version = 1; inode->backtrace_version = 1; + /* NOTE: dnfirst fixed in scan_links */ r = inject_linkage(parent_ino, dname, fragment, ancestor_dentry); } -- 2.39.5