From 51af2346fdfd3f87f55bd75b161658609e88fd6b Mon Sep 17 00:00:00 2001 From: Douglas Fuller Date: Thu, 7 Mar 2019 10:15:33 -0500 Subject: [PATCH] cephfs: store fs names associated with local MDSMap in MDSRank Modify MMDSMap to include the name of the file system from the FSMap when bringing up a new MDS. Store the name in the MDSRank structure for use in security validation. Fixes: http://tracker.ceph.com/issues/15070 Signed-off-by: Douglas Fuller Signed-off-by: Rishabh Dave --- src/mds/MDSDaemon.cc | 11 +++++------ src/mds/MDSRank.cc | 13 +++++++++---- src/mds/MDSRank.h | 4 ++++ src/messages/MMDSMap.h | 14 +++++++++++--- src/mon/MDSMonitor.cc | 3 ++- 5 files changed, 31 insertions(+), 14 deletions(-) diff --git a/src/mds/MDSDaemon.cc b/src/mds/MDSDaemon.cc index 924a54441e988..faa15feeaa25d 100644 --- a/src/mds/MDSDaemon.cc +++ b/src/mds/MDSDaemon.cc @@ -747,12 +747,11 @@ void MDSDaemon::handle_mds_map(const cref_t &m) // Did I previously not hold a rank? Initialize! if (mds_rank == NULL) { - mds_rank = new MDSRankDispatcher( - whoami, mds_lock, clog, - timer, beacon, mdsmap, messenger, monc, &mgrc, - new LambdaContext([this](int r){respawn();}), - new LambdaContext([this](int r){suicide();}), - ioctx); + mds_rank = new MDSRankDispatcher(whoami, m->map_fs_name, mds_lock, clog, + timer, beacon, mdsmap, messenger, monc, &mgrc, + new LambdaContext([this](int r){respawn();}), + new LambdaContext([this](int r){suicide();}), + ioctx); dout(10) << __func__ << ": initializing MDS rank " << mds_rank->get_nodeid() << dendl; mds_rank->init(); diff --git a/src/mds/MDSRank.cc b/src/mds/MDSRank.cc index b8587ac865b5d..6f61d1d5f519f 100644 --- a/src/mds/MDSRank.cc +++ b/src/mds/MDSRank.cc @@ -476,6 +476,7 @@ private: MDSRank::MDSRank( mds_rank_t whoami_, + std::string fs_name_, ceph::mutex &mds_lock_, LogChannelRef &clog_, SafeTimer &timer_, @@ -487,7 +488,7 @@ MDSRank::MDSRank( Context *respawn_hook_, Context *suicide_hook_, boost::asio::io_context& ioc) : - cct(msgr->cct), mds_lock(mds_lock_), clog(clog_), + cct(msgr->cct), fs_name(fs_name_), mds_lock(mds_lock_), clog(clog_), timer(timer_), mdsmap(mdsmap_), objecter(new Objecter(g_ceph_context, msgr, monc_, ioc, 0, 0)), damage_table(whoami_), sessionmap(this), @@ -1417,7 +1418,8 @@ void MDSRank::send_message_mds(const ref_t& m, mds_rank_t mds) // send mdsmap first? auto addrs = mdsmap->get_addrs(mds); if (mds != whoami && peer_mdsmap_epoch[mds] < mdsmap->get_epoch()) { - auto _m = make_message(monc->get_fsid(), *mdsmap); + auto _m = make_message(monc->get_fsid(), *mdsmap, + std::string(mdsmap->get_fs_name())); send_message_mds(_m, addrs); peer_mdsmap_epoch[mds] = mdsmap->get_epoch(); } @@ -3187,6 +3189,7 @@ void MDSRank::command_dump_inode(Formatter *f, const cmdmap_t &cmdmap, std::ostr void MDSRank::dump_status(Formatter *f) const { + f->dump_string("fs_name", fs_name); if (state == MDSMap::STATE_REPLAY || state == MDSMap::STATE_STANDBY_REPLAY) { mdlog->dump_replay_status(f); @@ -3567,7 +3570,8 @@ void MDSRank::bcast_mds_map() set clients; sessionmap.get_client_session_set(clients); for (const auto &session : clients) { - auto m = make_message(monc->get_fsid(), *mdsmap); + auto m = make_message(monc->get_fsid(), *mdsmap, + std::string(mdsmap->get_fs_name())); session->get_connection()->send_message2(std::move(m)); } last_client_mdsmap_bcast = mdsmap->get_epoch(); @@ -3575,6 +3579,7 @@ void MDSRank::bcast_mds_map() MDSRankDispatcher::MDSRankDispatcher( mds_rank_t whoami_, + std::string fs_name_, ceph::mutex &mds_lock_, LogChannelRef &clog_, SafeTimer &timer_, @@ -3586,7 +3591,7 @@ MDSRankDispatcher::MDSRankDispatcher( Context *respawn_hook_, Context *suicide_hook_, boost::asio::io_context& ioc) - : MDSRank(whoami_, mds_lock_, clog_, timer_, beacon_, mdsmap_, + : MDSRank(whoami_, fs_name_, mds_lock_, clog_, timer_, beacon_, mdsmap_, msgr, monc_, mgrc, respawn_hook_, suicide_hook_, ioc) { g_conf().add_observer(this); diff --git a/src/mds/MDSRank.h b/src/mds/MDSRank.h index 9b7ea2c124e98..ceaaf1148a3ef 100644 --- a/src/mds/MDSRank.h +++ b/src/mds/MDSRank.h @@ -156,6 +156,7 @@ class MDSRank { MDSRank( mds_rank_t whoami_, + std::string fs_name_, ceph::mutex &mds_lock_, LogChannelRef &clog_, SafeTimer &timer_, @@ -169,6 +170,7 @@ class MDSRank { boost::asio::io_context& ioc); mds_rank_t get_nodeid() const { return whoami; } + std::string_view get_fs_name() const { return fs_name; } int64_t get_metadata_pool(); mono_time get_starttime() const { @@ -431,6 +433,7 @@ class MDSRank { friend class C_MDS_MonCommand; const mds_rank_t whoami; + std::string fs_name; ~MDSRank(); @@ -646,6 +649,7 @@ class MDSRankDispatcher : public MDSRank, public md_config_obs_t public: MDSRankDispatcher( mds_rank_t whoami_, + std::string fs_name, ceph::mutex &mds_lock_, LogChannelRef &clog_, SafeTimer &timer_, diff --git a/src/messages/MMDSMap.h b/src/messages/MMDSMap.h index 9087df6c07c2d..fffbf2dd7d99e 100644 --- a/src/messages/MMDSMap.h +++ b/src/messages/MMDSMap.h @@ -22,12 +22,13 @@ class MMDSMap : public SafeMessage { private: - static constexpr int HEAD_VERSION = 1; + static constexpr int HEAD_VERSION = 2; static constexpr int COMPAT_VERSION = 1; public: uuid_d fsid; epoch_t epoch = 0; ceph::buffer::list encoded; + std::string map_fs_name; version_t get_epoch() const { return epoch; } const ceph::buffer::list& get_encoded() const { return encoded; } @@ -35,12 +36,15 @@ public: protected: MMDSMap() : SafeMessage{CEPH_MSG_MDS_MAP, HEAD_VERSION, COMPAT_VERSION} {} - MMDSMap(const uuid_d &f, const MDSMap &mm) : + + MMDSMap(const uuid_d &f, const MDSMap &mm, + const std::string mf = std::string()) : SafeMessage{CEPH_MSG_MDS_MAP, HEAD_VERSION, COMPAT_VERSION}, - fsid(f) { + fsid(f), map_fs_name(mf) { epoch = mm.get_epoch(); mm.encode(encoded, -1); // we will reencode with fewer features as necessary } + ~MMDSMap() override {} public: @@ -56,6 +60,9 @@ public: decode(fsid, p); decode(epoch, p); decode(encoded, p); + if (header.version >= 2) { + decode(map_fs_name, p); + } } void encode_payload(uint64_t features) override { using ceph::encode; @@ -72,6 +79,7 @@ public: m.encode(encoded, features); } encode(encoded, payload); + encode(map_fs_name, payload); } private: template diff --git a/src/mon/MDSMonitor.cc b/src/mon/MDSMonitor.cc index 4010f1ee39feb..391c5c7c47bc0 100644 --- a/src/mon/MDSMonitor.cc +++ b/src/mon/MDSMonitor.cc @@ -1790,7 +1790,8 @@ void MDSMonitor::check_sub(Subscription *sub) if (sub->next > mds_map->epoch) { return; } - auto msg = make_message(mon->monmap->fsid, *mds_map); + auto msg = make_message(mon->monmap->fsid, *mds_map, + mds_map->fs_name); sub->session->con->send_message(msg.detach()); if (sub->onetime) { -- 2.39.5