]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: retrive client_requests' prev_op_id right before "start_op" 40021/head
authorXuehan Xu <xxhdx1985126@gmail.com>
Wed, 10 Mar 2021 07:31:23 +0000 (15:31 +0800)
committerXuehan Xu <xxhdx1985126@gmail.com>
Thu, 11 Mar 2021 05:57:30 +0000 (13:57 +0800)
ClientRequest::prev_op_id should record its immediate predecessor in the
pipeline. If we capture sequencer's last_issued when creating the client
request, it may not represent that predecessor

Signed-off-by: Xuehan Xu <xxhdx1985126@gmail.com>
src/crimson/osd/osd_operations/client_request.cc
src/crimson/osd/osd_operations/client_request.h

index 8595fc500cf2208d6e83d86865efad0f8ea8d299..09e10a1a7b4d86720556e40141375693b936bebf 100644 (file)
@@ -26,8 +26,7 @@ ClientRequest::ClientRequest(
   : osd(osd),
     conn(conn),
     m(m),
-    sequencer(get_osd_priv(conn.get()).op_sequencer[m->get_spg()]),
-    prev_op_id(sequencer.get_last_issued())
+    sequencer(get_osd_priv(conn.get()).op_sequencer[m->get_spg()])
 {}
 
 ClientRequest::~ClientRequest()
@@ -61,6 +60,14 @@ bool ClientRequest::is_pg_op() const
     [](auto& op) { return ceph_osd_op_type_pg(op.op.op); });
 }
 
+void ClientRequest::may_set_prev_op()
+{
+  // set prev_op_id if it's not set yet
+  if (__builtin_expect(prev_op_id == 0, true)) {
+    prev_op_id = sequencer.get_last_issued();
+  }
+}
+
 seastar::future<> ClientRequest::start()
 {
   logger().debug("{}: start", *this);
@@ -80,6 +87,7 @@ seastar::future<> ClientRequest::start()
        return interruptor::with_interruption([this, pgref]() mutable {
           epoch_t same_interval_since = pgref->get_interval_start_epoch();
           logger().debug("{} same_interval_since: {}", *this, same_interval_since);
+          may_set_prev_op();
           return sequencer.start_op(
             handle, prev_op_id, get_id(),
             interruptor::wrap_function(
index 3b1c5670a6c730c85ea205ea64cd2c2fdefdf8c7..da9729e9b5565ea992307821905738141c34210f 100644 (file)
@@ -78,7 +78,7 @@ private:
   PGPipeline &pp(PG &pg);
 
   OpSequencer& sequencer;
-  const uint64_t prev_op_id;
+  uint64_t prev_op_id = 0;
 
   template <typename Errorator>
   using interruptible_errorator =
@@ -87,6 +87,7 @@ private:
       Errorator>;
 private:
   bool is_misdirected(const PG& pg) const;
+  void may_set_prev_op();
 };
 
 }