]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: make 'osd crush rule rename' idempotent 17329/head
authorxie xingguo <xie.xingguo@zte.com.cn>
Tue, 29 Aug 2017 00:21:07 +0000 (08:21 +0800)
committerxie xingguo <xie.xingguo@zte.com.cn>
Tue, 29 Aug 2017 00:29:13 +0000 (08:29 +0800)
Fixes: http://tracker.ceph.com/issues/21162
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
qa/workunits/mon/crush_ops.sh
src/mon/OSDMonitor.cc

index 6d570779b0264ff2ff9e46d6b5cc173179c2f5e1..aa9abdbc9e763f0549eedb7b6564c83e5a2b0478 100755 (executable)
@@ -38,12 +38,14 @@ ceph osd pool rm ec-foo ec-foo --yes-i-really-really-mean-it
 ceph osd crush rule ls | grep foo
 
 ceph osd crush rule rename foo foo-asdf
+ceph osd crush rule rename foo foo-asdf # idempotent
 ceph osd crush rule rename bar bar-asdf
 ceph osd crush rule ls | grep 'foo-asdf'
 ceph osd crush rule ls | grep 'bar-asdf'
 ceph osd crush rule rm foo 2>&1 | grep 'does not exist'
 ceph osd crush rule rm bar 2>&1 | grep 'does not exist'
 ceph osd crush rule rename foo-asdf foo
+ceph osd crush rule rename foo-asdf foo # idempotent
 ceph osd crush rule rename bar-asdf bar
 ceph osd crush rule ls | expect_false grep 'foo-asdf'
 ceph osd crush rule ls | expect_false grep 'bar-asdf'
index fd6bfdab9a3eb511690f0e6212cb5cb805ecd278..ed276342f15060ae6fbdf519f89365150dd0e3d7 100644 (file)
@@ -8627,6 +8627,15 @@ bool OSDMonitor::prepare_command_impl(MonOpRequestRef op,
 
     CrushWrapper newcrush;
     _get_pending_crush(newcrush);
+    if (!newcrush.rule_exists(srcname) && newcrush.rule_exists(dstname)) {
+      // srcname does not exist and dstname already exists
+      // suppose this is a replay and return success
+      // (so this command is idempotent)
+      ss << "already renamed to '" << dstname << "'";
+      err = 0;
+      goto reply;
+    }
+
     err = newcrush.rename_rule(srcname, dstname, &ss);
     if (err < 0) {
       // ss has reason for failure