@@ -150,6 +150,14 @@ static int metric_show(struct seq_file *s, void *p)
seq_printf(s, "%-14s%-12lld%-16lld%lld\n", "write",
total, sum / NSEC_PER_USEC, avg / NSEC_PER_USEC);
+ spin_lock(&mdsc->metric.metadata_lock);
+ total = atomic64_read(&mdsc->metric.total_metadatas),
+ sum = timespec64_to_ns(&mdsc->metric.metadata_latency_sum);
+ spin_unlock(&mdsc->metric.metadata_lock);
+ avg = total ? sum / total : 0;
+ seq_printf(s, "%-14s%-12lld%-16lld%lld\n", "metadata",
+ total, sum / NSEC_PER_USEC, avg / NSEC_PER_USEC);
+
seq_printf(s, "\n");
seq_printf(s, "item total miss hit\n");
seq_printf(s, "-------------------------------------------------\n");
@@ -2894,6 +2894,11 @@ static void handle_reply(struct ceph_mds_session *session, struct ceph_msg *msg)
result = le32_to_cpu(head->result);
+ if (!result || result == -ESTALE || result == -ENOENT) {
+ s64 latency = jiffies - req->r_started;
+ ceph_mdsc_update_metadata_latency(&mdsc->metric, latency);
+ }
+
/*
* Handle an ESTALE
* if we're not talking to the authority, send to them
@@ -4127,6 +4132,22 @@ void ceph_mdsc_update_write_latency(struct ceph_client_metric *m,
spin_unlock(&m->write_lock);
}
+void ceph_mdsc_update_metadata_latency(struct ceph_client_metric *m,
+ s64 latency)
+{
+ struct timespec64 ts;
+
+ if (!m)
+ return;
+
+ jiffies_to_timespec64(latency, &ts);
+
+ spin_lock(&m->metadata_lock);
+ atomic64_inc(&m->total_metadatas);
+ m->metadata_latency_sum = timespec64_add(m->metadata_latency_sum, ts);
+ spin_unlock(&m->metadata_lock);
+}
+
/*
* delayed work -- periodically trim expired leases, renew caps with mds
*/
@@ -4231,6 +4252,10 @@ static int ceph_mdsc_metric_init(struct ceph_client_metric *metric)
memset(&metric->write_latency_sum, 0, sizeof(struct timespec64));
atomic64_set(&metric->total_writes, 0);
+ spin_lock_init(&metric->metadata_lock);
+ memset(&metric->metadata_latency_sum, 0, sizeof(struct timespec64));
+ atomic64_set(&metric->total_metadatas, 0);
+
return 0;
}
@@ -374,6 +374,10 @@ struct ceph_client_metric {
spinlock_t write_lock;
atomic64_t total_writes;
struct timespec64 write_latency_sum;
+
+ spinlock_t metadata_lock;
+ atomic64_t total_metadatas;
+ struct timespec64 metadata_latency_sum;
};
/*
@@ -562,4 +566,6 @@ extern void ceph_mdsc_update_read_latency(struct ceph_client_metric *m,
s64 latency);
extern void ceph_mdsc_update_write_latency(struct ceph_client_metric *m,
s64 latency);
+extern void ceph_mdsc_update_metadata_latency(struct ceph_client_metric *m,
+ s64 latency);
#endif