From: Yan, Zheng Date: Tue, 29 Nov 2016 08:15:48 +0000 (+0800) Subject: mds: don't access mdsmap from log submit thread X-Git-Tag: v11.1.0~36^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=96e3d592711522129f104ae26f376068ca45255a;p=ceph.git mds: don't access mdsmap from log submit thread the log submit thread does not hold the big mds_lock. Fixes: http://tracker.ceph.com/issues/18047 Signed-off-by: Yan, Zheng --- diff --git a/src/mds/MDLog.cc b/src/mds/MDLog.cc index 972b9612d92a..64ebda23ea0f 100644 --- a/src/mds/MDLog.cc +++ b/src/mds/MDLog.cc @@ -297,6 +297,7 @@ void MDLog::_submit_entry(LogEvent *le, MDSLogContextBase *c) le->update_segment(); le->set_stamp(ceph_clock_now(g_ceph_context)); + mdsmap_up_features = mds->mdsmap->get_up_features(); pending_events[ls->seq].push_back(PendingEvent(le, c)); num_events++; @@ -376,6 +377,7 @@ void MDLog::_submit_thread() continue; } + int64_t features = mdsmap_up_features; PendingEvent data = it->second.front(); it->second.pop_front(); @@ -386,7 +388,7 @@ void MDLog::_submit_thread() LogSegment *ls = le->_segment; // encode it, with event type bufferlist bl; - le->encode_with_header(bl, mds->mdsmap->get_up_features()); + le->encode_with_header(bl, features); uint64_t write_pos = journaler->get_write_pos(); diff --git a/src/mds/MDLog.h b/src/mds/MDLog.h index d2fb7d54c12f..0060c3a2364e 100644 --- a/src/mds/MDLog.h +++ b/src/mds/MDLog.h @@ -134,6 +134,7 @@ protected: PendingEvent(LogEvent *e, MDSContext *c, bool f=false) : le(e), fin(c), flush(f) {} }; + int64_t mdsmap_up_features; map > pending_events; // log segment -> event list Mutex submit_mutex; Cond submit_cond; @@ -202,6 +203,7 @@ public: already_replayed(false), recovery_thread(this), event_seq(0), expiring_events(0), expired_events(0), + mdsmap_up_features(0), submit_mutex("MDLog::submit_mutex"), submit_thread(this), cur_event(NULL) { }