]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: remove pg_temp mappings when we delete pools
authorSage Weil <sage@newdream.net>
Thu, 26 May 2011 20:17:12 +0000 (13:17 -0700)
committerSage Weil <sage@newdream.net>
Thu, 26 May 2011 20:17:12 +0000 (13:17 -0700)
Signed-off-by: Sage Weil <sage@newdream.net>
src/mon/OSDMonitor.cc
src/mon/OSDMonitor.h

index fcb90311b3b9e4db542dec46ca23e009350dd47d..6ccaeefe4acdc195dfd9d513fc519dcd754e4f8a 100644 (file)
@@ -1695,7 +1695,7 @@ bool OSDMonitor::prepare_command(MMonCommand *m)
          ss << "unrecognized pool '" << m->cmd[3] << "'";
          err = -ENOENT;
        } else {
-         pending_inc.old_pools.insert(pool);
+         _prepare_remove_pool(pool);
          ss << "pool '" << m->cmd[3] << "' deleted";
          getline(ss, rs);
          paxos->wait_for_commit(new Monitor::C_Command(mon, m, 0, rs, paxos->get_version()));
@@ -1983,9 +1983,24 @@ bool OSDMonitor::prepare_pool_op_create(MPoolOp *m)
   return true;
 }
 
+void OSDMonitor::_prepare_remove_pool(int pool)
+{
+  dout(10) << "_prepare_remove_pool " << pool << dendl;
+  pending_inc.old_pools.insert(pool);
+  // remove any pg_temp mappings for this pool too
+  for (map<pg_t,vector<int32_t> >::iterator p = osdmap.pg_temp.begin();
+       p != osdmap.pg_temp.end();
+       ++p)
+    if (p->first.pool() == pool) {
+      dout(10) << "_prepare_remove_pool " << pool << " removing obsolete pg_temp "
+              << p->first << dendl;
+      pending_inc.new_pg_temp[p->first].clear();
+    }
+}
+
 bool OSDMonitor::prepare_pool_op_delete(MPoolOp *m)
 {
-  pending_inc.old_pools.insert(m->pool);
+  _prepare_remove_pool(m->pool);
   paxos->wait_for_commit(new OSDMonitor::C_PoolOp(this, m, 0, pending_inc.epoch));
   return true;
 }
index 1016fab37338ffd02a1c8cd52703432541866882..126b50132cb337ec0b6284909faac40645ace51b 100644 (file)
@@ -89,6 +89,8 @@ private:
   bool preprocess_pgtemp(class MOSDPGTemp *m);
   bool prepare_pgtemp(class MOSDPGTemp *m);
 
+  void _prepare_remove_pool(int pool);
+
   bool preprocess_pool_op ( class MPoolOp *m);
   bool preprocess_pool_op_create ( class MPoolOp *m);
   bool prepare_pool_op (MPoolOp *m);