From: Yan, Zheng Date: Wed, 5 Jun 2019 10:05:15 +0000 (+0800) Subject: mds: reset heartbeat inside big loop X-Git-Tag: v13.2.7~220^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=f5548883b573150170ece9300cd7833fd93f79f7;p=ceph.git mds: reset heartbeat inside big loop Fixes: https://tracker.ceph.com/issues/40171 Signed-off-by: "Yan, Zheng" (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) --- diff --git a/src/mds/Locker.cc b/src/mds/Locker.cc index ecd06294faac..7f2b430e0237 100644 --- a/src/mds/Locker.cc +++ b/src/mds/Locker.cc @@ -2009,7 +2009,7 @@ void Locker::issue_caps_set(set& 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) diff --git a/src/mds/Locker.h b/src/mds/Locker.h index dd034be99fd7..a9f6c8d59bc8 100644 --- a/src/mds/Locker.h +++ b/src/mds/Locker.h @@ -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& inset); void issue_truncate(CInode *in); void revoke_stale_caps(Session *session); diff --git a/src/mds/MDCache.cc b/src/mds/MDCache.cc index 40bf2f4b8a2a..4223c86ad1ba 100644 --- a/src/mds/MDCache.cc +++ b/src/mds/MDCache.cc @@ -3839,16 +3839,24 @@ bool MDCache::expire_recursive( void MDCache::trim_unlinked_inodes() { dout(7) << "trim_unlinked_inodes" << dendl; - list q; + int count = 0; + vector 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::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 >::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();