From: simon gao Date: Tue, 28 May 2019 02:36:32 +0000 (-0400) Subject: mds: avoid sending too many osd requests at once after mds restarts X-Git-Tag: v15.1.0~2642^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F27436%2Fhead;p=ceph.git mds: avoid sending too many osd requests at once after mds restarts Fixes: http://tracker.ceph.com/issues/40028 Signed-off-by: simon gao --- diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 75e5934b31f5..07fddead765b 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -627,6 +627,13 @@ void MDLog::trim(int m) unsigned new_expiring_segments = 0; + unsigned max_expiring_segments = 0; + if (pre_segments_size > 0){ + max_expiring_segments = max_segments/2; + assert(segments.size() >= pre_segments_size); + max_expiring_segments = std::max(max_expiring_segments,segments.size() - pre_segments_size); + } + map::iterator p = segments.begin(); while (p != segments.end()) { if (stop < ceph_clock_now()) @@ -642,6 +649,10 @@ void MDLog::trim(int m) if (new_expiring_segments * 2 > num_remaining_segments) break; + if (max_expiring_segments > 0 && + expiring_segments.size() >= max_expiring_segments) + break; + // look at first segment LogSegment *ls = p->second; ceph_assert(ls); @@ -832,6 +843,8 @@ void MDLog::_trim_expired_segments() << ls->seq << "/0x" << std::hex << ls->offset << std::dec << dendl; expired_events -= ls->num_events; expired_segments.erase(ls); + if (pre_segments_size > 0) + pre_segments_size--; num_events -= ls->num_events; // this was the oldest segment, adjust expire pos @@ -1460,6 +1473,7 @@ void MDLog::_replay_thread() if (mds->is_daemon_stopping()) { return; } + pre_segments_size = segments.size(); // get num of logs when replay is finished finish_contexts(g_ceph_context, waitfor_replay, r); } diff --git a/src/mds/MDLog.h b/src/mds/MDLog.h index 7fe127d0d63e..e503e57caf1f 100644 --- a/src/mds/MDLog.h +++ b/src/mds/MDLog.h @@ -124,6 +124,7 @@ protected: map segments; set expiring_segments; set expired_segments; + std::size_t pre_segments_size = 0; // the num of segments when the mds finished replay-journal, to calc the num of segments growing uint64_t event_seq; int expiring_events; int expired_events;