From: Yan, Zheng Date: Tue, 2 Dec 2014 05:59:11 +0000 (+0800) Subject: mds: fix race of trimming log segments X-Git-Tag: v0.90~19^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=refs%2Fpull%2F3052%2Fhead;p=ceph.git mds: fix race of trimming log segments 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 --- diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 456e97d551c7..538f4bdceb91 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -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::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); } }