]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon/OSDMonitor: make 'osd crush class rename' idempotent
authorxie xingguo <xie.xingguo@zte.com.cn>
Tue, 29 Aug 2017 01:33:51 +0000 (09:33 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Tue, 29 Aug 2017 02:43:35 +0000 (10:43 +0800)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
qa/standalone/crush/crush-classes.sh
src/mon/OSDMonitor.cc

index 669bb8d789fc5d65e0fad8b73abf24dbe669fddb..493649ff42152c2a74bcfc4f7987946912f129c2 100755 (executable)
@@ -209,6 +209,7 @@ function TEST_mon_classes() {
     ceph osd crush tree --show-shadow | grep 'class_1' || return 1
     ceph osd crush rule create-replicated class_1_rule default host class_1 || return 1
     ceph osd crush class rename class_1 class_2
+    ceph osd crush class rename class_1 class_2 # idempotent
     ceph osd crush class ls | grep 'class_1' && return 1
     ceph osd crush tree --show-shadow | grep 'class_1' && return 1
     ceph osd crush class ls | grep 'class_2' || return 1
index fd6bfdab9a3eb511690f0e6212cb5cb805ecd278..bc7cd78a3376ef0fc8c1bc464c639e27621267d2 100644 (file)
@@ -7609,16 +7609,11 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
 
     CrushWrapper newcrush;
     _get_pending_crush(newcrush);
-
-    if (!newcrush.class_exists(srcname)) {
-      err = -ENOENT;
-      ss << "class '" << srcname << "' does not exist";
-      goto reply;
-    }
-
-    if (newcrush.class_exists(dstname)) {
-      err = -EEXIST;
-      ss << "class '" << dstname << "' already exists";
+    if (!newcrush.class_exists(srcname) && newcrush.class_exists(dstname)) {
+      // suppose this is a replay and return success
+      // so command is idempotent
+      ss << "already renamed to '" << dstname << "'";
+      err = 0;
       goto reply;
     }