objecter_finisher(m->cct),
m_command_hook(this),
fscid(0),
- subvolume_tracker{std::make_unique<SubvolumeTracker>(cct, whoami)}
+ subvolume_tracker{std::make_unique<SubvolumeMetricTracker>(cct, whoami)}
{
/* We only use the locale for normalization/case folding. That is unaffected
* by the locale but required by the API.
logger->set(l_c_wr_sqsum, n_sqsum);
logger->set(l_c_wr_ops, nr_write_request);
}
-
-void Client::update_subvolume_metric(bool write, utime_t start, utime_t end, uint64_t size, Inode *in) {
-}
-
// ===================
// metadata cache stuff
Client *client;
InodeRef inode;
public:
- C_Client_FlushComplete(Client *c, Inode *in) : client(c), inode(in) {}
+ C_Client_FlushComplete(Client *c, Inode *in) : client(c), inode(in) { }
void finish(int r) override {
ceph_assert(ceph_mutex_is_locked_by_me(client->client_lock));
if (r != 0) {
client_t const whoami = client->whoami; // For the benefit of ldout prefix
ldout(client->cct, 1) << "I/O error from flush on inode " << inode
- << " 0x" << std::hex << inode->ino << std::dec
- << ": " << r << "(" << cpp_strerror(r) << ")" << dendl;
+ << " 0x" << std::hex << inode->ino << std::dec
+ << ": " << r << "(" << cpp_strerror(r) << ")" << dendl;
inode->set_async_err(r);
}
}
}
// --- subvolume metrics tracking --- //
-SubvolumeTracker::SubvolumeTracker(CephContext *ct, client_t id) : cct(ct), whoami(id) {}
+SubvolumeMetricTracker::SubvolumeMetricTracker(CephContext *ct, client_t id) : cct(ct), whoami(id) {}
-void SubvolumeTracker::dump(Formatter *f) {
+void SubvolumeMetricTracker::dump(Formatter *f) {
auto current_metrics = aggregate(false);
f->open_array_section("current_metrics");
for (auto &met : current_metrics) {
f->close_section();
}
-void SubvolumeTracker::add_inode(inodeno_t inode, inodeno_t subvol) {
+void SubvolumeMetricTracker::add_inode(inodeno_t inode, inodeno_t subvol) {
ldout(cct, 20) << __func__ << " subv_metric " << inode << "-" << subvol << dendl;
std::unique_lock l(metrics_lock);
- if (inode_subvolume.contains(inode)) {
+ if (likely(inode_subvolume.contains(inode))) {
ldout(cct, 10) << __func__ << " " << inode << "-" << subvol << " subv_metric inode exists" << dendl;
return;
}
ldout(cct, 10) << __func__ << " add " << inode << "-" << subvol << dendl;
}
-void SubvolumeTracker::remove_inode(inodeno_t inode) {
+void SubvolumeMetricTracker::remove_inode(inodeno_t inode) {
ldout(cct, 20) << __func__ << " subv_metric " << inode << "-" << dendl;
std::unique_lock l(metrics_lock);
auto it = inode_subvolume.find(inode);
ldout(cct, 20) << __func__ << " subv_metric end " << inode << dendl;
}
-void SubvolumeTracker::add_metric(inodeno_t inode, SimpleIOMetric&& metric) {
+void SubvolumeMetricTracker::add_metric(inodeno_t inode, SimpleIOMetric&& metric) {
ldout(cct, 10) << __func__ << " " << inode << dendl;
std::shared_lock l(metrics_lock);
auto it = inode_subvolume.find(inode);
entry.metrics.emplace_back(metric);
}
-std::vector<AggregatedIOMetrics> SubvolumeTracker::aggregate(bool clean) {
+std::vector<AggregatedIOMetrics> SubvolumeMetricTracker::aggregate(bool clean) {
ldout(cct, 20) << __func__ << dendl;
std::vector<AggregatedIOMetrics> res;
res.reserve(subvolume_metrics.size());
* Maps subvolume_id(which is in fact inode id) to the vector of SimpleIOMetric instances.
* Each simple metric records the single IO operation on the client.
* On clients metric message to the MDS, client will aggregate all simple metrics for each subvolume
- * into the AggregatedIOMetric struct and clean the current metrics list.
+ * into the AggregatedIOMetric struct and clear the current metrics list.
* TODO: limit the cap for each subvolume? in the case client sends metrics to the MDS not so often?
*/
-class SubvolumeTracker {
+class SubvolumeMetricTracker {
public:
struct SubvolumeEntry {
std::vector<SimpleIOMetric> metrics;
}
};
- SubvolumeTracker(CephContext *ct, client_t id);
+ SubvolumeMetricTracker(CephContext *ct, client_t id);
void dump(Formatter *f);
void add_inode(inodeno_t inode, inodeno_t subvol);
void remove_inode(inodeno_t inode);
void update_io_stat_metadata(utime_t latency);
void update_io_stat_read(utime_t latency);
void update_io_stat_write(utime_t latency);
- void update_subvolume_metric(bool write, utime_t start, utime_t end, uint64_t size, Inode *in);
bool should_check_perms() const {
return (is_fuse && !fuse_default_permissions) || (!is_fuse && client_permissions);
fs_cluster_id_t fscid;
// subvolume metrics tracker
- std::unique_ptr<SubvolumeTracker> subvolume_tracker = nullptr;
+ std::unique_ptr<SubvolumeMetricTracker> subvolume_tracker = nullptr;
// file handles, etc.
interval_set<int> free_fd_set; // unused fds
SimpleIOMetric() : packed_data(0) {}
- bool get_is_write() const {
+ bool is_write() const {
return (packed_data & IS_WRITE_MASK) != 0;
}
// --- Dump method ---
void dump(Formatter *f) const {
- f->dump_string("op", get_is_write() ? "w" : "r");
+ f->dump_string("op", is_write() ? "w" : "r");
f->dump_unsigned("lat_us", get_latency_us());
f->dump_unsigned("size", get_payload_size());
}
};
/**
- * brief holds resuolt of the SimpleIOMetrics aggregation, for each subvolume, on the client
+ * brief holds result of the SimpleIOMetrics aggregation, for each subvolume, on the client
* the aggregation occurs just before sending metrics to the MDS
*/
struct AggregatedIOMetrics {
void add(const SimpleIOMetric& m) {
auto lat = m.get_latency_us();
- if (m.get_is_write()) {
+ if (m.is_write()) {
++write_count;
write_bytes += m.get_payload_size();
write_latency_us += lat;
}
double read_iops() const {
- return read_latency_us > 0 ? static_cast<double>(read_count) * 1e9 / read_latency_us : 0.0;
+ return read_latency_us > 0 ? static_cast<double>(read_count) * 1e6 / read_latency_us : 0.0;
}
double write_iops() const {
- return write_latency_us > 0 ? static_cast<double>(write_count) * 1e9 / write_latency_us : 0.0;
+ return write_latency_us > 0 ? static_cast<double>(write_count) * 1e6 / write_latency_us : 0.0;
}
void dump(Formatter *f) const {
f->dump_unsigned("subvolume_id", subvolume_id);
f->dump_unsigned("read_count", read_count);
f->dump_unsigned("read_bytes", read_bytes);
- f->dump_unsigned("avg_read_latency_ns", avg_read_latency_us());
+ f->dump_unsigned("avg_read_latency_us", avg_read_latency_us());
f->dump_unsigned("read_iops", read_iops());
- f->dump_float("avg_read_tp_Bpb", avg_read_throughput_Bps());
+ f->dump_float("avg_read_tp_Bps", avg_read_throughput_Bps());
f->dump_unsigned("write_count", write_count);
f->dump_unsigned("write_bytes", write_bytes);
- f->dump_unsigned("avg_write_latency_ns", avg_write_latency_us());
+ f->dump_unsigned("avg_write_latency_us", avg_write_latency_us());
f->dump_float("write_iops", write_iops());
f->dump_float("avg_write_tp_Bps", avg_write_throughput_Bps());
f->dump_unsigned("time_stamp", time_stamp);
update_rank0();
}
});
-
-
}
void MetricsHandler::shutdown() {