]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mon/OSDMonitor: make 'osd crush rule rename' idempotent 17481/head
authorxie xingguo <xie.xingguo@zte.com.cn>
Tue, 29 Aug 2017 00:21:07 +0000 (08:21 +0800)
committerNathan Cutler <ncutler@suse.com>
Tue, 5 Sep 2017 09:51:00 +0000 (11:51 +0200)
Fixes: http://tracker.ceph.com/issues/21162
Signed-off-by: xie xingguo <xie.xingguo@zte.com.cn>
(cherry picked from commit cd2191c3f192986e20beaab84b643dfaf49901f7)

qa/workunits/mon/crush_ops.sh
src/mon/OSDMonitor.cc

index 44bc70f4e923b983d1ba19362d0f65ae77f55e6b..348811e7c4b24e9118292ed9ab7e756e2d3bb30e 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 788cd07a41ca65d5aabd68e6fcb6997bb1ae2ea6..d0757a7fc56dc3d41276a6089cdf8d85dae1ac7a 100644 (file)
@@ -8557,6 +8557,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