]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
client: allow overriding client features
authorPatrick Donnelly <pdonnell@redhat.com>
Thu, 2 May 2024 00:51:59 +0000 (20:51 -0400)
committerPatrick Donnelly <pdonnell@redhat.com>
Thu, 9 May 2024 12:25:28 +0000 (08:25 -0400)
For testing purposes.

Signed-off-by: Patrick Donnelly <pdonnell@redhat.com>
(cherry picked from commit d9239f9375c1ae92a4990950f40078766bd912e8)

src/client/Client.cc
src/client/Client.h
src/common/options/mds-client.yaml.in
src/mds/mdstypes.cc
src/mds/mdstypes.h

index ba41e9dd084625a845c85ab1453cfad8bbdb64b2..ec97e36fb2db35d6fe91a58a31da971b90aa8bc9 100644 (file)
@@ -392,6 +392,12 @@ Client::Client(Messenger *m, MonClient *mc, Objecter *objecter_)
   if (cct->_conf->client_acl_type == "posix_acl")
     acl_type = POSIX_ACL;
 
+  if (auto str = cct->_conf->client_debug_inject_features; !str.empty()) {
+    myfeatures = feature_bitset_t(str);
+  } else {
+    myfeatures = feature_bitset_t(CEPHFS_FEATURES_CLIENT_SUPPORTED);
+  }
+
   lru.lru_set_midpoint(cct->_conf->client_cache_mid);
 
   // file handles
@@ -2354,7 +2360,7 @@ MetaSessionRef Client::_open_mds_session(mds_rank_t mds)
 
   auto m = make_message<MClientSession>(CEPH_SESSION_REQUEST_OPEN);
   m->metadata = metadata;
-  m->supported_features = feature_bitset_t(CEPHFS_FEATURES_CLIENT_SUPPORTED);
+  m->supported_features = myfeatures;
   m->metric_spec = feature_bitset_t(CEPHFS_METRIC_FEATURES_ALL);
   session->con->send_message2(std::move(m));
   return session;
index beeef0803caf97a78515c34c19e7d134f84463ea..dc9e31aa8f2059ad9c3779baa4ff35fcea90ae2b 100644 (file)
@@ -1639,6 +1639,8 @@ private:
   uint64_t nr_write_request = 0;
 
   std::vector<MDSCapAuth> cap_auths;
+
+  feature_bitset_t myfeatures;
 };
 
 /**
index 1f7600dee510e9851555b71af3f771c88701e84f..28912cdb129c767aae8162db6abd4f5afd9ef3a2 100644 (file)
@@ -251,6 +251,14 @@ options:
   default: 0
   services:
   - mds_client
+- name: client_debug_inject_features
+  type: str
+  level: dev
+  services:
+  - mds_client
+  flags:
+  - startup
+  with_legacy: true
 - name: client_max_inline_size
   type: size
   level: dev
index 044c33459606f3b0f4e1fd175925cb12ba01af38..114ca137bc42374dadf122e722439354076b869c 100644 (file)
@@ -7,6 +7,10 @@
 #include "common/Formatter.h"
 #include "common/StackStringStream.h"
 
+#include <iostream>
+#include <sstream>
+#include <string>
+
 const mds_gid_t MDS_GID_NONE = mds_gid_t(0);
 
 using std::list;
@@ -429,7 +433,7 @@ feature_bitset_t::feature_bitset_t(unsigned long value)
   }
 }
 
-feature_bitset_t::feature_bitset_t(const vector<size_t>& array)
+void feature_bitset_t::init_array(const vector<size_t>& array)
 {
   if (!array.empty()) {
     size_t n = array.back();
@@ -448,6 +452,26 @@ feature_bitset_t::feature_bitset_t(const vector<size_t>& array)
   }
 }
 
+feature_bitset_t::feature_bitset_t(std::string_view str)
+{
+  std::stringstream ss;
+  std::vector<size_t> v;
+  std::string atom;
+
+  ss << str;
+  while (std::getline(ss, atom, ',')) {
+    v.push_back(std::stoul(atom));
+  }
+  std::sort(v.begin(), v.end());
+
+  init_array(v);
+}
+
+feature_bitset_t::feature_bitset_t(const vector<size_t>& array)
+{
+  init_array(array);
+}
+
 feature_bitset_t& feature_bitset_t::operator-=(const feature_bitset_t& other)
 {
   for (size_t i = 0; i < _vec.size(); ++i) {
index 3381d44c95f150b7c87094e00581261ce7075c1b..8e7b16761e0bacf89f261ecb28fbf0497eb2273d 100644 (file)
@@ -294,6 +294,7 @@ public:
   feature_bitset_t(const feature_bitset_t& other) : _vec(other._vec) {}
   feature_bitset_t(feature_bitset_t&& other) : _vec(std::move(other._vec)) {}
   feature_bitset_t(unsigned long value = 0);
+  feature_bitset_t(std::string_view);
   feature_bitset_t(const std::vector<size_t>& array);
   feature_bitset_t& operator=(const feature_bitset_t& other) {
     _vec = other._vec;
@@ -347,6 +348,8 @@ public:
   void dump(ceph::Formatter *f) const;
   void print(std::ostream& out) const;
 private:
+  void init_array(const std::vector<size_t>& v);
+
   std::vector<block_type> _vec;
 };
 WRITE_CLASS_ENCODER(feature_bitset_t)