From af0c0cd6b7b31ae86e601fcc3dd40460053522b1 Mon Sep 17 00:00:00 2001 From: Jos Collin Date: Wed, 23 Sep 2020 11:58:55 +0000 Subject: [PATCH] mon: test before adding/removing required_client_features Fixes: https://tracker.ceph.com/issues/47006 Signed-off-by: Jos Collin --- src/mon/FSCommands.cc | 26 +++++++++++++++++++++----- 1 file changed, 21 insertions(+), 5 deletions(-) diff --git a/src/mon/FSCommands.cc b/src/mon/FSCommands.cc index f92a76cabecfa..0f2bb7e75ee11 100644 --- a/src/mon/FSCommands.cc +++ b/src/mon/FSCommands.cc @@ -696,21 +696,37 @@ class RequiredClientFeaturesHandler : public FileSystemCommandHandler } if (subop == "add") { + bool ret = false; fsmap.modify_filesystem( fs->fscid, - [feature](std::shared_ptr 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 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; } -- 2.47.3