From: Greg Farnum Date: Fri, 12 Feb 2010 00:57:23 +0000 (-0800) Subject: OSDMap: get_pg_pool now returns a pointer X-Git-Tag: v0.19~18 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=212a9fd6a66996d4960d9a76fd26329124d23e7c;p=ceph.git OSDMap: get_pg_pool now returns a pointer This lets us return NULL if the pool isn't in the map, which is needed functionality for pool deletion. Meanwhile, code which expects the pool to exist will continue to cause a crash if it doesn't. --- diff --git a/src/client/Client.cc b/src/client/Client.cc index fdbe7b4e1874..8e58d9a57dba 100644 --- a/src/client/Client.cc +++ b/src/client/Client.cc @@ -5868,7 +5868,7 @@ int Client::get_file_replication(int fd) Inode *in = f->inode; pool = in->layout.fl_pg_pool; - return osdmap->get_pg_pool(pool).get_size(); + return osdmap->get_pg_pool(pool)->get_size(); } int Client::get_default_preferred_pg(int fd) diff --git a/src/librados.cc b/src/librados.cc index d3a76d12f747..d33e68b88a5c 100644 --- a/src/librados.cc +++ b/src/librados.cc @@ -553,9 +553,9 @@ int RadosClient::create_pool(string& name) int RadosClient::snap_list(PoolCtx *pool, vector *snaps) { Mutex::Locker l(lock); - const pg_pool_t& pi = objecter->osdmap->get_pg_pool(pool->poolid); - for (map::const_iterator p = pi.snaps.begin(); - p != pi.snaps.end(); + const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid); + for (map::const_iterator p = pi->snaps.begin(); + p != pi->snaps.end(); p++) snaps->push_back(p->first); return 0; @@ -564,9 +564,9 @@ int RadosClient::snap_list(PoolCtx *pool, vector *snaps) int RadosClient::snap_lookup(PoolCtx *pool, const char *name, rados_snap_t *snapid) { Mutex::Locker l(lock); - const pg_pool_t& pi = objecter->osdmap->get_pg_pool(pool->poolid); - for (map::const_iterator p = pi.snaps.begin(); - p != pi.snaps.end(); + const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid); + for (map::const_iterator p = pi->snaps.begin(); + p != pi->snaps.end(); p++) { if (p->second.name == name) { *snapid = p->first; @@ -579,9 +579,9 @@ int RadosClient::snap_lookup(PoolCtx *pool, const char *name, rados_snap_t *snap int RadosClient::snap_get_name(PoolCtx *pool, rados_snap_t snapid, std::string *s) { Mutex::Locker l(lock); - const pg_pool_t& pi = objecter->osdmap->get_pg_pool(pool->poolid); - map::const_iterator p = pi.snaps.find(snapid); - if (p == pi.snaps.end()) + const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid); + map::const_iterator p = pi->snaps.find(snapid); + if (p == pi->snaps.end()) return -ENOENT; *s = p->second.name.c_str(); return 0; @@ -590,9 +590,9 @@ int RadosClient::snap_get_name(PoolCtx *pool, rados_snap_t snapid, std::string * int RadosClient::snap_get_stamp(PoolCtx *pool, rados_snap_t snapid, time_t *t) { Mutex::Locker l(lock); - const pg_pool_t& pi = objecter->osdmap->get_pg_pool(pool->poolid); - map::const_iterator p = pi.snaps.find(snapid); - if (p == pi.snaps.end()) + const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid); + map::const_iterator p = pi->snaps.find(snapid); + if (p == pi->snaps.end()) return -ENOENT; *t = p->second.stamp.sec(); return 0; diff --git a/src/mds/SnapServer.cc b/src/mds/SnapServer.cc index a4d4cf0a58bb..0165f9161bae 100644 --- a/src/mds/SnapServer.cc +++ b/src/mds/SnapServer.cc @@ -222,11 +222,11 @@ void SnapServer::check_osd_map(bool force) p != need_to_purge.end(); p++) { int id = p->first; - const pg_pool_t& pi = mds->osdmap->get_pg_pool(id); + const pg_pool_t *pi = mds->osdmap->get_pg_pool(id); for (set::iterator q = p->second.begin(); q != p->second.end(); q++) { - if (pi.is_removed_snap(*q)) { + if (pi->is_removed_snap(*q)) { dout(10) << " osdmap marks " << *q << " as removed" << dendl; all_purged[id].push_back(*q); } else { diff --git a/src/mon/OSDMonitor.cc b/src/mon/OSDMonitor.cc index 187ff1b3aa4d..c4c3552f1863 100644 --- a/src/mon/OSDMonitor.cc +++ b/src/mon/OSDMonitor.cc @@ -584,12 +584,12 @@ bool OSDMonitor::preprocess_remove_snaps(MRemoveSnaps *m) dout(10) << " ignoring removed_snaps " << q->second << " on non-existent pool " << q->first << dendl; continue; } - const pg_pool_t& pi = osdmap.get_pg_pool(q->first); + const pg_pool_t *pi = osdmap.get_pg_pool(q->first); for (vector::iterator p = q->second.begin(); p != q->second.end(); p++) { - if (*p > pi.get_snap_seq() || - !pi.removed_snaps.contains(*p)) + if (*p > pi->get_snap_seq() || + !pi->removed_snaps.contains(*p)) return false; } } @@ -1145,7 +1145,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m) ss << "unrecognized pool '" << m->cmd[3] << "'"; err = -ENOENT; } else { - const pg_pool_t *p = &osdmap.get_pg_pool(pool); + const pg_pool_t *p = osdmap.get_pg_pool(pool); pg_pool_t *pp = 0; if (pending_inc.new_pools.count(pool)) pp = &pending_inc.new_pools[pool]; @@ -1174,7 +1174,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m) ss << "unrecognized pool '" << m->cmd[3] << "'"; err = -ENOENT; } else { - const pg_pool_t *p = &osdmap.get_pg_pool(pool); + const pg_pool_t *p = osdmap.get_pg_pool(pool); pg_pool_t *pp = 0; if (pending_inc.new_pools.count(pool)) pp = &pending_inc.new_pools[pool]; @@ -1217,7 +1217,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m) ss << "unrecognized pool '" << m->cmd[3] << "'"; err = -ENOENT; } else { - const pg_pool_t *p = &osdmap.get_pg_pool(pool); + const pg_pool_t *p = osdmap.get_pg_pool(pool); int n = atoi(m->cmd[5].c_str()); if (n) { if (m->cmd[4] == "size") { @@ -1290,7 +1290,7 @@ bool OSDMonitor::preprocess_pool_op ( MPoolOp *m) { pg_pool_t *pp = 0; if (pending_inc.new_pools.count(m->pool)) pp = &pending_inc.new_pools[m->pool]; //check if the snapname exists - if ((osdmap.get_pg_pool(m->pool).snap_exists(m->name.c_str())) || + if ((osdmap.get_pg_pool(m->pool)->snap_exists(m->name.c_str())) || (pp && pp->snap_exists(m->name.c_str()))) snap_exists = true; switch (m->op) { @@ -1330,7 +1330,7 @@ bool OSDMonitor::prepare_pool_op (MPoolOp *m) if (m->op == POOL_OP_CREATE) { return prepare_pool_op_create(m); } - const pg_pool_t *p = &osdmap.get_pg_pool(m->pool); + const pg_pool_t *p = osdmap.get_pg_pool(m->pool); pg_pool_t* pp = 0; //if the pool isn't already in the update, add it if (!pending_inc.new_pools.count(m->pool)) diff --git a/src/osd/OSD.cc b/src/osd/OSD.cc index de52001de8b4..2f9912ff86e5 100644 --- a/src/osd/OSD.cc +++ b/src/osd/OSD.cc @@ -740,11 +740,11 @@ PGPool* OSD::_get_pool(int id) pool_map[id] = p; p->get(); - const pg_pool_t& pi = osdmap->get_pg_pool(id); - p->info = pi; - p->snapc = pi.get_snap_context(); + const pg_pool_t *pi = osdmap->get_pg_pool(id); + p->info = *pi; + p->snapc = pi->get_snap_context(); - pi.build_removed_snaps(p->removed_snaps); + pi->build_removed_snaps(p->removed_snaps); } dout(10) << "_get_pool " << p->id << " " << p->num_pg << " -> " << (p->num_pg+1) << dendl; p->num_pg++; @@ -2175,18 +2175,18 @@ void OSD::handle_osd_map(MOSDMap *m) for (map::iterator p = pool_map.begin(); p != pool_map.end(); p++) { - const pg_pool_t& pi = osdmap->get_pg_pool(p->first); - if (pi.get_snap_epoch() == cur+1) { + const pg_pool_t* pi = osdmap->get_pg_pool(p->first); + if (pi->get_snap_epoch() == cur+1) { PGPool *pool = p->second; - pi.build_removed_snaps(pool->newly_removed_snaps); + pi->build_removed_snaps(pool->newly_removed_snaps); pool->newly_removed_snaps.subtract(pool->removed_snaps); dout(10) << " pool " << p->first << " removed_snaps " << pool->removed_snaps << ", newly so are " << pool->newly_removed_snaps << ")" << dendl; - pool->info = pi; - pool->snapc = pi.get_snap_context(); + pool->info = *pi; + pool->snapc = pi->get_snap_context(); } else { - dout(10) << " pool " << p->first << " unchanged (snap_epoch = " << pi.get_snap_epoch() << ")" << dendl; + dout(10) << " pool " << p->first << " unchanged (snap_epoch = " << pi->get_snap_epoch() << ")" << dendl; } } diff --git a/src/osd/OSDMap.h b/src/osd/OSDMap.h index 667980756930..8fe1dd13e582 100644 --- a/src/osd/OSDMap.h +++ b/src/osd/OSDMap.h @@ -643,8 +643,8 @@ private: ceph_object_layout make_object_layout(object_t oid, int pg_pool, int preferred=-1, int object_stripe_unit = 0) { // calculate ps (placement seed) - pg_pool_t pool = get_pg_pool(pg_pool); - ps_t ps = ceph_str_hash(pool.v.object_hash, oid.name.c_str(), oid.name.length()); + const pg_pool_t *pool = get_pg_pool(pg_pool); + ps_t ps = ceph_str_hash(pool->v.object_hash, oid.name.c_str(), oid.name.length()); // mix in preferred osd, so we don't get the same peers for // all of the placement pgs (e.g. 0.0p*) @@ -664,18 +664,18 @@ private: int get_pg_num(int pg_pool) { - pg_pool_t pool = get_pg_pool(pg_pool); - return pool.get_pg_num(); + const pg_pool_t *pool = get_pg_pool(pg_pool); + return pool->get_pg_num(); } int get_pg_layout(int pg_pool, int seed, ceph_object_layout& layout) { - pg_pool_t pool = get_pg_pool(pg_pool); + const pg_pool_t *pool = get_pg_pool(pg_pool); pg_t pgid = pg_t(seed, pg_pool, -1); layout.ol_pgid = pgid.v; layout.ol_stripe_unit = 0; - return pool.get_pg_num(); + return pool->get_pg_num(); } // pg -> (osd list) @@ -822,9 +822,10 @@ private: bool have_pg_pool(int p) const { return pools.count(p); } - const pg_pool_t& get_pg_pool(int p) { - assert(pools.count(p)); - return pools[p]; + const pg_pool_t* get_pg_pool(int p) { + if(pools.count(p)) + return &pools[p]; + return NULL; } unsigned get_pg_size(pg_t pg) { assert(pools.count(pg.pool())); diff --git a/src/osdmaptool.cc b/src/osdmaptool.cc index 4d86192b5c30..21d34c0a01ff 100644 --- a/src/osdmaptool.cc +++ b/src/osdmaptool.cc @@ -199,8 +199,8 @@ int main(int argc, const char **argv) for (map::const_iterator p = osdmap.get_pools().begin(); p != osdmap.get_pools().end(); p++) { - const pg_pool_t& pool = osdmap.get_pg_pool(p->first); - for (int ps = 0; ps < pool.get_pg_num(); ps++) { + const pg_pool_t *pool = osdmap.get_pg_pool(p->first); + for (int ps = 0; ps < pool->get_pg_num(); ps++) { pg_t pgid(ps, p->first, -1); for (int i=0; i<100; i++) { cout << pgid << " attempt " << i << std::endl; diff --git a/src/psim.cc b/src/psim.cc index 4a44daa96183..20a177d08e8d 100644 --- a/src/psim.cc +++ b/src/psim.cc @@ -73,7 +73,7 @@ int main(int argc, char **argv) dev /= n; dev = sqrt(dev); - double pgavg = (double)osdmap.get_pg_pool(0).get_pg_num() / (double)n; + double pgavg = (double)osdmap.get_pg_pool(0)->get_pg_num() / (double)n; double edev = sqrt(pgavg) * (double)avg / pgavg; cout << " avg " << avg << " stddev " << dev