]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: auto-enable CephFS on pools when using "fs new"/"fs add_data_pool"
authorJason Dillaman <dillaman@redhat.com>
Tue, 20 Jun 2017 16:13:42 +0000 (12:13 -0400)
committerJason Dillaman <dillaman@redhat.com>
Wed, 19 Jul 2017 17:13:01 +0000 (13:13 -0400)
Signed-off-by: Jason Dillaman <dillaman@redhat.com>
src/mon/FSCommands.cc
src/mon/FSCommands.h
src/mon/MDSMonitor.cc
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index 4f9806bb7c3f6f70a1d3472b94697c8897604eca..4b0445fb1347e187dce238693df22e7b4af85094 100644 (file)
@@ -80,11 +80,15 @@ class FlagSetHandler : public FileSystemCommandHandler
 class FsNewHandler : public FileSystemCommandHandler
 {
   public:
-  FsNewHandler()
-    : FileSystemCommandHandler("fs new")
+  FsNewHandler(Paxos *paxos)
+    : FileSystemCommandHandler("fs new"), m_paxos(paxos)
   {
   }
 
+  bool batched_propose() override {
+    return true;
+  }
+
   int handle(
       Monitor *mon,
       FSMap &fsmap,
@@ -92,6 +96,8 @@ class FsNewHandler : public FileSystemCommandHandler
       map<string, cmd_vartype> &cmdmap,
       std::stringstream &ss) override
   {
+    assert(m_paxos->is_plugged());
+
     string metadata_name;
     cmd_getval(g_ceph_context, cmdmap, "metadata", metadata_name);
     int64_t metadata = mon->osdmon()->osdmap.lookup_pg_pool_name(metadata_name);
@@ -100,12 +106,13 @@ class FsNewHandler : public FileSystemCommandHandler
       return -ENOENT;
     }
 
-    string force;
-    cmd_getval(g_ceph_context,cmdmap, "force", force);
+    string force_str;
+    cmd_getval(g_ceph_context,cmdmap, "force", force_str);
+    bool force = (force_str == "--force");
     const pool_stat_t *stat = mon->pgservice->get_pool_stat(metadata);
     if (stat) {
       int64_t metadata_num_objects = stat->stats.sum.num_objects;
-      if (force != "--force" && metadata_num_objects > 0) {
+      if (!force && metadata_num_objects > 0) {
        ss << "pool '" << metadata_name
           << "' already contains some objects. Use an empty pool instead.";
        return -EINVAL;
@@ -123,7 +130,7 @@ class FsNewHandler : public FileSystemCommandHandler
       ss << "pool '" << data_name << "' has id 0, which CephFS does not allow. Use another pool or recreate it to get a non-zero pool id.";
       return -EINVAL;
     }
-   
+
     string fs_name;
     cmd_getval(g_ceph_context, cmdmap, "fs_name", fs_name);
     if (fs_name.empty()) {
@@ -177,22 +184,30 @@ class FsNewHandler : public FileSystemCommandHandler
     // we believe we must.  bailing out *after* we request the proposal is
     // bad business as we could have changed the osdmon's state and ending up
     // returning an error to the user.
-    int r = _check_pool(mon->osdmon()->osdmap, data, false, &ss);
+    int r = _check_pool(mon->osdmon()->osdmap, data, false, force, &ss);
     if (r < 0) {
       return r;
     }
 
-    r = _check_pool(mon->osdmon()->osdmap, metadata, true, &ss);
+    r = _check_pool(mon->osdmon()->osdmap, metadata, true, force, &ss);
     if (r < 0) {
       return r;
     }
 
+    mon->osdmon()->do_application_enable(data,
+                                         pg_pool_t::APPLICATION_NAME_CEPHFS);
+    mon->osdmon()->do_application_enable(metadata,
+                                         pg_pool_t::APPLICATION_NAME_CEPHFS);
+
     // All checks passed, go ahead and create.
     fsmap.create_filesystem(fs_name, metadata, data,
                             mon->get_quorum_con_features());
     ss << "new fs with metadata pool " << metadata << " and data pool " << data;
     return 0;
   }
+
+private:
+  Paxos *m_paxos;
 };
 
 class SetHandler : public FileSystemCommandHandler
@@ -447,10 +462,14 @@ public:
 class AddDataPoolHandler : public FileSystemCommandHandler
 {
   public:
-  AddDataPoolHandler()
-    : FileSystemCommandHandler("fs add_data_pool")
+  AddDataPoolHandler(Paxos *paxos)
+    : FileSystemCommandHandler("fs add_data_pool"), m_paxos(paxos)
   {}
 
+  bool batched_propose() override {
+    return true;
+  }
+
   int handle(
       Monitor *mon,
       FSMap &fsmap,
@@ -458,6 +477,8 @@ class AddDataPoolHandler : public FileSystemCommandHandler
       map<string, cmd_vartype> &cmdmap,
       std::stringstream &ss) override
   {
+    assert(m_paxos->is_plugged());
+
     string poolname;
     cmd_getval(g_ceph_context, cmdmap, "pool", poolname);
 
@@ -484,7 +505,7 @@ class AddDataPoolHandler : public FileSystemCommandHandler
       }
     }
 
-    int r = _check_pool(mon->osdmon()->osdmap, poolid, false, &ss);
+    int r = _check_pool(mon->osdmon()->osdmap, poolid, false, false, &ss);
     if (r != 0) {
       return r;
     }
@@ -495,6 +516,9 @@ class AddDataPoolHandler : public FileSystemCommandHandler
       return 0;
     }
 
+    mon->osdmon()->do_application_enable(poolid,
+                                         pg_pool_t::APPLICATION_NAME_CEPHFS);
+
     fsmap.modify_filesystem(
         fs->fscid,
         [poolid](std::shared_ptr<Filesystem> fs)
@@ -506,6 +530,9 @@ class AddDataPoolHandler : public FileSystemCommandHandler
 
     return 0;
   }
+
+private:
+  Paxos *m_paxos;
 };
 
 class SetDefaultHandler : public FileSystemCommandHandler
@@ -730,8 +757,9 @@ class LegacyHandler : public T
   std::string legacy_prefix;
 
   public:
-  LegacyHandler(const std::string &new_prefix)
-    : T()
+  template <typename... Args>
+  LegacyHandler(const std::string &new_prefix, Args&&... args)
+    : T(std::forward<Args>(args)...)
   {
     legacy_prefix = new_prefix;
   }
@@ -785,22 +813,23 @@ class AliasHandler : public T
 };
 
 
-std::list<std::shared_ptr<FileSystemCommandHandler> > FileSystemCommandHandler::load()
+std::list<std::shared_ptr<FileSystemCommandHandler> >
+FileSystemCommandHandler::load(Paxos *paxos)
 {
   std::list<std::shared_ptr<FileSystemCommandHandler> > handlers;
 
   handlers.push_back(std::make_shared<SetHandler>());
   handlers.push_back(std::make_shared<LegacyHandler<SetHandler> >("mds set"));
   handlers.push_back(std::make_shared<FlagSetHandler>());
-  handlers.push_back(std::make_shared<AddDataPoolHandler>());
+  handlers.push_back(std::make_shared<AddDataPoolHandler>(paxos));
   handlers.push_back(std::make_shared<LegacyHandler<AddDataPoolHandler> >(
-        "mds add_data_pool"));
+        "mds add_data_pool", paxos));
   handlers.push_back(std::make_shared<RemoveDataPoolHandler>());
   handlers.push_back(std::make_shared<LegacyHandler<RemoveDataPoolHandler> >(
         "mds remove_data_pool"));
   handlers.push_back(std::make_shared<LegacyHandler<RemoveDataPoolHandler> >(
         "mds rm_data_pool"));
-  handlers.push_back(std::make_shared<FsNewHandler>());
+  handlers.push_back(std::make_shared<FsNewHandler>(paxos));
   handlers.push_back(std::make_shared<RemoveFilesystemHandler>());
   handlers.push_back(std::make_shared<ResetFilesystemHandler>());
 
@@ -839,6 +868,7 @@ int FileSystemCommandHandler::_check_pool(
     OSDMap &osd_map,
     const int64_t pool_id,
     bool metadata,
+    bool force,
     std::stringstream *ss) const
 {
   assert(ss != NULL);
@@ -886,6 +916,14 @@ int FileSystemCommandHandler::_check_pool(
     return -EINVAL;
   }
 
+  if (!force && !pool->application_metadata.empty() &&
+      pool->application_metadata.count(
+        pg_pool_t::APPLICATION_NAME_CEPHFS) == 0) {
+    *ss << " pool '" << pool_name << "' (id '" << pool_id
+        << "') has a non-CephFS application enabled.";
+    return -EINVAL;
+  }
+
   // Nothing special about this pool, so it is permissible
   return 0;
 }
index 5c3079159f3b5e762e19a3e04be2081397f8dcc4..b6b029a17d3f06c3895005e39883faf04203110f 100644 (file)
@@ -52,6 +52,7 @@ protected:
       OSDMap &osd_map,
       const int64_t pool_id,
       bool metadata,
+      bool force,
       std::stringstream *ss) const;
 
   virtual std::string const &get_prefix() {return prefix;}
@@ -69,7 +70,11 @@ public:
     return get_prefix() == prefix_;
   }
 
-  static std::list<std::shared_ptr<FileSystemCommandHandler> > load();
+  static std::list<std::shared_ptr<FileSystemCommandHandler> > load(Paxos *paxos);
+
+  virtual bool batched_propose() {
+    return false;
+  }
 
   virtual int handle(
     Monitor *mon,
index d5a350efb37b7dd5e2f407704171193fc23ceb6e..690e20571a480c417129fb56375ca70218681f5e 100644 (file)
@@ -1284,9 +1284,18 @@ bool MDSMonitor::prepare_command(MonOpRequestRef op)
     return true;
   }
 
+  bool batched_propose = false;
   for (auto h : handlers) {
     if (h->can_handle(prefix)) {
+      batched_propose = h->batched_propose();
+      if (batched_propose) {
+        paxos->plug();
+      }
       r = h->handle(mon, pending_fsmap, op, cmdmap, ss);
+      if (batched_propose) {
+        paxos->unplug();
+      }
+
       if (r == -EAGAIN) {
         // message has been enqueued for retry; return.
         dout(4) << __func__ << " enqueue for retry by prepare_command" << dendl;
@@ -1340,6 +1349,9 @@ out:
     // success.. delay reply
     wait_for_finished_proposal(op, new Monitor::C_Command(mon, op, r, rs,
                                              get_last_committed() + 1));
+    if (batched_propose) {
+      force_immediate_propose();
+    }
     return true;
   } else {
     // reply immediately
@@ -2271,7 +2283,7 @@ bool MDSMonitor::try_standby_replay(
 MDSMonitor::MDSMonitor(Monitor *mn, Paxos *p, string service_name)
   : PaxosService(mn, p, service_name)
 {
-  handlers = FileSystemCommandHandler::load();
+  handlers = FileSystemCommandHandler::load(p);
 }
 
 void MDSMonitor::on_restart()
index 1c0caa7bfcbab771c743524c8d1acf5578f18caf..71a3b92c30e702468b0bdd91d398d006a4b1e4dd 100644 (file)
@@ -3115,6 +3115,27 @@ void OSDMonitor::check_pg_creates_sub(Subscription *sub)
   }
 }
 
+void OSDMonitor::do_application_enable(int64_t pool_id,
+                                       const std::string &app_name)
+{
+  assert(paxos->is_plugged());
+
+  dout(20) << __func__ << ": pool_id=" << pool_id << ", app_name=" << app_name
+           << dendl;
+
+  auto pp = osdmap.get_pg_pool(pool_id);
+  assert(pp != nullptr);
+
+  pg_pool_t p = *pp;
+  if (pending_inc.new_pools.count(pool_id)) {
+    p = pending_inc.new_pools[pool_id];
+  }
+
+  p.application_metadata.insert({app_name, {}});
+  p.last_change = pending_inc.epoch;
+  pending_inc.new_pools[pool_id] = p;
+}
+
 unsigned OSDMonitor::scan_for_creating_pgs(
   const mempool::osdmap::map<int64_t,pg_pool_t>& pools,
   const mempool::osdmap::set<int64_t>& removed_pools,
index e7a4c9f68365ce024d0ce05e86453e2b1b4d5570..ccc123188e72c13b28a22a66ba9836137b914856 100644 (file)
@@ -539,6 +539,8 @@ public:
   void check_osdmap_sub(Subscription *sub);
   void check_pg_creates_sub(Subscription *sub);
 
+  void do_application_enable(int64_t pool_id, const std::string &app_name);
+
   void add_flag(int flag) {
     if (!(osdmap.flags & flag)) {
       if (pending_inc.new_flags < 0)