]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/OSDMap: handle incrementals that modify+del pool 5527/head
authorJohn Spray <john.spray@redhat.com>
Thu, 30 Jul 2015 13:20:56 +0000 (14:20 +0100)
committerNathan Cutler <ncutler@suse.com>
Mon, 10 Aug 2015 14:34:44 +0000 (16:34 +0200)
Because new_pools was processed after old_pools, if something
was modified and then deleted in the same incremental
map, then the resulting state would be a pool in the map
that had no entry in pool_name.

Fixes: #12429
Signed-off-by: John Spray <john.spray@redhat.com>
(cherry picked from commit 8d4932e721e32a33c1bada54e11d4ecccd868618)

src/osd/OSDMap.cc

index 1700f6b6e6f2f1d10abd499cc9096441b0be77a2..a9154d48a297a85402e5f0b651111e2fd99f4b86 100644 (file)
@@ -1283,13 +1283,6 @@ int OSDMap::apply_incremental(const Incremental &inc)
   if (inc.new_pool_max != -1)
     pool_max = inc.new_pool_max;
 
-  for (set<int64_t>::const_iterator p = inc.old_pools.begin();
-       p != inc.old_pools.end();
-       ++p) {
-    pools.erase(*p);
-    name_pool.erase(pool_name[*p]);
-    pool_name.erase(*p);
-  }
   for (map<int64_t,pg_pool_t>::const_iterator p = inc.new_pools.begin();
        p != inc.new_pools.end();
        ++p) {
@@ -1304,6 +1297,13 @@ int OSDMap::apply_incremental(const Incremental &inc)
     pool_name[p->first] = p->second;
     name_pool[p->second] = p->first;
   }
+  for (set<int64_t>::const_iterator p = inc.old_pools.begin();
+       p != inc.old_pools.end();
+       ++p) {
+    pools.erase(*p);
+    name_pool.erase(pool_name[*p]);
+    pool_name.erase(*p);
+  }
 
   for (map<int32_t,uint32_t>::const_iterator i = inc.new_weight.begin();
        i != inc.new_weight.end();