From: Radoslaw Zarzynski Date: Wed, 9 Jun 2021 20:55:34 +0000 (+0000) Subject: crimson/osd: improve debugs in OpSequencer. X-Git-Tag: v17.1.0~1659^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c451bb85193c3090c53a04341381998ce74c1ed7;p=ceph.git crimson/osd: improve debugs in OpSequencer. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/osd_operation_sequencer.h b/src/crimson/osd/osd_operation_sequencer.h index 78bf82f6fd8d..731b92684db9 100644 --- a/src/crimson/osd/osd_operation_sequencer.h +++ b/src/crimson/osd/osd_operation_sequencer.h @@ -26,14 +26,16 @@ namespace crimson::osd { // can keep an op waiting in the case explained above. class OpSequencer { public: - template > seastar::futurize_t - start_op(HandleT& handle, - uint64_t prev_op, - uint64_t this_op, + start_op(const OpT& op, + HandleT& handle, FuncT&& do_op) { + const uint64_t prev_op = op.get_prev_id(); + const uint64_t this_op = op.get_id(); auto have_green_light = seastar::make_ready_future<>(); assert(prev_op < this_op); if (last_issued == prev_op) { @@ -53,7 +55,7 @@ public: handle.exit(); ::crimson::get_logger(ceph_subsys_osd).debug( "OpSequencer::start_op: {} waiting ({} > {})", - this_op, prev_op, last_unblocked); + op, prev_op, last_unblocked); have_green_light = unblocked.wait([prev_op, this] { // wait until the previous op is unblocked return last_unblocked == prev_op; @@ -70,14 +72,20 @@ public: uint64_t get_last_issued() const { return last_issued; } - void finish_op(uint64_t op_id) { - assert(op_id > last_completed); - last_completed = op_id; + template + void finish_op(const OpT& op) { + assert(op.get_id() > last_completed); + last_completed = op.get_id(); } - void maybe_reset(uint64_t op_id) { + template + void maybe_reset(const OpT& op) { + const auto op_id = op.get_id(); // pg interval changes, so we need to reenqueue the previously unblocked // ops by rewinding the "last_unblock" pointer if (op_id <= last_unblocked) { + ::crimson::get_logger(ceph_subsys_osd).debug( + "OpSequencer::maybe_reset:{} {} <= {}, resetting to {}", + op, op_id, last_unblocked, last_completed); last_unblocked = last_completed; } } diff --git a/src/crimson/osd/osd_operations/client_request.cc b/src/crimson/osd/osd_operations/client_request.cc index 14c576a534d6..c89134c18252 100644 --- a/src/crimson/osd/osd_operations/client_request.cc +++ b/src/crimson/osd/osd_operations/client_request.cc @@ -88,9 +88,9 @@ seastar::future<> ClientRequest::start() epoch_t same_interval_since = pgref->get_interval_start_epoch(); logger().debug("{} same_interval_since: {}", *this, same_interval_since); may_set_prev_op(); - assert(prev_op_id.has_value()); return sequencer.start_op( - handle, *prev_op_id, get_id(), + *this, + handle, interruptor::wrap_function( [this, pgref]() mutable -> interruptible_future<> { PG &pg = *pgref; @@ -120,14 +120,14 @@ seastar::future<> ClientRequest::start() }); }) ).then_interruptible([this, pgref]() { - sequencer.finish_op(get_id()); + sequencer.finish_op(*this); return seastar::stop_iteration::yes; }); }, [this, pgref](std::exception_ptr eptr) { if (should_abort_request(*this, std::move(eptr))) { return seastar::stop_iteration::yes; } else { - sequencer.maybe_reset(get_id()); + sequencer.maybe_reset(*this); return seastar::stop_iteration::no; } }, pgref); diff --git a/src/crimson/osd/osd_operations/client_request.h b/src/crimson/osd/osd_operations/client_request.h index c41035afe958..5e40d6684bc0 100644 --- a/src/crimson/osd/osd_operations/client_request.h +++ b/src/crimson/osd/osd_operations/client_request.h @@ -57,6 +57,10 @@ public: public: seastar::future<> start(); + uint64_t get_prev_id() const { + assert(prev_op_id.has_value()); + return *prev_op_id; + } private: interruptible_future<> do_process(