]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: improve debugs in OpSequencer. 41796/head
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 9 Jun 2021 20:55:34 +0000 (20:55 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Mon, 14 Jun 2021 12:26:22 +0000 (12:26 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/osd_operation_sequencer.h
src/crimson/osd/osd_operations/client_request.cc
src/crimson/osd/osd_operations/client_request.h

index 78bf82f6fd8d265d9353031708e88f17c95ff861..731b92684db96eb12e7bdaa17812078e27a08d94 100644 (file)
@@ -26,14 +26,16 @@ namespace crimson::osd {
 // can keep an op waiting in the case explained above.
 class OpSequencer {
 public:
-  template <typename HandleT,
+  template <typename OpT,
+            typename HandleT,
             typename FuncT,
             typename Result = std::invoke_result_t<FuncT>>
   seastar::futurize_t<Result>
-  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 <class OpT>
+  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 <class OpT>
+  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;
     }
   }
index 14c576a534d64c503d496c5fb218e9924265d4b6..c89134c18252a1253a5e35fba82504b48f4e8902 100644 (file)
@@ -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);
index c41035afe95822483b18c7b3d5d391d2c982f725..5e40d6684bc0da0fa21286aa3af581d3b28d10ff 100644 (file)
@@ -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(