]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: skip scrubbing dentries not modified since last scrub
authorYan, Zheng <zyan@redhat.com>
Wed, 18 Nov 2015 13:59:24 +0000 (21:59 +0800)
committerYan, Zheng <zyan@redhat.com>
Mon, 7 Mar 2016 07:59:12 +0000 (15:59 +0800)
Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/CDir.cc

index f4fde58e1e26ee519b3a5f488832223e0ad670c6..e0a06ef4965656d8640f7355f37fdd73d6f42d77 100644 (file)
@@ -2947,12 +2947,13 @@ int CDir::_next_dentry_on_set(set<dentry_key_t>& dns, bool missing_okay,
                               MDSInternalContext *cb, CDentry **dnout)
 {
   dentry_key_t dnkey;
+  CDentry *dn;
 
   while (!dns.empty()) {
     set<dentry_key_t>::iterator front = dns.begin();
     dnkey = *front;
-    *dnout = lookup(dnkey.name);
-    if (!*dnout) {
+    dn = lookup(dnkey.name);
+    if (!dn) {
       if (!is_complete() &&
           (!has_bloom() || is_in_bloom(dnkey.name))) {
         // need to re-read this dirfrag
@@ -2974,6 +2975,13 @@ int CDir::_next_dentry_on_set(set<dentry_key_t>& dns, bool missing_okay,
     // okay, we got a  dentry
     dns.erase(dnkey);
 
+    if (dn->get_projected_version() < scrub_infop->last_recursive.version) {
+      dout(15) << " skip dentry " << dnkey.name
+              << ", no change since last scrub" << dendl;
+      continue;
+    }
+
+    *dnout = dn;
     return 0;
   }
   *dnout = NULL;