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
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;
uint64_t nr_write_request = 0;
std::vector<MDSCapAuth> cap_auths;
+
+ feature_bitset_t myfeatures;
};
/**
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
#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;
}
}
-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();
}
}
+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) {
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;
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)