]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
tools/cephfs/DataScan: add debugging for directory injection
authorPatrick Donnelly <pdonnell@redhat.com>
Mon, 19 Sep 2022 17:31:40 +0000 (13:31 -0400)
committerPatrick Donnelly <pdonnell@redhat.com>
Tue, 4 Apr 2023 12:49:57 +0000 (08:49 -0400)
Continuation of 16fc2c392b0a4de13dbe4dfcc7dad01d8e58ce40.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit 94d2e24b5cb2bbbfb2d55f6cc538d448091e3d4e)

src/tools/cephfs/DataScan.cc

index 9f942964dd27016569db9b70a82df682de02893c..7733b519b32a6ed7bb90743f325383c5d8b1d3d4 100644 (file)
@@ -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);
       }