]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: 'osd pool create foo'
authorSage Weil <sage@newdream.net>
Wed, 6 May 2009 21:41:42 +0000 (14:41 -0700)
committerSage Weil <sage@newdream.net>
Thu, 7 May 2009 22:32:02 +0000 (15:32 -0700)
src/TODO
src/mon/OSDMonitor.cc
src/mon/PGMonitor.cc

index d4c8b3f1164a56cfebaad0f6f15440c31d03a560..7a1b03315e98e1bcacad8862eb0c7fcc6c564a89 100644 (file)
--- a/src/TODO
+++ b/src/TODO
@@ -67,7 +67,8 @@ later
 - rename over old files should flush data, or revert back to old contents
 
 rados
-- create/destroy pool
+- destroy pool
+- shrink pool (pg merge)
 - pool auto resizing
 - c lib
 - pyexec
index 2d544633b382442a74353a17ff1664c2cb241cfc..8092afcb40c36e6716d3cf25875d7f59d4bd278d 100644 (file)
@@ -1102,64 +1102,92 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
        return true;
       }
     }
-    else if (m->cmd[1] == "pool" && m->cmd.size() >= 5) {
-      int pool = -1;
-      pg_pool_t *p = 0;
-      for (map<int,nstring>::iterator i = osdmap.pool_name.begin();
-          i != osdmap.pool_name.end();
-          i++) {
-       if (i->second == m->cmd[2]) {
-         pool = i->first;
-         p = &osdmap.pools[pool];
+    else if (m->cmd[1] == "pool" && m->cmd.size() >= 3) {
+      if (m->cmd[2] == "create" && m->cmd.size() >= 4) {
+       int pool = 1;
+       for (map<int,nstring>::iterator i = osdmap.pool_name.begin();
+            i != osdmap.pool_name.end();
+            i++) {
+         if (i->second == m->cmd[3]) {
+           ss << "pool '" << i->second << "' exists";
+           err = -EEXIST;
+           goto out;
+         }
+         if (i->first >= pool)
+           pool = i->first + 1;
        }
-      }
-      if (pool >= 0) {
-       int n = atoi(m->cmd[4].c_str());
-       if (n) {
-         if (m->cmd[3] == "size") {
-           pending_inc.new_pools[pool] = *p;
-           pending_inc.new_pools[pool].v.size = n;
-           ss << "set pool " << pool << " size to " << n;
-           getline(ss, rs);
-           paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs));
-           return true;
-         } else if (m->cmd[3] == "pg_num") {
-           if (n <= p->get_pg_num()) {
-             ss << "specified pg_num " << n << " <= current " << p->get_pg_num();
-           } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) {
-             ss << "currently creating pgs, wait";
-             err = -EAGAIN;
-           } else {
-             pending_inc.new_pools[pool] = osdmap.pools[pool];
-             pending_inc.new_pools[pool].v.pg_num = n;
-             ss << "set pool " << pool << " pg_num to " << n;
+       pending_inc.new_pools[pool].v.type = CEPH_PG_TYPE_REP;
+       pending_inc.new_pools[pool].v.size = 2;
+       pending_inc.new_pools[pool].v.crush_ruleset = 0;
+       pending_inc.new_pools[pool].v.pg_num = 8;
+       pending_inc.new_pools[pool].v.pgp_num = 8;
+       pending_inc.new_pools[pool].v.lpg_num = 0;
+       pending_inc.new_pools[pool].v.lpgp_num = 0;
+       pending_inc.new_pools[pool].v.last_change = pending_inc.epoch;
+       pending_inc.new_pool_names[pool] = m->cmd[3];
+       ss << "pool '" << m->cmd[3] << "' created";
+       getline(ss, rs);
+       paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs));
+       return true;
+      } else if (m->cmd[2] == "set") {
+       int pool = -1;
+       pg_pool_t *p = 0;
+       for (map<int,nstring>::iterator i = osdmap.pool_name.begin();
+            i != osdmap.pool_name.end();
+            i++) {
+         if (i->second == m->cmd[3]) {
+           pool = i->first;
+           p = &osdmap.pools[pool];
+         }
+       }
+       if (pool >= 0) {
+         int n = atoi(m->cmd[5].c_str());
+         if (n) {
+           if (m->cmd[4] == "size") {
+             pending_inc.new_pools[pool] = *p;
+             pending_inc.new_pools[pool].v.size = n;
+             ss << "set pool " << pool << " size to " << n;
              getline(ss, rs);
              paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs));
              return true;
-           }
-         } else if (m->cmd[3] == "pgp_num") {
-           if (n <= p->get_pgp_num()) {
-             ss << "specified pgp_num " << n << " <= current " << p->get_pgp_num();
-           } else if (n > p->get_pg_num()) {
-             ss << "specified pgp_num " << n << " > pg_num " << p->get_pg_num();
-           } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) {
-             ss << "still creating pgs, wait";
-             err = -EAGAIN;
+           } else if (m->cmd[4] == "pg_num") {
+             if (n <= p->get_pg_num()) {
+               ss << "specified pg_num " << n << " <= current " << p->get_pg_num();
+             } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) {
+               ss << "currently creating pgs, wait";
+               err = -EAGAIN;
+             } else {
+               pending_inc.new_pools[pool] = osdmap.pools[pool];
+               pending_inc.new_pools[pool].v.pg_num = n;
+               ss << "set pool " << pool << " pg_num to " << n;
+               getline(ss, rs);
+               paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs));
+               return true;
+             }
+           } else if (m->cmd[4] == "pgp_num") {
+             if (n <= p->get_pgp_num()) {
+               ss << "specified pgp_num " << n << " <= current " << p->get_pgp_num();
+             } else if (n > p->get_pg_num()) {
+               ss << "specified pgp_num " << n << " > pg_num " << p->get_pg_num();
+             } else if (!mon->pgmon()->pg_map.creating_pgs.empty()) {
+               ss << "still creating pgs, wait";
+               err = -EAGAIN;
+             } else {
+               pending_inc.new_pools[pool] = osdmap.pools[pool];
+               pending_inc.new_pools[pool].v.pgp_num = n;
+               ss << "set pool " << pool << " pgp_num to " << n;
+               getline(ss, rs);
+               paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs));
+               return true;
+             }
            } else {
-             pending_inc.new_pools[pool] = osdmap.pools[pool];
-             pending_inc.new_pools[pool].v.pgp_num = n;
-             ss << "set pool " << pool << " pgp_num to " << n;
-             getline(ss, rs);
-             paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs));
-             return true;
+             ss << "unrecognized pool field " << m->cmd[4];
            }
-         } else {
-           ss << "unrecognized pool field " << m->cmd[3];
          }
+       } else {
+         ss << "unrecognized pool '" << m->cmd[3] << "'";
+         err = -ENOENT;
        }
-      } else {
-       ss << "unrecognized pool '" << m->cmd[2] << "'";
-       err = -ENOENT;
       }
     }
     else {
@@ -1168,6 +1196,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
   } else {
     ss << "no command?";
   }
+out:
   getline(ss, rs);
   mon->reply_command(m, err, rs);
   return false;
index 0738e51cfa05ae886169c46964e8045cfb77ac9a..d2cccb3a23bd1238ccca19d67b9fe35666468d85 100644 (file)
@@ -110,6 +110,9 @@ bool PGMonitor::update_from_paxos()
     pg_map.apply_incremental(inc);
     
     dout(0) << pg_map << dendl;
+
+    if (inc.pg_scan)
+      last_sent_pg_create.clear();  // reset pg_create throttle timer
   }
 
   assert(paxosv == pg_map.version);
@@ -428,7 +431,6 @@ bool PGMonitor::register_new_pgs()
   dout(10) << "register_new_pgs checking pg pools for osdmap epoch " << epoch
           << ", last_pg_scan " << pg_map.last_pg_scan << dendl;
 
-  bool first = pg_map.pg_stat.empty(); // first pg creation
   int created = 0;
   for (map<int,pg_pool_t>::iterator p = mon->osdmon()->osdmap.pools.begin();
        p != mon->osdmon()->osdmap.pools.end();
@@ -447,6 +449,8 @@ bool PGMonitor::register_new_pgs()
 
     dout(10) << "register_new_pgs scanning " << pool << dendl;
 
+    bool new_pool = pg_map.pg_pool_sum.count(poolid) == 0;  // first pgs in this pool
+
     for (ps_t ps = 0; ps < pool.get_pg_num(); ps++) {
       pg_t pgid(ps, poolid, -1);
       if (pg_map.pg_stat.count(pgid)) {
@@ -456,7 +460,7 @@ bool PGMonitor::register_new_pgs()
 
       pg_t parent;
       int split_bits = 0;
-      if (!first) {
+      if (!new_pool) {
        parent = pgid;
        while (1) {
          // remove most significant bit
@@ -493,7 +497,6 @@ bool PGMonitor::register_new_pgs()
   } 
   dout(10) << "register_new_pgs registered " << created << " new pgs" << dendl;
   if (created) {
-    last_sent_pg_create.clear();  // reset pg_create throttle timer
     pending_inc.pg_scan = epoch;
     return true;
   }