]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: do not simplify fragset 54895/head
authorMilind Changire <mchangir@redhat.com>
Mon, 25 Sep 2023 12:49:50 +0000 (18:19 +0530)
committerMilind Changire <mchangir@redhat.com>
Thu, 14 Dec 2023 06:32:28 +0000 (12:02 +0530)
Problem:
Frags in simplified fragset aren't found as is on the replica during scrub.

fragset::simplify() computes the bit representation of the least common
ancestor of the frags.  When this representation is forwarded to the replicas,
the ScrubStack::handle_scrub() method in the OP_QUEUEDIR case simply searches
this simplified representation in the list of (unsimplified) frags ...
which it fails to find.
Hence we get to see the "no frag 10*" type of logs.

Solution:
Do not simplify fragset when forwarding fragset to replica for scrub.

Fixes: https://tracker.ceph.com/issues/62658
Signed-off-by: Milind Changire <mchangir@redhat.com>
(cherry picked from commit f3c0424bb583423db80009c29f73e484aad840b4)

src/mds/ScrubStack.cc

index 6d799343f1496c2f7c0a414a67215d9185f1c0a2..742c464f4d37a0d18e2ce64c41daebeea0742ef6 100644 (file)
@@ -320,7 +320,7 @@ void ScrubStack::scrub_dir_inode(CInode *in, bool *added_children, bool *done)
 
   frag_vec_t frags;
   in->dirfragtree.get_leaves(frags);
-  dout(20) << __func__ << "recursive mode, frags " << frags << dendl;
+  dout(20) << __func__ << " recursive mode, frags " << frags << dendl;
   for (auto &fg : frags) {
     if (queued.contains(fg))
       continue;
@@ -366,7 +366,6 @@ void ScrubStack::scrub_dir_inode(CInode *in, bool *added_children, bool *done)
     scrub_r.tag = header->get_tag();
 
     for (auto& p : scrub_remote) {
-      p.second.simplify();
       dout(20) << __func__ << " forward " << p.second  << " to mds." << p.first << dendl;
       auto r = make_message<MMDSScrub>(MMDSScrub::OP_QUEUEDIR, in->ino(),
                                       std::move(p.second), header->get_tag(),