]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: add crush ruleset name to osd pool create
authorLoic Dachary <loic@dachary.org>
Sun, 16 Mar 2014 15:24:58 +0000 (16:24 +0100)
committerLoic Dachary <loic@dachary.org>
Mon, 17 Mar 2014 23:23:42 +0000 (00:23 +0100)
The ruleset to be used for the new erasure coded pool was expected in
the properties, under the name crush_ruleset. It does not belong to the
erasure code profile and needs to be added to the prototype explicitly.

The crush ruleset name is added to the prototype of the prepare_new_pool
and prepare_pool_crush_ruleset methods.

Signed-off-by: Loic Dachary <loic@dachary.org>
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h
src/test/pybind/test_ceph_argparse.py

index 32928ea20b3ae0c3c26d8f57105a4ce5723433ab..f71b976191e8ed922af2dfa8fd647ca7a55485c5 100644 (file)
@@ -528,6 +528,7 @@ COMMAND("osd pool create " \
        "name=pgp_num,type=CephInt,range=0,req=false " \
         "name=pool_type,type=CephChoices,strings=replicated|erasure,req=false " \
        "name=erasure_code_profile,type=CephString,req=false,goodchars=[A-Za-z0-9-_.=] " \
+       "name=ruleset,type=CephString,req=false,goodchars=[A-Za-z0-9-_.=]", \
        "create pool", "osd", "rw", "cli,rest")
 COMMAND("osd pool delete " \
        "name=pool,type=CephPoolname " \
index 24ba98f6e4d4c28b1f21cb2cb1abe9f644664ff1..b6ab87bbbd63242833c22fc7ebbe7bcca84f9e43 100644 (file)
@@ -2848,14 +2848,17 @@ int OSDMonitor::prepare_new_pool(MPoolOp *m)
     return -EPERM;
   string erasure_code_profile;
   stringstream ss;
+  string ruleset_name;
   if (m->auid)
-    return prepare_new_pool(m->name, m->auid, m->crush_rule, 0, 0,
-                            properties, pg_pool_t::TYPE_REPLICATED, ss);
+    return prepare_new_pool(m->name, m->auid, m->crush_rule, ruleset_name,
+                           0, 0,
                             erasure_code_profile,
+                           pg_pool_t::TYPE_REPLICATED, ss);
   else
-    return prepare_new_pool(m->name, session->auid, m->crush_rule, 0, 0,
-                            properties, pg_pool_t::TYPE_REPLICATED, ss);
+    return prepare_new_pool(m->name, session->auid, m->crush_rule, ruleset_name,
+                           0, 0,
                             erasure_code_profile,
+                           pg_pool_t::TYPE_REPLICATED, ss);
 }
 
 int OSDMonitor::crush_ruleset_create_erasure(const string &name,
@@ -3062,6 +3065,7 @@ int OSDMonitor::prepare_pool_stripe_width(const unsigned pool_type,
 int OSDMonitor::prepare_pool_crush_ruleset(const string &poolstr,
                                           const unsigned pool_type,
                                           const string &erasure_code_profile,
+                                          const string &ruleset_name,
                                           int *crush_ruleset,
                                           stringstream &ss)
 {
@@ -3073,23 +3077,13 @@ int OSDMonitor::prepare_pool_crush_ruleset(const string &poolstr,
       break;
     case pg_pool_t::TYPE_ERASURE:
       {
-       string ruleset;
-       map<string,string>::const_iterator i = properties.find("crush_ruleset");
-       if (i == properties.end()) {
-         dout(1) << "prepare_pool_crush_ruleset: implicitly use ruleset "
-                 << "named after the pool: " << poolstr << dendl;
-         ruleset = poolstr;
-       } else {
-         ruleset = i->second;
-       }
        int err = crush_ruleset_create_erasure(ruleset_name,
                                               erasure_code_profile,
                                               crush_ruleset, ss);
        switch (err) {
        case -EALREADY:
          dout(20) << "prepare_pool_crush_ruleset: ruleset "
-                  << ruleset << " try again" << dendl;
+                  << ruleset_name << " try again" << dendl;
        case 0:
          // need to wait for the crush rule to be proposed before proceeding
          err = -EAGAIN;
@@ -3114,7 +3108,8 @@ int OSDMonitor::prepare_pool_crush_ruleset(const string &poolstr,
 /**
  * @param name The name of the new pool
  * @param auid The auid of the pool owner. Can be -1
- * @param crush_rule The crush rule to use. If <0, will use the system default
+ * @param crush_ruleset The crush rule to use. If <0, will use the system default
+ * @param crush_ruleset_name The crush rule to use, if crush_rulset <0
  * @param pg_num The pg_num to use. If set to 0, will use the system default
  * @param pgp_num The pgp_num to use. If set to 0, will use the system default
  * @param erasure_code_profile The profile name in OSDMap to be used for erasure code
@@ -3123,7 +3118,9 @@ int OSDMonitor::prepare_pool_crush_ruleset(const string &poolstr,
  *
  * @return 0 on success, negative errno on failure.
  */
-int OSDMonitor::prepare_new_pool(string& name, uint64_t auid, int crush_ruleset,
+int OSDMonitor::prepare_new_pool(string& name, uint64_t auid,
+                                int crush_ruleset,
+                                const string &crush_ruleset_name,
                                  unsigned pg_num, unsigned pgp_num,
                                 const string &erasure_code_profile,
                                  const unsigned pool_type,
@@ -3131,6 +3128,7 @@ int OSDMonitor::prepare_new_pool(string& name, uint64_t auid, int crush_ruleset,
 {
   int r;
   r = prepare_pool_crush_ruleset(pool_type, erasure_code_profile,
+                                crush_ruleset_name, &crush_ruleset, ss);
   if (r)
     return r;
   unsigned size;
@@ -4567,8 +4565,12 @@ done:
       goto reply;
     }
 
+    string ruleset_name;
+    cmd_getval(g_ceph_context, cmdmap, "ruleset", ruleset_name);
+
     err = prepare_new_pool(poolstr, 0, // auid=0 for admin created pool
-                          -1,         // default crush rule
+                          -1, // default crush rule
+                          ruleset_name,
                           pg_num, pgp_num,
                           erasure_code_profile, pool_type,
                           ss);
index cd1dba965fb5ce7e5ed943f0d85e8222e1752549..1d781b81b0d98f7ab0689832aab3e52d4ca7df2c 100644 (file)
@@ -253,6 +253,7 @@ private:
   int prepare_pool_crush_ruleset(const string &poolstr,
                                 const unsigned pool_type,
                                 const string &erasure_code_profile,
+                                const string &ruleset_name,
                                 int *crush_ruleset,
                                 stringstream &ss);
   bool erasure_code_profile_in_use(const map<int64_t, pg_pool_t> &pools,
@@ -269,7 +270,9 @@ private:
                                const string &erasure_code_profile,
                                unsigned *stripe_width,
                                stringstream &ss);
-  int prepare_new_pool(string& name, uint64_t auid, int crush_ruleset,
+  int prepare_new_pool(string& name, uint64_t auid,
+                      int crush_ruleset,
+                      const string &crush_ruleset_name,
                        unsigned pg_num, unsigned pgp_num,
                       const string &erasure_code_profile,
                        const unsigned pool_type,
index 9d0b00188dc31a8ccfa0e3a793cea368d9b38284..b21f81f59620b622140e2fdf0592d417cb61cc43 100755 (executable)
@@ -944,12 +944,29 @@ class TestOSD(TestArgparse):
                                    'poolname', '128', '128'])
         self.assert_valid_command(['osd', 'pool', 'create',
                                    'poolname', '128', '128',
-                                   'whatever'])
+                                   'replicated'])
+        self.assert_valid_command(['osd', 'pool', 'create',
+                                   'poolname', '128', '128',
+                                   'erasure', 'profile', 'ruleset'])
         assert_equal({}, validate_command(sigdict, ['osd', 'pool', 'create']))
         assert_equal({}, validate_command(sigdict, ['osd', 'pool', 'create',
                                                     'poolname']))
         assert_equal({}, validate_command(sigdict, ['osd', 'pool', 'create',
                                                     'poolname', '-1']))
+        assert_equal({}, validate_command(sigdict, ['osd', 'pool', 'create',
+                                                    'poolname',
+                                                    '128', '128',
+                                                    'erasure', '!!!']))
+        assert_equal({}, validate_command(sigdict, ['osd', 'pool', 'create',
+                                                    'poolname',
+                                                    '128', '128',
+                                                    'erasure', 'profile',
+                                                    '!!!']))
+        assert_equal({}, validate_command(sigdict, ['osd', 'pool', 'create',
+                                                    'poolname',
+                                                    '128', '128',
+                                                    'INVALID', 'profile',
+                                                    'ruleset']))
 
     def test_pool_delete(self):
         self.assert_valid_command(['osd', 'pool', 'delete',