From b1c2b7145cc2562d21ce5d15c26eebb235b6906c Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Wed, 10 Mar 2021 15:31:23 +0800 Subject: [PATCH] crimson/osd: retrive client_requests' prev_op_id right before "start_op" 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 --- src/crimson/osd/osd_operations/client_request.cc | 12 ++++++++++-- src/crimson/osd/osd_operations/client_request.h | 3 ++- 2 files changed, 12 insertions(+), 3 deletions(-) diff --git a/src/crimson/osd/osd_operations/client_request.cc b/src/crimson/osd/osd_operations/client_request.cc index 8595fc500cf22..09e10a1a7b4d8 100644 --- a/src/crimson/osd/osd_operations/client_request.cc +++ b/src/crimson/osd/osd_operations/client_request.cc @@ -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( diff --git a/src/crimson/osd/osd_operations/client_request.h b/src/crimson/osd/osd_operations/client_request.h index 3b1c5670a6c73..da9729e9b5565 100644 --- a/src/crimson/osd/osd_operations/client_request.h +++ b/src/crimson/osd/osd_operations/client_request.h @@ -78,7 +78,7 @@ private: PGPipeline &pp(PG &pg); OpSequencer& sequencer; - const uint64_t prev_op_id; + uint64_t prev_op_id = 0; template using interruptible_errorator = @@ -87,6 +87,7 @@ private: Errorator>; private: bool is_misdirected(const PG& pg) const; + void may_set_prev_op(); }; } -- 2.39.5