From: John Spray Date: Thu, 23 Feb 2017 16:04:20 +0000 (+0000) Subject: mds: update osdmap epoch barrier on eviction X-Git-Tag: v12.1.0~465^2~13 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=05b171b5530ee25164f1a5294bd1a53c549fb3e9;p=ceph-ci.git mds: update osdmap epoch barrier on eviction Signed-off-by: John Spray --- diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index f828f863520..2364715a306 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -2653,14 +2653,23 @@ bool MDSRankDispatcher::kill_session(int64_t session_id, bool wait, std::strings on_blacklist_done = &on_blacklist_inline; } else { on_blacklist_done = new FunctionContext([this, session_id](int r) { - Session *session = sessionmap.get_session( - entity_name_t(CEPH_ENTITY_TYPE_CLIENT, session_id)); - if (session) { - server->kill_session(session, NULL); - } else { - dout(1) << "session " << session_id << " was removed while we waited " - "for blacklist" << dendl; - } + objecter->wait_for_latest_osdmap( + new FunctionContext([this, session_id](int r) { + auto epoch = objecter->with_osdmap([](const OSDMap &o){ + return o.get_epoch(); + }); + + set_osd_epoch_barrier(epoch); + + Session *session = sessionmap.get_session( + entity_name_t(CEPH_ENTITY_TYPE_CLIENT, session_id)); + if (session) { + server->kill_session(session, NULL); + } else { + dout(1) << "session " << session_id << " was removed while we waited " + "for blacklist" << dendl; + } + })); }); } @@ -2676,6 +2685,19 @@ bool MDSRankDispatcher::kill_session(int64_t session_id, bool wait, std::strings return false; } + // Wait for latest OSDMap so that we can learn the OSDMap epoch in + // which the blacklist happened + C_SaferCond on_latest_osdmap; + objecter->wait_for_latest_osdmap(&on_latest_osdmap); + mds_lock.Unlock(); + on_latest_osdmap.wait(); + mds_lock.Lock(); + auto epoch = objecter->with_osdmap([](const OSDMap &o){ + return o.get_epoch(); + }); + + set_osd_epoch_barrier(epoch); + // We dropped mds_lock, so check that session still exists session = sessionmap.get_session(entity_name_t(CEPH_ENTITY_TYPE_CLIENT, session_id));