]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: fix race of trimming log segments 3052/head
authorYan, Zheng <zyan@redhat.com>
Tue, 2 Dec 2014 05:59:11 +0000 (13:59 +0800)
committerYan, Zheng <zyan@redhat.com>
Tue, 2 Dec 2014 08:20:21 +0000 (16:20 +0800)
trimming old log segments can start new log segments, make sure
MDLog::trim_all() not expire newly started log segments.

Signed-off-by: Yan, Zheng <zyan@redhat.com>
src/mds/MDLog.cc

index 456e97d551c76dcb7713160ab329bb08af214001..538f4bdceb9161448c5498bf5d6555374a6e86ed 100644 (file)
@@ -575,8 +575,14 @@ int MDLog::trim_all()
            << "/" << expiring_segments.size()
            << "/" << expired_segments.size() << dendl;
 
+  uint64_t safe_pos = journaler->get_write_safe_pos();
+  uint64_t last_seq = 0;
+  if (!segments.empty())
+    last_seq = get_last_segment_seq();
+
   map<uint64_t,LogSegment*>::iterator p = segments.begin();
-  for (; (p != segments.end()) && (p->second != peek_current_segment());) {
+  while (p != segments.end() &&
+        p->first < last_seq && p->second->end <= safe_pos) {
     LogSegment *ls = p->second;
     ++p;
 
@@ -599,11 +605,11 @@ int MDLog::trim_all()
       expiring_events += ls->num_events;
       submit_mutex.Unlock();
 
-      uint64_t last_seq = ls->seq;
+      uint64_t next_seq = ls->seq + 1;
       try_expire(ls, CEPH_MSG_PRIO_DEFAULT);
 
       submit_mutex.Lock();
-      p = segments.lower_bound(last_seq + 1);
+      p = segments.lower_bound(next_seq);
     }
   }