]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
cephfs: store fs names associated with local MDSMap in MDSRank
authorDouglas Fuller <dfuller@redhat.com>
Thu, 7 Mar 2019 15:15:33 +0000 (10:15 -0500)
committerRishabh Dave <ridave@redhat.com>
Thu, 10 Sep 2020 11:40:51 +0000 (17:10 +0530)
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 <dfuller@redhat.com>
Signed-off-by: Rishabh Dave <ridave@redhat.com>
src/mds/MDSDaemon.cc
src/mds/MDSRank.cc
src/mds/MDSRank.h
src/messages/MMDSMap.h
src/mon/MDSMonitor.cc

index 924a54441e9887b4822ffc1722247ccf3e9ca98a..faa15feeaa25db7badcd9ba235df76485da639b2 100644 (file)
@@ -747,12 +747,11 @@ void MDSDaemon::handle_mds_map(const cref_t<MMDSMap> &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();
index b8587ac865b5ddd070aa4d395466a2c5df866266..6f61d1d5f519fbd2fb0da0201327ee3b489a3abb 100644 (file)
@@ -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<Message>& 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<MMDSMap>(monc->get_fsid(), *mdsmap);
+    auto _m = make_message<MMDSMap>(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<Session*> clients;
   sessionmap.get_client_session_set(clients);
   for (const auto &session : clients) {
-    auto m = make_message<MMDSMap>(monc->get_fsid(), *mdsmap);
+    auto m = make_message<MMDSMap>(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);
index 9b7ea2c124e98e10f9a335fe219542744277f542..ceaaf1148a3ef427feb2b5537a11b684aa318819 100644 (file)
@@ -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_,
index 9087df6c07c2d72baead500ef67b2b914389e660..fffbf2dd7d99ef683999015b6effe32d346ac95f 100644 (file)
 
 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<class T, typename... Args>
index 4010f1ee39febe3801e8db4af40f69e3464b3f55..391c5c7c47bc0b068f7500f3c22b06401d5fbbbc 100644 (file)
@@ -1790,7 +1790,8 @@ void MDSMonitor::check_sub(Subscription *sub)
     if (sub->next > mds_map->epoch) {
       return;
     }
-    auto msg = make_message<MMDSMap>(mon->monmap->fsid, *mds_map);
+    auto msg = make_message<MMDSMap>(mon->monmap->fsid, *mds_map,
+                                    mds_map->fs_name);
 
     sub->session->con->send_message(msg.detach());
     if (sub->onetime) {