]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
OSDMap: get_pg_pool now returns a pointer
authorGreg Farnum <gregf@hq.newdream.net>
Fri, 12 Feb 2010 00:57:23 +0000 (16:57 -0800)
committerGreg Farnum <gregf@hq.newdream.net>
Tue, 16 Feb 2010 17:27:41 +0000 (09:27 -0800)
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.

src/client/Client.cc
src/librados.cc
src/mds/SnapServer.cc
src/mon/OSDMonitor.cc
src/osd/OSD.cc
src/osd/OSDMap.h
src/osdmaptool.cc
src/psim.cc

index fdbe7b4e1874ca7c78c55bd4e0e2ff9dea28ded0..8e58d9a57dbac4f336cea0e144dbe33f412690cb 100644 (file)
@@ -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)
index d3a76d12f747f62861f8fce5216c929db6ac5ed9..d33e68b88a5ccfa859779532a4c091d957ff610a 100644 (file)
@@ -553,9 +553,9 @@ int RadosClient::create_pool(string& name)
 int RadosClient::snap_list(PoolCtx *pool, vector<rados_snap_t> *snaps)
 {
   Mutex::Locker l(lock);
-  const pg_pool_tpi = objecter->osdmap->get_pg_pool(pool->poolid);
-  for (map<snapid_t,pool_snap_info_t>::const_iterator p = pi.snaps.begin();
-       p != pi.snaps.end();
+  const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid);
+  for (map<snapid_t,pool_snap_info_t>::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<rados_snap_t> *snaps)
 int RadosClient::snap_lookup(PoolCtx *pool, const char *name, rados_snap_t *snapid)
 {
   Mutex::Locker l(lock);
-  const pg_pool_tpi = objecter->osdmap->get_pg_pool(pool->poolid);
-  for (map<snapid_t,pool_snap_info_t>::const_iterator p = pi.snaps.begin();
-       p != pi.snaps.end();
+  const pg_pool_t *pi = objecter->osdmap->get_pg_pool(pool->poolid);
+  for (map<snapid_t,pool_snap_info_t>::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_tpi = objecter->osdmap->get_pg_pool(pool->poolid);
-  map<snapid_t,pool_snap_info_t>::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<snapid_t,pool_snap_info_t>::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_tpi = objecter->osdmap->get_pg_pool(pool->poolid);
-  map<snapid_t,pool_snap_info_t>::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<snapid_t,pool_snap_info_t>::const_iterator p = pi->snaps.find(snapid);
+  if (p == pi->snaps.end())
     return -ENOENT;
   *t = p->second.stamp.sec();
   return 0;
index a4d4cf0a58bbfc173bc9607e563b81b200de7279..0165f9161bae9408fd1fca6ba80aec2d6edc8fe8 100644 (file)
@@ -222,11 +222,11 @@ void SnapServer::check_osd_map(bool force)
        p != need_to_purge.end();
        p++) {
     int id = p->first;
-    const pg_pool_tpi = mds->osdmap->get_pg_pool(id);
+    const pg_pool_t *pi = mds->osdmap->get_pg_pool(id);
     for (set<snapid_t>::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 {
index 187ff1b3aa4dd3773fd8a6f86ba266e70aaec518..c4c3552f186338f325123054b315c20bdf3c2766 100644 (file)
@@ -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_tpi = osdmap.get_pg_pool(q->first);
+    const pg_pool_t *pi = osdmap.get_pg_pool(q->first);
     for (vector<snapid_t>::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))
index de52001de8b41b70769be6347176b934c26c8162..2f9912ff86e59040e35bc27341ddc3594fe9ea77 100644 (file)
@@ -740,11 +740,11 @@ PGPool* OSD::_get_pool(int id)
     pool_map[id] = p;
     p->get();
     
-    const pg_pool_tpi = 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<int, PGPool*>::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;
       }
     }
 
index 667980756930d934d542f03bed1871432ca090b3..8fe1dd13e582f63b82888dd73246ac13bbeea021 100644 (file)
@@ -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()));
index 4d86192b5c30c0a18fe5b331224294f10cf1a972..21d34c0a01ff4d7fb4d4a4778057515bba1dac4a 100644 (file)
@@ -199,8 +199,8 @@ int main(int argc, const char **argv)
       for (map<int,pg_pool_t>::const_iterator p = osdmap.get_pools().begin();
           p != osdmap.get_pools().end();
           p++) {
-       const pg_pool_tpool = 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;
index 4a44daa9618368a3aa2554d3159f2ff3dcfbf65e..20a177d08e8db7ff834f06fdd741e1c06356defa 100644 (file)
@@ -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