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
(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<
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>;
}));
}
-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)
{
#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"
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;
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);
--- /dev/null
+// -*- 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
--- /dev/null
+// -*- 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
});
}
-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
#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();
CommonPGPipeline& pp();
- interruptible_future<> do_recover_missing(Ref<PG>& pgref, const hobject_t& soid);
seastar::future<> do_process();
Ref<PG> pg;
friend std::ostream& operator<<(std::ostream&, const PG& pg);
friend class ClientRequest;
+ friend struct CommonClientRequest;
friend class PGAdvanceMap;
friend class PeeringEvent;
friend class RepRequest;