]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: share do_recover_missing() between {Internal,}ClientRequest.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 12 May 2021 14:29:25 +0000 (14:29 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 12 May 2021 16:01:14 +0000 (16:01 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/CMakeLists.txt
src/crimson/osd/osd_operation.h
src/crimson/osd/osd_operations/client_request.cc
src/crimson/osd/osd_operations/client_request.h
src/crimson/osd/osd_operations/client_request_common.cc [new file with mode: 0644]
src/crimson/osd/osd_operations/client_request_common.h [new file with mode: 0644]
src/crimson/osd/osd_operations/internal_client_request.cc
src/crimson/osd/osd_operations/internal_client_request.h
src/crimson/osd/pg.h

index 0b8e5ac3a796761c589cf0b15c643612b3ace720..934f96f3cd34b4ae8ce6e3e880826723190c7cee 100644 (file)
@@ -14,6 +14,7 @@ add_executable(crimson-osd
   ops_executer.cc
   osd_operation.cc
   osd_operations/client_request.cc
+  osd_operations/client_request_common.cc
   osd_operations/compound_peering_request.cc
   osd_operations/internal_client_request.cc
   osd_operations/peering_event.cc
index d3772ad0f6188e0c6ef41dcc14e469930f76dcd4..f099a06e7df7b6ffec537fdda31c523921cf14f2 100644 (file)
@@ -39,9 +39,7 @@ static_assert(
   (sizeof(OP_NAMES)/sizeof(OP_NAMES[0])) ==
   static_cast<int>(OperationTypeCode::last_op));
 
-template <typename T>
-class OperationT : public Operation {
-public:
+struct InterruptibleOperation : Operation {
   template <typename ValuesT = void>
   using interruptible_future =
     ::crimson::interruptible::interruptible_future<
@@ -49,6 +47,11 @@ public:
   using interruptor =
     ::crimson::interruptible::interruptor<
       ::crimson::osd::IOInterruptCondition>;
+};
+
+template <typename T>
+class OperationT : public InterruptibleOperation {
+public:
   static constexpr const char *type_name = OP_NAMES[static_cast<int>(T::type)];
   using IRef = boost::intrusive_ptr<T>;
 
index 4c6d616923f5b8567595e1aa41f0c6a63e818b08..426b7bbdf14f6523d58af4f979516c91d826620c 100644 (file)
@@ -201,26 +201,6 @@ ClientRequest::process_op(Ref<PG> &pg)
   }));
 }
 
-ClientRequest::interruptible_future<>
-ClientRequest::do_recover_missing(Ref<PG>& pg, const hobject_t& soid)
-{
-  eversion_t ver;
-  logger().debug("{} check for recovery, {}", *this, soid);
-  if (!pg->is_unreadable_object(soid, &ver) &&
-      !pg->is_degraded_or_backfilling_object(soid)) {
-    return seastar::now();
-  }
-  logger().debug("{} need to wait for recovery, {}", *this, soid);
-  if (pg->get_recovery_backend()->is_recovering(soid)) {
-    return pg->get_recovery_backend()->get_recovering(soid).wait_for_recovered();
-  } else {
-    auto [op, fut] =
-      pg->get_shard_services().start_operation<UrgentRecovery>(
-        soid, ver, pg, pg->get_shard_services(), pg->get_osdmap_epoch());
-    return std::move(fut);
-  }
-}
-
 ClientRequest::interruptible_future<>
 ClientRequest::do_process(Ref<PG>& pg, crimson::osd::ObjectContextRef obc)
 {
index 42bd36f86e6bb487e5d82633bf51267fe9232070..d346dca87fa12717cfff8e415334982ccf96cd47 100644 (file)
@@ -7,6 +7,7 @@
 #include "crimson/net/Connection.h"
 #include "crimson/osd/object_context.h"
 #include "crimson/osd/osd_operation.h"
+#include "crimson/osd/osd_operations/client_request_common.h"
 #include "crimson/osd/osd_operations/common/pg_pipeline.h"
 #include "crimson/common/type_helpers.h"
 #include "messages/MOSDOp.h"
@@ -15,7 +16,8 @@ namespace crimson::osd {
 class PG;
 class OSD;
 
-class ClientRequest final : public OperationT<ClientRequest> {
+class ClientRequest final : public OperationT<ClientRequest>,
+                            private CommonClientRequest {
   OSD &osd;
   crimson::net::ConnectionRef conn;
   Ref<MOSDOp> m;
@@ -51,7 +53,6 @@ public:
   seastar::future<> start();
 
 private:
-  interruptible_future<> do_recover_missing(Ref<PG>& pgref, const hobject_t& soid);
   interruptible_future<> do_process(
     Ref<PG>& pg,
     crimson::osd::ObjectContextRef obc);
diff --git a/src/crimson/osd/osd_operations/client_request_common.cc b/src/crimson/osd/osd_operations/client_request_common.cc
new file mode 100644 (file)
index 0000000..b39b246
--- /dev/null
@@ -0,0 +1,36 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*-
+// vim: ts=8 sw=2 smarttab expandtab
+
+#include "crimson/osd/osd_operations/client_request_common.h"
+#include "crimson/osd/pg.h"
+
+namespace {
+  seastar::logger& logger() {
+    return crimson::get_logger(ceph_subsys_osd);
+  }
+}
+
+namespace crimson::osd {
+
+typename InterruptibleOperation::template interruptible_future<>
+CommonClientRequest::do_recover_missing(
+  Ref<PG>& pg, const hobject_t& soid)
+{
+  eversion_t ver;
+  logger().debug("{} check for recovery, {}", __func__, soid);
+  if (!pg->is_unreadable_object(soid, &ver) &&
+      !pg->is_degraded_or_backfilling_object(soid)) {
+    return seastar::now();
+  }
+  logger().debug("{} need to wait for recovery, {}", __func__, soid);
+  if (pg->get_recovery_backend()->is_recovering(soid)) {
+    return pg->get_recovery_backend()->get_recovering(soid).wait_for_recovered();
+  } else {
+    auto [op, fut] =
+      pg->get_shard_services().start_operation<UrgentRecovery>(
+        soid, ver, pg, pg->get_shard_services(), pg->get_osdmap_epoch());
+    return std::move(fut);
+  }
+}
+
+} // namespace crimson::osd
diff --git a/src/crimson/osd/osd_operations/client_request_common.h b/src/crimson/osd/osd_operations/client_request_common.h
new file mode 100644 (file)
index 0000000..bf826d8
--- /dev/null
@@ -0,0 +1,16 @@
+// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
+// vim: ts=8 sw=2 smarttab
+
+#pragma once
+
+#include "crimson/common/type_helpers.h"
+#include "crimson/osd/osd_operation.h"
+
+namespace crimson::osd {
+
+struct CommonClientRequest {
+  static InterruptibleOperation::template interruptible_future<>
+  do_recover_missing(Ref<PG>& pg, const hobject_t& soid);
+};
+
+} // namespace crimson::osd
index 71ebc12acfe1d430594e5d10201a8710b0246569..c2942fb505c377f928452755e620a903b15e7588 100644 (file)
@@ -122,13 +122,5 @@ seastar::future<> InternalClientRequest::start()
   });
 }
 
-InternalClientRequest::interruptible_future<>
-InternalClientRequest::do_recover_missing(
-  Ref<PG>& pgref, const hobject_t& soid)
-{
-  // TODO: share this with ClientRequest
-  return seastar::now();
-}
-
 } // namespace crimson::osd
 
index 57ee32cf2191f692536314b112fcc8dcc1c43917..b468b3d15cf1f1443763ff9577116901c1f03ec3 100644 (file)
@@ -5,11 +5,13 @@
 
 #include "crimson/common/type_helpers.h"
 #include "crimson/osd/osd_operation.h"
+#include "crimson/osd/osd_operations/client_request_common.h"
 #include "crimson/osd/pg.h"
 
 namespace crimson::osd {
 
-class InternalClientRequest : public OperationT<InternalClientRequest> {
+class InternalClientRequest : public OperationT<InternalClientRequest>,
+                              private CommonClientRequest {
 public:
   explicit InternalClientRequest(Ref<PG> pg);
   ~InternalClientRequest();
@@ -37,7 +39,6 @@ private:
 
   CommonPGPipeline& pp();
 
-  interruptible_future<> do_recover_missing(Ref<PG>& pgref, const hobject_t& soid);
   seastar::future<> do_process();
 
   Ref<PG> pg;
index b3d24eb5487b0f961efb87903d5406b7bacaa552..45958c4b8e2ffea1a9707effb55fa2c4cf89c91c 100644 (file)
@@ -729,6 +729,7 @@ private:
 
   friend std::ostream& operator<<(std::ostream&, const PG& pg);
   friend class ClientRequest;
+  friend struct CommonClientRequest;
   friend class PGAdvanceMap;
   friend class PeeringEvent;
   friend class RepRequest;