]> git.apps.os.sepia.ceph.com Git - ceph.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>
Tue, 21 May 2024 16:18:58 +0000 (12:18 -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 0e7b0a34f947337c12629001f71228f8f36da55e..1428d83c0bafc25ff649b72810c9fc8f4f070245 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 347446747b41e179e54874a6e8463c8c8cd136d9..765b8d3cafe231cb19597e1de2aecbbe8ef294d0 100644 (file)
@@ -1936,6 +1936,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 21e17ca0e5bcd718d2f2871660aa1176dbc4d6ca..fce09baef8111d9e55fd29bf3e082bbb21d1230d 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;
@@ -444,7 +448,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();
@@ -463,6 +467,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 272ae76cac18d236bc18e38e7c8324ef6cbffb53..694808890bcf0020fdfcc9726329192354756303 100644 (file)
@@ -296,6 +296,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;
@@ -349,6 +350,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)