]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
osd: erasure-code-profile incremental rm before set 4066/head
authorLoic Dachary <ldachary@redhat.com>
Wed, 18 Mar 2015 13:17:00 +0000 (14:17 +0100)
committerLoic Dachary <ldachary@redhat.com>
Wed, 18 Mar 2015 13:17:00 +0000 (14:17 +0100)
It is possible for an incremental change to have both a rm and a set for
a given erasure code profile. It only happens when a rm is followed by a
set. When a set is followed by a rm, the rm will remove the pending set
in the incremental change.

The logic is the same for pool create and pool delete.

We must apply the incremental erasure-code-profile removal before the
creation otherwise rm and set in the same proposal will ignore the set.

This fix is minimal. A better change would be that erasure-code-profile
set checks if there is a pending removal and wait_for_finished_proposal
before creating.

http://tracker.ceph.com/issues/11144 Fixes: #11144

Signed-off-by: Loic Dachary <ldachary@redhat.com>
src/osd/OSDMap.cc

index 40b88c02e3486581943ae5ce5016e549fd213692..1700f6b6e6f2f1d10abd499cc9096441b0be77a2 100644 (file)
@@ -1325,6 +1325,11 @@ int OSDMap::apply_incremental(const Incremental &inc)
   }
 
   // erasure_code_profiles
+  for (vector<string>::const_iterator i = inc.old_erasure_code_profiles.begin();
+       i != inc.old_erasure_code_profiles.end();
+       ++i)
+    erasure_code_profiles.erase(*i);
+  
   for (map<string,map<string,string> >::const_iterator i =
         inc.new_erasure_code_profiles.begin();
        i != inc.new_erasure_code_profiles.end();
@@ -1332,11 +1337,6 @@ int OSDMap::apply_incremental(const Incremental &inc)
     set_erasure_code_profile(i->first, i->second);
   }
   
-  for (vector<string>::const_iterator i = inc.old_erasure_code_profiles.begin();
-       i != inc.old_erasure_code_profiles.end();
-       ++i)
-    erasure_code_profiles.erase(*i);
-  
   // up/down
   for (map<int32_t,uint8_t>::const_iterator i = inc.new_state.begin();
        i != inc.new_state.end();