]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
mds: maintain client provided metric flags in client metadata 32201/head
authorVenky Shankar <vshankar@redhat.com>
Wed, 11 Dec 2019 09:12:15 +0000 (04:12 -0500)
committerVenky Shankar <vshankar@redhat.com>
Tue, 7 Jan 2020 12:06:16 +0000 (07:06 -0500)
Fixes: https://tracker.ceph.com/issues/43251
Signed-off-by: Venky Shankar <vshankar@redhat.com>
src/mds/Server.cc
src/mds/mdstypes.cc
src/mds/mdstypes.h
src/messages/MClientSession.h

index 60f5da1685f6887046227cf37eb0afad205064eb..3817a2316a08e3ca7aa01efe8e08f3549b938244 100644 (file)
@@ -538,7 +538,7 @@ void Server::handle_client_session(const cref_t<MClientSession> &m)
 
     {
       auto& addr = session->info.inst.addr;
-      session->set_client_metadata(client_metadata_t(m->metadata, m->supported_features));
+      session->set_client_metadata(client_metadata_t(m->metadata, m->supported_features, m->metric_spec));
       auto& client_metadata = session->info.client_metadata;
 
       auto log_session_status = [this, m, session](std::string_view status, std::string_view err) {
@@ -585,7 +585,8 @@ void Server::handle_client_session(const cref_t<MClientSession> &m)
        infer_supported_features(session, client_metadata);
 
       dout(20) << __func__ << " CEPH_SESSION_REQUEST_OPEN metadata entries:" << dendl;
-      dout(20) << "  features: '" << client_metadata.features << dendl;
+      dout(20) << " features: '" << client_metadata.features << "'" << dendl;
+      dout(20) << " metric specification: [" << client_metadata.metric_spec << "]" << dendl;
       for (const auto& p : client_metadata) {
        dout(20) << "  " << p.first << ": " << p.second << dendl;
       }
index 198a41ebdda603d30c6e1fbeb58b1722b06a462c..2f976e75fa3bbf332a0ecd02fb0e7a7a165757fb 100644 (file)
@@ -447,29 +447,60 @@ void feature_bitset_t::print(ostream& out) const
   out.flags(f);
 }
 
+/*
+ * metric_spec_t
+ */
+void metric_spec_t::encode(bufferlist& bl) const {
+  using ceph::encode;
+  ENCODE_START(1, 1, bl);
+  encode(metric_flags, bl);
+  ENCODE_FINISH(bl);
+}
+
+void metric_spec_t::decode(bufferlist::const_iterator &p) {
+  using ceph::decode;
+  DECODE_START(1, p);
+  decode(metric_flags, p);
+  DECODE_FINISH(p);
+}
+
+void metric_spec_t::dump(Formatter *f) const {
+  f->dump_object("metric_flags", metric_flags);
+}
+
+void metric_spec_t::print(ostream& out) const
+{
+  out << "{metric_flags: '" << metric_flags << "'}";
+}
+
 /*
  * client_metadata_t
  */
 void client_metadata_t::encode(bufferlist& bl) const
 {
-  ENCODE_START(2, 1, bl);
+  ENCODE_START(3, 1, bl);
   encode(kv_map, bl);
   encode(features, bl);
+  encode(metric_spec, bl);
   ENCODE_FINISH(bl);
 }
 
 void client_metadata_t::decode(bufferlist::const_iterator& p)
 {
-  DECODE_START(2, p);
+  DECODE_START(3, p);
   decode(kv_map, p);
   if (struct_v >= 2)
     decode(features, p);
+  if (struct_v >= 3) {
+    decode(metric_spec, p);
+  }
   DECODE_FINISH(p);
 }
 
 void client_metadata_t::dump(Formatter *f) const
 {
   f->dump_object("client_features", features);
+  f->dump_object("metric_spec", metric_spec);
   for (const auto& [name, val] : kv_map)
     f->dump_string(name.c_str(), val);
 }
index 4ff01cd2de9d7f3c187e7b46074c5227cc3dcfc6..98c91d11cf88336ecfb8fa85a97a432e26757681 100644 (file)
@@ -1116,6 +1116,52 @@ inline std::ostream& operator<<(std::ostream& out, const feature_bitset_t& s) {
   return out;
 }
 
+/*
+ * metric_spec_t
+ */
+struct metric_spec_t {
+  // set of metrics that a client is capable of forwarding
+  feature_bitset_t metric_flags;
+
+  metric_spec_t() {}
+  metric_spec_t(const metric_spec_t& other) :
+    metric_flags(other.metric_flags) {}
+  metric_spec_t(metric_spec_t&& other) :
+    metric_flags(std::move(other.metric_flags)) {}
+  metric_spec_t(const feature_bitset_t& mf) :
+    metric_flags(mf) {}
+  metric_spec_t(feature_bitset_t&& mf) :
+    metric_flags(std::move(mf)) {}
+
+  metric_spec_t& operator=(const metric_spec_t& other) {
+    metric_flags = other.metric_flags;
+    return *this;
+  }
+  metric_spec_t& operator=(metric_spec_t&& other) {
+    metric_flags = std::move(other.metric_flags);
+    return *this;
+  }
+
+  bool empty() const {
+    return metric_flags.empty();
+  }
+
+  void clear() {
+    metric_flags.clear();
+  }
+
+  void encode(bufferlist& bl) const;
+  void decode(bufferlist::const_iterator& p);
+  void dump(Formatter *f) const;
+  void print(ostream& out) const;
+};
+WRITE_CLASS_ENCODER(metric_spec_t)
+
+inline std::ostream& operator<<(std::ostream& out, const metric_spec_t& mst) {
+  mst.print(out);
+  return out;
+}
+
 /*
  * client_metadata_t
  */
@@ -1125,23 +1171,33 @@ struct client_metadata_t {
 
   kv_map_t kv_map;
   feature_bitset_t features;
+  metric_spec_t metric_spec;
 
   client_metadata_t() {}
   client_metadata_t(const client_metadata_t& other) :
-    kv_map(other.kv_map), features(other.features) {}
+    kv_map(other.kv_map),
+    features(other.features),
+    metric_spec(other.metric_spec) {}
   client_metadata_t(client_metadata_t&& other) :
-    kv_map(std::move(other.kv_map)), features(std::move(other.features)) {}
-  client_metadata_t(kv_map_t&& kv, feature_bitset_t &&f) :
-    kv_map(std::move(kv)), features(std::move(f)) {}
-  client_metadata_t(const kv_map_t& kv, const feature_bitset_t &f) :
-    kv_map(kv), features(f) {}
+    kv_map(std::move(other.kv_map)),
+    features(std::move(other.features)),
+    metric_spec(std::move(other.metric_spec)) {}
+  client_metadata_t(kv_map_t&& kv, feature_bitset_t &&f, metric_spec_t &&mst) :
+    kv_map(std::move(kv)),
+    features(std::move(f)),
+    metric_spec(std::move(mst)) {}
+  client_metadata_t(const kv_map_t& kv, const feature_bitset_t &f, const metric_spec_t &mst) :
+    kv_map(kv),
+    features(f),
+    metric_spec(mst) {}
   client_metadata_t& operator=(const client_metadata_t& other) {
     kv_map = other.kv_map;
     features = other.features;
+    metric_spec = other.metric_spec;
     return *this;
   }
 
-  bool empty() const { return kv_map.empty() && features.empty(); }
+  bool empty() const { return kv_map.empty() && features.empty() && metric_spec.empty(); }
   iterator find(const std::string& key) const { return kv_map.find(key); }
   iterator begin() const { return kv_map.begin(); }
   iterator end() const { return kv_map.end(); }
@@ -1150,10 +1206,12 @@ struct client_metadata_t {
   void merge(const client_metadata_t& other) {
     kv_map.insert(other.kv_map.begin(), other.kv_map.end());
     features = other.features;
+    metric_spec = other.metric_spec;
   }
   void clear() {
     kv_map.clear();
     features.clear();
+    metric_spec.clear();
   }
 
   void encode(bufferlist& bl) const;
index 9a4bba74b56ba47cf64c5ddcf8d441ba1e72a0b8..7c3fbfafc4d77e79c013937d465ea1e8e5cb969d 100644 (file)
@@ -20,7 +20,7 @@
 
 class MClientSession : public SafeMessage {
 private:
-  static constexpr int HEAD_VERSION = 3;
+  static constexpr int HEAD_VERSION = 4;
   static constexpr int COMPAT_VERSION = 1;
 
 public:
@@ -28,6 +28,7 @@ public:
 
   std::map<std::string, std::string> metadata;
   feature_bitset_t supported_features;
+  metric_spec_t metric_spec;
 
   int get_op() const { return head.op; }
   version_t get_seq() const { return head.seq; }
@@ -70,6 +71,9 @@ public:
       decode(metadata, p);
     if (header.version >= 3)
       decode(supported_features, p);
+    if (header.version >= 4) {
+      decode(metric_spec, p);
+    }
   }
   void encode_payload(uint64_t features) override { 
     using ceph::encode;
@@ -84,6 +88,7 @@ public:
       encode(metadata, payload);
       encode(supported_features, payload);
     }
+    encode(metric_spec, payload);
   }
 private:
   template<class T, typename... Args>