]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
mon: test before adding/removing required_client_features 37359/head
authorJos Collin <jcollin@redhat.com>
Wed, 23 Sep 2020 11:58:55 +0000 (11:58 +0000)
committerJos Collin <jcollin@redhat.com>
Thu, 24 Sep 2020 01:13:49 +0000 (06:43 +0530)
Fixes: https://tracker.ceph.com/issues/47006
Signed-off-by: Jos Collin <jcollin@redhat.com>
src/mon/FSCommands.cc

index f92a76cabecfaa7d00ae11eed68b0ba18e68b01d..0f2bb7e75ee11ce5bb9423bbede51ea1cb94e502 100644 (file)
@@ -696,21 +696,37 @@ class RequiredClientFeaturesHandler : public FileSystemCommandHandler
       }
 
       if (subop == "add") {
+       bool ret = false;
        fsmap.modify_filesystem(
            fs->fscid,
-           [feature](std::shared_ptr<Filesystem> fs)
+           [feature, &ret](auto&& fs)
        {
+         if (fs->mds_map.get_required_client_features().test(feature))
+           return;
          fs->mds_map.add_required_client_feature(feature);
+         ret = true;
        });
-       ss << "added feature '" << cephfs_feature_name(feature) << "' to required_client_features";
+       if (ret) {
+         ss << "added feature '" << cephfs_feature_name(feature) << "' to required_client_features";
+       } else {
+         ss << "feature '" << cephfs_feature_name(feature) << "' is already set";
+       }
       } else {
+       bool ret = false;
        fsmap.modify_filesystem(
            fs->fscid,
-           [feature](std::shared_ptr<Filesystem> fs)
+           [feature, &ret](auto&& fs)
        {
-         fs->mds_map.remove_required_client_feature(feature);
+          if (!fs->mds_map.get_required_client_features().test(feature))
+            return;
+          fs->mds_map.remove_required_client_feature(feature);
+          ret = true;
        });
-       ss << "removed feature '" << cephfs_feature_name(feature) << "' to required_client_features";
+       if (ret) {
+         ss << "removed feature '" << cephfs_feature_name(feature) << "' from required_client_features";
+       } else {
+         ss << "feature '" << cephfs_feature_name(feature) << "' is already unset";
+       }
       }
       return 0;
    }