#include "crimson/osd/osd_operations/client_request.h"
#include "crimson/osd/osd_connection_priv.h"
#include "osd/object_state_fmt.h"
+#include "osd/osd_perf_counters.h"
SET_SUBSYS(osd);
DEBUGDPP("{}.{}: dropping misdirected op",
pg, *this, this_instance_id);
co_return;
- } else if (pg.is_unreadable_object(m->get_hobj())) {
+ }
+
+ pg.get_perf_logger().inc(l_osd_replica_read);
+ if (pg.is_unreadable_object(m->get_hobj())) {
DEBUGDPP("{}.{}: {} missing on replica, bouncing to primary",
pg, *this, this_instance_id, m->get_hobj());
+ pg.get_perf_logger().inc(l_osd_replica_read_redirect_missing);
co_await reply_op_error(pgref, -EAGAIN);
co_return;
} else if (!pg.get_peering_state().can_serve_replica_read(m->get_hobj())) {
DEBUGDPP("{}.{}: unstable write on replica, bouncing to primary",
pg, *this, this_instance_id);
+ pg.get_perf_logger().inc(l_osd_replica_read_redirect_conflict);
co_await reply_op_error(pgref, -EAGAIN);
co_return;
} else {
DEBUGDPP("{}.{}: serving replica read on oid {}",
pg, *this, this_instance_id, m->get_hobj());
+ pg.get_perf_logger().inc(l_osd_replica_read_served);
}
}
}
}
+ if (!is_primary()) {
+ osd->logger->inc(l_osd_replica_read);
+ }
+
if (!check_laggy(op)) {
return;
}
// missing object?
if (is_unreadable_object(head)) {
if (!is_primary()) {
+ osd->logger->inc(l_osd_replica_read_redirect_missing);
osd->reply_op_error(op, -EAGAIN);
return;
}
dout(20) << __func__
<< ": unstable write on replica, bouncing to primary "
<< *m << dendl;
+ osd->logger->inc(l_osd_replica_read_redirect_conflict);
osd->reply_op_error(op, -EAGAIN);
return;
}
dout(20) << __func__ << ": serving replica read on oid " << oid
<< dendl;
+ osd->logger->inc(l_osd_replica_read_served);
}
int r = find_object_context(
osd_plb.add_time_avg(l_osd_op_before_dequeue_op_lat, "op_before_dequeue_op_lat",
"Latency of IO before calling dequeue_op(already dequeued and get PG lock)"); // client io before dequeue_op latency
+
+ osd_plb.add_u64_counter(
+ l_osd_replica_read, "replica_read", "Count of replica reads received");
+ osd_plb.add_u64_counter(
+ l_osd_replica_read_redirect_missing,
+ "replica_read_redirect_missing",
+ "Count of replica reads redirected to primary due to missing object");
+ osd_plb.add_u64_counter(
+ l_osd_replica_read_redirect_conflict,
+ "replica_read_redirect_conflict",
+ "Count of replica reads redirected to primary due to unstable write");
+ osd_plb.add_u64_counter(
+ l_osd_replica_read_served,
+ "replica_read_served",
+ "Count of replica reads served");
+
osd_plb.add_u64_counter(
l_osd_sop, "subop", "Suboperations");
osd_plb.add_u64_counter(
l_osd_op_before_queue_op_lat,
l_osd_op_before_dequeue_op_lat,
+ l_osd_replica_read,
+ l_osd_replica_read_redirect_missing,
+ l_osd_replica_read_redirect_conflict,
+ l_osd_replica_read_served,
+
l_osd_sop,
l_osd_sop_inb,
l_osd_sop_lat,