]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: avoid sending too many osd requests at once after mds restarts 28582/head
authorsimon gao <simon29rock@gmail.com>
Tue, 28 May 2019 02:36:32 +0000 (22:36 -0400)
committerPrashant D <pdhange@redhat.com>
Mon, 17 Jun 2019 05:46:48 +0000 (01:46 -0400)
Fixes: http://tracker.ceph.com/issues/40028
Signed-off-by: simon gao <simon29rock@gmail.com>
(cherry picked from commit 78484352f553d6b67f7d5c82384a186455f05537)

src/mds/MDLog.cc
src/mds/MDLog.h

index 75e5934b31f503d90d6cd47a521662fb63ca9468..07fddead765b82a32e44d2ee6b011bf9a698adc4 100644 (file)
@@ -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<unsigned>(max_expiring_segments,segments.size() - pre_segments_size);
+  }
+  
   map<uint64_t,LogSegment*>::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);  
   }
 
index 7fe127d0d63ed7edd63d9ff78959b696607df879..e503e57caf1f3ad18f15e9ad0d85ac3485eeb3ac 100644 (file)
@@ -124,6 +124,7 @@ protected:
   map<uint64_t,LogSegment*> segments;
   set<LogSegment*> expiring_segments;
   set<LogSegment*> 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;