]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/mds/CDir.cc
import ceph quincy 17.2.1
[ceph.git] / ceph / src / mds / CDir.cc
index bace9f6b873d17029cf22b8040450905bac63ce5..b5012c340e843c00feb24d60bd5fe653da611327 100644 (file)
@@ -2033,6 +2033,7 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
     }
   }
 
+  int count = 0;
   unsigned pos = omap.size() - 1;
   double rand_threshold = get_inode()->get_ephemeral_rand();
   for (map<string, bufferlist>::reverse_iterator p = omap.rbegin();
@@ -2042,6 +2043,9 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
     snapid_t last;
     dentry_key_t::decode_helper(p->first, dname, last);
 
+    if (!(++count % mdcache->mds->heartbeat_reset_grace(2)))
+      mdcache->mds->heartbeat_reset();
+
     CDentry *dn = NULL;
     try {
       dn = _load_dentry(
@@ -2075,6 +2079,9 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
     if (wanted_items.count(mempool::mds_co::string(dname)) > 0 || !complete) {
       dout(10) << " touching wanted dn " << *dn << dendl;
       mdcache->touch_dentry(dn);
+
+      if (!(++count % mdcache->mds->heartbeat_reset_grace(2)))
+        mdcache->mds->heartbeat_reset();
     }
   }
 
@@ -2090,9 +2097,13 @@ void CDir::_omap_fetched(bufferlist& hdrbl, map<string, bufferlist>& omap,
   // open & force frags
   while (!undef_inodes.empty()) {
     CInode *in = undef_inodes.front();
+
     undef_inodes.pop_front();
     in->state_clear(CInode::STATE_REJOINUNDEF);
     mdcache->opened_undef_inode(in);
+
+    if (!(++count % mdcache->mds->heartbeat_reset_grace()))
+      mdcache->mds->heartbeat_reset();
   }
 
   // dirty myself to remove stale snap dentries
@@ -2324,6 +2335,7 @@ void CDir::_omap_commit_ops(int r, int op_prio, int64_t metapool, version_t vers
     _rm.clear();
   };
 
+  int count = 0;
   for (auto &key : stales) {
     unsigned size = key.length() + sizeof(__u32);
     if (write_size + size > max_write_size)
@@ -2331,6 +2343,9 @@ void CDir::_omap_commit_ops(int r, int op_prio, int64_t metapool, version_t vers
 
     write_size += size;
     _rm.emplace(key);
+
+    if (!(++count % mdcache->mds->heartbeat_reset_grace(2)))
+      mdcache->mds->heartbeat_reset();
   }
 
   for (auto &key : to_remove) {
@@ -2340,6 +2355,9 @@ void CDir::_omap_commit_ops(int r, int op_prio, int64_t metapool, version_t vers
 
     write_size += size;
     _rm.emplace(std::move(key));
+
+    if (!(++count % mdcache->mds->heartbeat_reset_grace(2)))
+      mdcache->mds->heartbeat_reset();
   }
 
   bufferlist bl;
@@ -2365,6 +2383,9 @@ void CDir::_omap_commit_ops(int r, int op_prio, int64_t metapool, version_t vers
 
     write_size += size;
     _set[std::move(item.key)].swap(bl);
+
+    if (!(++count % mdcache->mds->heartbeat_reset_grace()))
+      mdcache->mds->heartbeat_reset();
   }
 
   commit_one(true);
@@ -2393,21 +2414,21 @@ void CDir::_omap_commit(int op_prio)
     // fnode.snap_purged_thru = realm->get_last_destroyed();
   }
 
-  size_t count = 0;
+  size_t items_count = 0;
   if (state_test(CDir::STATE_FRAGMENTING) && is_new()) {
-    count = get_num_head_items() + get_num_snap_items();
+    items_count = get_num_head_items() + get_num_snap_items();
   } else {
     for (elist<CDentry*>::iterator it = dirty_dentries.begin(); !it.end(); ++it)
-      ++count;
+      ++items_count;
   }
 
   vector<string> to_remove;
   // reverve enough memories, which maybe larger than the actually needed
-  to_remove.reserve(count);
+  to_remove.reserve(items_count);
 
   vector<dentry_commit_item> to_set;
   // reverve enough memories, which maybe larger than the actually needed
-  to_set.reserve(count);
+  to_set.reserve(items_count);
 
   // for dir fragtrees
   bufferlist dfts(CEPH_PAGE_SIZE);
@@ -2443,6 +2464,7 @@ void CDir::_omap_commit(int op_prio)
     }
   };
 
+  int count = 0;
   if (state_test(CDir::STATE_FRAGMENTING) && is_new()) {
     ceph_assert(committed_version == 0);
     for (auto p = items.begin(); p != items.end(); ) {
@@ -2451,12 +2473,18 @@ void CDir::_omap_commit(int op_prio)
       if (dn->get_linkage()->is_null())
        continue;
       write_one(dn);
+
+      if (!(++count % mdcache->mds->heartbeat_reset_grace()))
+        mdcache->mds->heartbeat_reset();
     }
   } else {
     for (auto p = dirty_dentries.begin(); !p.end(); ) {
       CDentry *dn = *p;
       ++p;
       write_one(dn);
+
+      if (!(++count % mdcache->mds->heartbeat_reset_grace()))
+        mdcache->mds->heartbeat_reset();
     }
   }
 
@@ -2608,6 +2636,8 @@ void CDir::_committed(int r, version_t v)
   if (committed_version == get_version()) 
     mark_clean();
 
+  int count = 0;
+
   // dentries clean?
   for (auto p = dirty_dentries.begin(); !p.end(); ) {
     CDentry *dn = *p;
@@ -2645,11 +2675,14 @@ void CDir::_committed(int r, version_t v)
       dout(15) << " dir " << committed_version << " < dn " << dn->get_version() << " still dirty " << *dn << dendl;
       ceph_assert(dn->is_dirty());
     }
+
+    if (!(++count % mdcache->mds->heartbeat_reset_grace()))
+      mdcache->mds->heartbeat_reset();
   }
 
   // finishers?
   bool were_waiters = !waiting_for_commit.empty();
-  
+
   auto it = waiting_for_commit.begin();
   while (it != waiting_for_commit.end()) {
     auto _it = it;
@@ -2665,7 +2698,10 @@ void CDir::_committed(int r, version_t v)
     mdcache->mds->queue_waiters(t);
     waiting_for_commit.erase(it);
     it = _it;
-  } 
+
+    if (!(++count % mdcache->mds->heartbeat_reset_grace()))
+      mdcache->mds->heartbeat_reset();
+  }
 
   // try drop dentries in this dirfrag if it's about to be purged
   if (!inode->is_base() && get_parent_dir()->inode->is_stray() &&