]> git.proxmox.com Git - ceph.git/blobdiff - ceph/src/mon/FSCommands.cc
update sources to v12.1.2
[ceph.git] / ceph / src / mon / FSCommands.cc
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;
 }