]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: OSDMonitor: add optional 'pool type' arg to 'osd pool create'
authorJoao Eduardo Luis <joao.luis@inktank.com>
Tue, 17 Dec 2013 18:00:50 +0000 (18:00 +0000)
committerJoao Eduardo Luis <joao.luis@inktank.com>
Thu, 19 Dec 2013 02:21:05 +0000 (02:21 +0000)
Allow specifying 'rep', 'raid4' and 'erasure'.
Only allow setting type 'erasure' if all up osds support erasure codes.

Signed-off-by: Joao Eduardo Luis <joao.luis@inktank.com>
src/mon/MonCommands.h
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index ec1baf2d2bd9bc970528f49726ee4c1c192990ab..58304b7bf015b1402466401c03862a92c9844a8f 100644 (file)
@@ -496,6 +496,7 @@ COMMAND("osd pool create " \
        "name=pool,type=CephPoolname " \
        "name=pg_num,type=CephInt,range=0 " \
        "name=pgp_num,type=CephInt,range=0,req=false " \
+        "name=pool_type,type=CephChoices,strings=rep|raid4|erasure,req=false " \
        "name=properties,type=CephString,n=N,req=false,goodchars=[A-Za-z0-9-_.=]", \
        "create pool", "osd", "rw", "cli,rest")
 COMMAND("osd pool delete " \
index d2bde25a46d196b1ca5da7bae82d90ed59c337fa..73f9f04516f766e2e9fc6820144b948c54b2eeee 100644 (file)
@@ -2725,9 +2725,11 @@ int OSDMonitor::prepare_new_pool(MPoolOp *m)
     return -EPERM;
   vector<string> properties;
   if (m->auid)
-    return prepare_new_pool(m->name, m->auid, m->crush_rule, 0, 0, properties);
+    return prepare_new_pool(m->name, m->auid, m->crush_rule, 0, 0,
+                            properties, pg_pool_t::TYPE_REP);
   else
-    return prepare_new_pool(m->name, session->auid, m->crush_rule, 0, 0, properties);
+    return prepare_new_pool(m->name, session->auid, m->crush_rule, 0, 0,
+                            properties, pg_pool_t::TYPE_REP);
 }
 
 /**
@@ -2742,7 +2744,8 @@ int OSDMonitor::prepare_new_pool(MPoolOp *m)
  */
 int OSDMonitor::prepare_new_pool(string& name, uint64_t auid, int crush_rule,
                                  unsigned pg_num, unsigned pgp_num,
-                                const vector<string> &properties)
+                                const vector<string> &properties,
+                                 const unsigned pool_type)
 {
   for (map<int64_t,string>::iterator p = pending_inc.new_pool_names.begin();
        p != pending_inc.new_pool_names.end();
@@ -2756,7 +2759,7 @@ int OSDMonitor::prepare_new_pool(string& name, uint64_t auid, int crush_rule,
   int64_t pool = ++pending_inc.new_pool_max;
   pg_pool_t empty;
   pg_pool_t *pi = pending_inc.get_new_pool(pool, &empty);
-  pi->type = pg_pool_t::TYPE_REP;
+  pi->type = pool_type;
   pi->flags = g_conf->osd_pool_default_flags;
   if (g_conf->osd_pool_default_flag_hashpspool)
     pi->flags |= pg_pool_t::FLAG_HASHPSPOOL;
@@ -3949,10 +3952,50 @@ done:
     vector<string> properties;
     cmd_getval(g_ceph_context, cmdmap, "properties", properties);
 
+    string pool_type_str;
+    cmd_getval(g_ceph_context, cmdmap, "pool_type", pool_type_str);
+    int pool_type;
+    if (pool_type_str.empty() || pool_type_str == "rep") {
+      pool_type = pg_pool_t::TYPE_REP;
+    } else if (pool_type_str == "raid4") {
+      pool_type = pg_pool_t::TYPE_RAID4;
+    } else if (pool_type_str == "erasure") {
+
+      // check if all up osds support erasure coding
+      set<int32_t> up_osds;
+      osdmap.get_up_osds(up_osds);
+      stringstream ec_unsupported_ss;
+      int ec_unsupported_count = 0;
+
+      for (set<int32_t>::iterator it = up_osds.begin();
+           it != up_osds.end(); it ++) {
+        const osd_xinfo_t &xi = osdmap.get_xinfo(*it);
+        if (!(xi.features & CEPH_FEATURE_OSD_ERASURE_CODES)) {
+          if (ec_unsupported_count > 0)
+            ec_unsupported_ss << ", ";
+          ec_unsupported_ss << "osd." << *it;
+          ec_unsupported_count ++;
+        }
+      }
+
+      if (ec_unsupported_count > 0) {
+        ss << "unable to create erasure pool; unsupported by: "
+           << ec_unsupported_ss.str();
+        err = -ENOTSUP;
+        goto reply;
+      }
+
+      pool_type = pg_pool_t::TYPE_ERASURE;
+    } else {
+      ss << "unknown pool type '" << pool_type_str << "'";
+      err = -EINVAL;
+      goto reply;
+    }
+
     err = prepare_new_pool(poolstr, 0, // auid=0 for admin created pool
                           -1,         // default crush rule
                           pg_num, pgp_num,
-                          properties);
+                          properties, pool_type);
     if (err < 0 && err != -EEXIST) {
       goto reply;
     }
index 9713a01b560656523b8dd15619822ec9608d793f..0bd1f42e17c026b271e8ab3f0015938d0378ea83 100644 (file)
@@ -240,7 +240,8 @@ private:
   bool prepare_pool_op_delete(MPoolOp *m);
   int prepare_new_pool(string& name, uint64_t auid, int crush_rule,
                        unsigned pg_num, unsigned pgp_num,
-                      const vector<string> &properties);
+                      const vector<string> &properties,
+                       const unsigned pool_type);
   int prepare_new_pool(MPoolOp *m);
 
   void update_pool_flags(int64_t pool_id, uint64_t flags);