From ddaa5e013dedeb90e6443f20dc42173c4d9a756a Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Wed, 6 May 2009 14:41:42 -0700 Subject: [PATCH] mon: 'osd pool create foo' --- src/TODO | 3 +- src/mon/OSDMonitor.cc | 129 ++++++++++++++++++++++++++---------------- src/mon/PGMonitor.cc | 9 ++- 3 files changed, 87 insertions(+), 54 deletions(-) diff --git a/src/TODO b/src/TODO index d4c8b3f1164a5..7a1b03315e98e 100644 --- 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 diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 2d544633b3824..8092afcb40c36 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -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::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::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::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; diff --git a/src/mon/PGMonitor.cc b/src/mon/PGMonitor.cc index 0738e51cfa05a..d2cccb3a23bd1 100644 --- a/src/mon/PGMonitor.cc +++ b/src/mon/PGMonitor.cc @@ -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::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; } -- 2.39.5