]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
mon/OSDMonitor: make "ceph osd crush class rm" idempotent
authorxie xingguo <xie.xingguo@zte.com.cn>
Thu, 18 Oct 2018 05:59:16 +0000 (13:59 +0800)
committerxiexingguo <xie.xingguo@gmail.com>
Tue, 23 Oct 2018 13:17:56 +0000 (21:17 +0800)
Removing a non-existent device class should be generally okay.

Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
qa/standalone/crush/crush-classes.sh
src/mon/OSDMonitor.cc

index 2f4ce12e4238e52508892e31dd059f7aa7e9273e..44fb97cb70f8e47e453b023b3c606660c8605037 100755 (executable)
@@ -156,7 +156,7 @@ function TEST_mon_classes() {
     ceph osd crush class rename TEMP CLASS || return 1
     ceph osd crush class ls | grep CLASS  || return 1
     ceph osd crush class rm CLASS || return 1
-    expect_failure $dir ENOENT ceph osd crush class rm CLASS || return 1
+    ceph osd crush class rm CLASS || return 1 # test idempotence
 
     # test rm-device-class
     ceph osd crush set-device-class aaa osd.0 || return 1
index fc22bae4fd765539792bea3c08f0fe6c3b73c8cc..bcb8b63c8e3ef380e5acefbe859c3d9ec11617dd 100644 (file)
@@ -8595,12 +8595,16 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
        goto reply;
      }
 
+     if (!osdmap.crush->class_exists(device_class)) {
+       err = 0;
+       goto reply;
+     }
+
      CrushWrapper newcrush;
      _get_pending_crush(newcrush);
      if (!newcrush.class_exists(device_class)) {
-       err = -ENOENT;
-       ss << "class '" << device_class << "' does not exist";
-       goto reply;
+       err = 0; // make command idempotent
+       goto wait;
      }
      int class_id = newcrush.get_class_id(device_class);
      stringstream ts;