history.dump_ops(now, f);
}
-void OpTracker::dump_ops_in_flight(Formatter *f)
+void OpTracker::dump_ops_in_flight(Formatter *f, bool print_only_blocked)
{
f->open_object_section("ops_in_flight"); // overall dump
uint64_t total_ops_in_flight = 0;
for (uint32_t i = 0; i < num_optracker_shards; i++) {
ShardedTrackingData* sdata = sharded_in_flight_list[i];
assert(NULL != sdata);
- Mutex::Locker locker(sdata->ops_in_flight_lock_sharded);
+ Mutex::Locker locker(sdata->ops_in_flight_lock_sharded);
for (xlist<TrackedOp*>::iterator p = sdata->ops_in_flight_sharded.begin(); !p.end(); ++p) {
+ if (print_only_blocked && (now - (*p)->get_initiated() <= complaint_time))
+ break;
f->open_object_section("op");
(*p)->dump(now, f);
f->close_section(); // this TrackedOp
}
}
f->close_section(); // list of TrackedOps
- f->dump_int("num_ops", total_ops_in_flight);
+ if (print_only_blocked) {
+ f->dump_float("complaint_time", complaint_time);
+ f->dump_int("num_blocked_ops", total_ops_in_flight);
+ } else
+ f->dump_int("num_ops", total_ops_in_flight);
f->close_section(); // overall dump
}
void set_history_size_and_duration(uint32_t new_size, uint32_t new_duration) {
history.set_size_and_duration(new_size, new_duration);
}
- void dump_ops_in_flight(Formatter *f);
+ void dump_ops_in_flight(Formatter *f, bool print_only_blocked=false);
void dump_historic_ops(Formatter *f);
void register_inflight_op(xlist<TrackedOp*>::item *i);
void unregister_inflight_op(TrackedOp *i);
} else if (command == "dump_ops_in_flight" ||
command == "ops") {
if (!op_tracker.tracking_enabled) {
- ss << "op_tracker tracking is not enabled";
+ ss << "op_tracker tracking is not enabled now, so no ops are tracked currently, even those get stuck. \
+ Please enable \"osd_enable_op_tracker\", and the tracker will start to track new ops received afterwards.";
} else {
op_tracker.dump_ops_in_flight(f);
}
+ } else if (command == "dump_blocked_ops") {
+ if (!op_tracker.tracking_enabled) {
+ ss << "op_tracker tracking is not enabled now, so no ops are tracked currently, even those get stuck. \
+ Please enable \"osd_enable_op_tracker\", and the tracker will start to track new ops received afterwards.";
+ } else {
+ op_tracker.dump_ops_in_flight(f, true);
+ }
+
} else if (command == "dump_historic_ops") {
if (!op_tracker.tracking_enabled) {
- ss << "op_tracker tracking is not enabled";
+ ss << "op_tracker tracking is not enabled now, so no ops are tracked currently, even those get stuck. \
+ Please enable \"osd_enable_op_tracker\", and the tracker will start to track new ops received afterwards.";
} else {
op_tracker.dump_historic_ops(f);
}
"ops", asok_hook,
"show the ops currently in flight");
assert(r == 0);
+ r = admin_socket->register_command("dump_blocked_ops",
+ "dump_blocked_ops", asok_hook,
+ "show the blocked ops currently in flight");
+ assert(r == 0);
r = admin_socket->register_command("dump_historic_ops", "dump_historic_ops",
asok_hook,
"show slowest recent ops");
cct->get_admin_socket()->unregister_command("flush_journal");
cct->get_admin_socket()->unregister_command("dump_ops_in_flight");
cct->get_admin_socket()->unregister_command("ops");
+ cct->get_admin_socket()->unregister_command("dump_blocked_ops");
cct->get_admin_socket()->unregister_command("dump_historic_ops");
cct->get_admin_socket()->unregister_command("dump_op_pq_state");
cct->get_admin_socket()->unregister_command("dump_blacklist");