void dump(Formatter *f) const {
f->dump_int("latency", lat);
}
+
+ void print(ostream *out) const {
+ *out << "latency: " << lat;
+ }
};
+struct DentryLeasePayload {
+ static const ClientMetricType METRIC_TYPE = ClientMetricType::CLIENT_METRIC_TYPE_DENTRY_LEASE;
+
+ uint64_t dlease_hits = 0;
+ uint64_t dlease_misses = 0;
+ uint64_t nr_dentries = 0;
+
+ DentryLeasePayload() { }
+ DentryLeasePayload(uint64_t dlease_hits, uint64_t dlease_misses, uint64_t nr_dentries)
+ : dlease_hits(dlease_hits), dlease_misses(dlease_misses), nr_dentries(nr_dentries) {
+ }
+
+ void encode(bufferlist &bl) const {
+ using ceph::encode;
+ ENCODE_START(1, 1, bl);
+ encode(dlease_hits, bl);
+ encode(dlease_misses, bl);
+ encode(nr_dentries, bl);
+ ENCODE_FINISH(bl);
+ }
+
+ void decode(bufferlist::const_iterator &iter) {
+ using ceph::decode;
+ DECODE_START(1, iter);
+ decode(dlease_hits, iter);
+ decode(dlease_misses, iter);
+ decode(nr_dentries, iter);
+ DECODE_FINISH(iter);
+ }
+
+ void dump(Formatter *f) const {
+ f->dump_int("dlease_hits", dlease_hits);
+ f->dump_int("dlease_misses", dlease_misses);
+ f->dump_int("num_dentries", nr_dentries);
+ }
+
+ void print(ostream *out) const {
+ *out << "dlease_hits: " << dlease_hits << " "
+ << "dlease_misses: " << dlease_misses << " "
+ << "num_dentries: " << nr_dentries;
+ }
+};
+
struct UnknownPayload {
static const ClientMetricType METRIC_TYPE = static_cast<ClientMetricType>(-1);
c->second = metrics.cap_hit_metric.misses;
break;
case MDSPerformanceCounterType::READ_LATENCY_METRIC:
- c->first = metrics.read_latency_metric.lat.tv.tv_sec;
- c->second = metrics.read_latency_metric.lat.tv.tv_nsec;
+ if (metrics.read_latency_metric.updated) {
+ c->first = metrics.read_latency_metric.lat.tv.tv_sec;
+ c->second = metrics.read_latency_metric.lat.tv.tv_nsec;
+ }
break;
case MDSPerformanceCounterType::WRITE_LATENCY_METRIC:
- c->first = metrics.write_latency_metric.lat.tv.tv_sec;
- c->second = metrics.write_latency_metric.lat.tv.tv_nsec;
+ if (metrics.write_latency_metric.updated) {
+ c->first = metrics.write_latency_metric.lat.tv.tv_sec;
+ c->second = metrics.write_latency_metric.lat.tv.tv_nsec;
+ }
break;
case MDSPerformanceCounterType::METADATA_LATENCY_METRIC:
- c->first = metrics.metadata_latency_metric.lat.tv.tv_sec;
- c->second = metrics.metadata_latency_metric.lat.tv.tv_nsec;
+ if (metrics.metadata_latency_metric.updated) {
+ c->first = metrics.metadata_latency_metric.lat.tv.tv_sec;
+ c->second = metrics.metadata_latency_metric.lat.tv.tv_nsec;
+ }
break;
+ case MDSPerformanceCounterType::DENTRY_LEASE_METRIC:
+ if (metrics.dentry_lease_metric.updated) {
+ c->first = metrics.dentry_lease_metric.hits;
+ c->second = metrics.dentry_lease_metric.misses;
+ }
+ break;
default:
ceph_abort_msg("unknown counter type");
}
auto &metrics = it->second.second;
metrics.update_type = UPDATE_TYPE_REFRESH;
metrics.metadata_latency_metric.lat = payload.lat;
+ metrics.metadata_latency_metric.updated = true;
}
+void MetricsHandler::handle_payload(Session *session, const DentryLeasePayload &payload) {
+ dout(20) << ": type=" << static_cast<ClientMetricType>(DentryLeasePayload::METRIC_TYPE)
+ << ", session=" << session << ", hits=" << payload.dlease_hits << ", misses="
+ << payload.dlease_misses << dendl;
+
+ auto it = client_metrics_map.find(session->info.inst);
+ if (it == client_metrics_map.end()) {
+ return;
+ }
+
+ auto &metrics = it->second.second;
+ metrics.update_type = UPDATE_TYPE_REFRESH;
+ metrics.dentry_lease_metric.hits = payload.dlease_hits;
+ metrics.dentry_lease_metric.misses = payload.dlease_misses;
+ metrics.dentry_lease_metric.updated = true;
+}
+
void MetricsHandler::handle_payload(Session *session, const UnknownPayload &payload) {
- dout(5) << ": session=" << session << ", ignoring unknown payload" << dendl;
+ dout(5) << ": type=Unknown, session=" << session << ", ignoring unknown payload" << dendl;
}
void MetricsHandler::handle_client_metrics(const cref_t<MClientMetrics> &m) {