]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
client: allow overriding client features 58227/head
authorPatrick Donnelly <pdonnell@redhat.com>
Thu, 2 May 2024 00:51:59 +0000 (20:51 -0400)
committerVenky Shankar <vshankar@redhat.com>
Mon, 24 Jun 2024 12:29:16 +0000 (17:59 +0530)
For testing purposes.

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

 Conflicts:
src/client/Client.h

Resolve a minor conflict involving Client::cap_auths

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

index 9b397cb1e5194ff7ec2f0721d17d20ae30ec6926..1cb58c815f9e3147a950408a752cba00cf7e4c22 100644 (file)
@@ -391,6 +391,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
@@ -2301,7 +2307,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 59353fd718e9c38be928d8f4bc4e8bd1f86dfe88..28d3c63956d3f85b4ce01b7cecc9e9bccd06ceff 100644 (file)
@@ -1600,6 +1600,8 @@ private:
   uint64_t nr_metadata_request = 0;
   uint64_t nr_read_request = 0;
   uint64_t nr_write_request = 0;
+
+  feature_bitset_t myfeatures;
 };
 
 /**
index 7725901a42db5b5159f1f89c2c6d837863d11dfc..2abbd517e23e33a7865b2ad8b9fffcdcd771048e 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 2b1e037a6dd78748482d4f4a5cd3893f0947bc0b..0d481a4f659aa57a0b53fc1ec3c3f16a7c4045d6 100644 (file)
@@ -6,6 +6,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;
@@ -428,7 +432,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();
@@ -447,6 +451,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 b20e28bc54f02e9237691911b19937fe3e2edcfb..34556668d83266eaccaa565ea166b109ee979b6c 100644 (file)
@@ -1169,6 +1169,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;
@@ -1222,6 +1223,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)