From 013ec734b708fb8ca33c991ece24435a97a1e64a Mon Sep 17 00:00:00 2001 From: simon gao Date: Mon, 27 May 2019 22:36:32 -0400 Subject: [PATCH] mds: avoid sending too many osd requests at once after mds restarts Fixes: http://tracker.ceph.com/issues/40028 Signed-off-by: simon gao (cherry picked from commit 78484352f553d6b67f7d5c82384a186455f05537) --- src/mds/MDLog.cc | 14 ++++++++++++++ src/mds/MDLog.h | 1 + 2 files changed, 15 insertions(+) diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 75e5934b31f50..07fddead765b8 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 7fe127d0d63ed..e503e57caf1f3 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; -- 2.39.5