]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: reset heartbeat inside big loop 28918/head
authorYan, Zheng <zyan@redhat.com>
Wed, 5 Jun 2019 10:05:15 +0000 (18:05 +0800)
committerNathan Cutler <ncutler@suse.com>
Mon, 8 Jul 2019 12:52:16 +0000 (14:52 +0200)
Fixes: https://tracker.ceph.com/issues/40171
Signed-off-by: "Yan, Zheng" <zyan@redhat.com>
(cherry picked from commit d90403c8df90ed06564c84bb2dd38c16861cf34e)

Conflicts:
src/mds/Locker.h (trivial)
        src/mds/MDCache.cc (resolve by backporting relevant portion of
            4cf04ca57f3c4fce7a3a5d699627d0760347fd11 as was done in the
            luminous backport)

src/mds/Locker.cc
src/mds/Locker.h
src/mds/MDCache.cc

index ecd06294faacfe9113f1f21e1fbc3f8c393d7ace..7f2b430e02372368264973ec024ecde4a6af49f2 100644 (file)
@@ -2009,7 +2009,7 @@ void Locker::issue_caps_set(set<CInode*>& inset)
     issue_caps(*p);
 }
 
-bool Locker::issue_caps(CInode *in, Capability *only_cap)
+int Locker::issue_caps(CInode *in, Capability *only_cap)
 {
   // allowed caps are determined by the lock mode.
   int all_allowed = in->get_caps_allowed_by_type(CAP_ANY);
@@ -2133,7 +2133,7 @@ bool Locker::issue_caps(CInode *in, Capability *only_cap)
       break;
   }
 
-  return (nissued == 0);  // true if no re-issued, no callbacks
+  return nissued;
 }
 
 void Locker::issue_truncate(CInode *in)
index dd034be99fd7de87480b54e601937fe267acd8ef..a9f6c8d59bc84ec2d08b3f7eff83603d347ddad1 100644 (file)
@@ -246,7 +246,7 @@ public:
 public:
   version_t issue_file_data_version(CInode *in);
   Capability* issue_new_caps(CInode *in, int mode, Session *session, SnapRealm *conrealm, bool is_replay);
-  bool issue_caps(CInode *in, Capability *only_cap=0);
+  int issue_caps(CInode *in, Capability *only_cap=0);
   void issue_caps_set(set<CInode*>& inset);
   void issue_truncate(CInode *in);
   void revoke_stale_caps(Session *session);
index 40bf2f4b8a2a803da5d54406c26e8d3c8c57c794..4223c86ad1ba4f9a962308f8b7216bf105baa8ac 100644 (file)
@@ -3839,16 +3839,24 @@ bool MDCache::expire_recursive(
 void MDCache::trim_unlinked_inodes()
 {
   dout(7) << "trim_unlinked_inodes" << dendl;
-  list<CInode*> q;
+  int count = 0;
+  vector<CInode*> q;
   for (auto &p : inode_map) {
     CInode *in = p.second;
     if (in->get_parent_dn() == NULL && !in->is_base()) {
       dout(7) << " will trim from " << *in << dendl;
       q.push_back(in);
     }
+
+    if (!(++count % 1000))
+      mds->heartbeat_reset();
+  }
+  for (auto& in : q) {
+    remove_inode_recursive(in);
+
+    if (!(++count % 1000))
+      mds->heartbeat_reset();
   }
-  for (list<CInode*>::iterator p = q.begin(); p != q.end(); ++p)
-    remove_inode_recursive(*p);
 }
 
 /** recalc_auth_bits()
@@ -5644,9 +5652,9 @@ void MDCache::choose_lock_states_and_reconnect_caps()
 {
   dout(10) << "choose_lock_states_and_reconnect_caps" << dendl;
 
+  int count = 0;
   for (auto p : inode_map) {
     CInode *in = p.second;
-
     if (in->last != CEPH_NOSNAP)
       continue;
  
@@ -5666,6 +5674,9 @@ void MDCache::choose_lock_states_and_reconnect_caps()
       in->get(CInode::PIN_OPENINGSNAPPARENTS);
       rejoin_pending_snaprealms.insert(in);
     }
+
+    if (!(++count % 1000))
+      mds->heartbeat_reset();
   }
 }
 
@@ -5821,6 +5832,7 @@ void MDCache::export_remaining_imported_caps()
 
   stringstream warn_str;
 
+  int count = 0;
   for (auto p = cap_imports.begin(); p != cap_imports.end(); ++p) {
     warn_str << " ino " << p->first << "\n";
     for (auto q = p->second.begin(); q != p->second.end(); ++q) {
@@ -5833,7 +5845,8 @@ void MDCache::export_remaining_imported_caps()
       }
     }
 
-    mds->heartbeat_reset();
+    if (!(++count % 1000))
+      mds->heartbeat_reset();
   }
 
   for (map<inodeno_t, list<MDSInternalContextBase*> >::iterator p = cap_reconnect_waiters.begin();
@@ -6297,7 +6310,9 @@ void MDCache::reissue_all_caps()
 {
   dout(10) << "reissue_all_caps" << dendl;
 
+  int count = 0;
   for (auto &p : inode_map) {
+    int n = 1;
     CInode *in = p.second;
     if (in->is_head() && in->is_any_caps()) {
       // called by MDSRank::active_start(). There shouldn't be any frozen subtree.
@@ -6306,8 +6321,12 @@ void MDCache::reissue_all_caps()
        continue;
       }
       if (!mds->locker->eval(in, CEPH_CAP_LOCKS))
-       mds->locker->issue_caps(in);
+       n += mds->locker->issue_caps(in);
     }
+
+    if ((count % 1000) + n >= 1000)
+      mds->heartbeat_reset();
+    count += n;
   }
 }
 
@@ -6385,6 +6404,7 @@ void MDCache::_queued_file_recover_cow(CInode *in, MutationRef& mut)
 void MDCache::identify_files_to_recover()
 {
   dout(10) << "identify_files_to_recover" << dendl;
+  int count = 0;
   for (auto &p : inode_map) {
     CInode *in = p.second;
     if (!in->is_auth())
@@ -6421,6 +6441,9 @@ void MDCache::identify_files_to_recover()
     } else {
       rejoin_check_q.push_back(in);
     }
+
+    if (!(++count % 1000))
+      mds->heartbeat_reset();
   }
 }
 
@@ -12149,10 +12172,13 @@ void MDCache::force_readonly()
   mds->server->force_clients_readonly();
 
   // revoke write caps
+  int count = 0;
   for (auto &p : inode_map) {
     CInode *in = p.second;
     if (in->is_head())
       mds->locker->eval(in, CEPH_CAP_LOCKS);
+    if (!(++count % 1000))
+      mds->heartbeat_reset();
   }
 
   mds->mdlog->flush();