]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: make 'osd crush class rename' idempotent 17344/head
authorxie xingguo <xie.xingguo@zte.com.cn>
Tue, 29 Aug 2017 01:33:51 +0000 (09:33 +0800)
committerSage Weil <sage@redhat.com>
Tue, 29 Aug 2017 13:39:26 +0000 (09:39 -0400)
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
(cherry picked from commit 2ee80aead88c90388871ee65d4ed31a2fa47f532)

qa/standalone/crush/crush-classes.sh
src/mon/OSDMonitor.cc

index 160f9d8c1a12d8f1844b489b479a1e867c0b6471..bcaab3fa0e8898093f137bad3e3e77a3ff0e478d 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 5643261748fe164fc539ecd8b4b19477e76f7e85..c392950fb0053020f4dec85d04a25356aebc5ad0 100644 (file)
@@ -7528,16 +7528,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;
     }