#include "osd/osd_op_util.h"
#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;
OpInfo op_info;
- OrderedPipelinePhase::Handle handle;
+ PipelineHandle handle;
public:
class ConnectionPipeline {
- OrderedPipelinePhase await_map = {
+ OrderedExclusivePhase await_map = {
"ClientRequest::ConnectionPipeline::await_map"
};
- OrderedPipelinePhase get_pg = {
+ OrderedExclusivePhase get_pg = {
"ClientRequest::ConnectionPipeline::get_pg"
};
friend class ClientRequest;
};
- class PGPipeline {
- OrderedPipelinePhase await_map = {
+ class PGPipeline : public CommonPGPipeline {
+ OrderedExclusivePhase await_map = {
"ClientRequest::PGPipeline::await_map"
};
- OrderedPipelinePhase wait_for_active = {
- "ClientRequest::PGPipeline::wait_for_active"
+ OrderedConcurrentPhase wait_repop = {
+ "ClientRequest::PGPipeline::wait_repop"
};
- OrderedPipelinePhase recover_missing = {
- "ClientRequest::PGPipeline::recover_missing"
- };
- OrderedPipelinePhase get_obc = {
- "ClientRequest::PGPipeline::get_obc"
- };
- OrderedPipelinePhase process = {
- "ClientRequest::PGPipeline::process"
+ OrderedExclusivePhase send_reply = {
+ "ClientRequest::PGPipeline::send_reply"
};
friend class ClientRequest;
};
static constexpr OperationTypeCode type = OperationTypeCode::client_request;
ClientRequest(OSD &osd, crimson::net::ConnectionRef, Ref<MOSDOp> &&m);
+ ~ClientRequest();
void print(std::ostream &) const final;
void dump_detail(Formatter *f) const final;
public:
seastar::future<> start();
+ bool same_session_and_pg(const ClientRequest& other_op) const;
private:
- seastar::future<> process_pg_op(
+ template <typename FuncT>
+ interruptible_future<> with_sequencer(FuncT&& func);
+
+ enum class seq_mode_t {
+ IN_ORDER,
+ OUT_OF_ORDER
+ };
+
+ interruptible_future<seq_mode_t> do_process(
+ Ref<PG>& pg,
+ crimson::osd::ObjectContextRef obc);
+ ::crimson::interruptible::interruptible_future<
+ ::crimson::osd::IOInterruptCondition> process_pg_op(
Ref<PG> &pg);
- seastar::future<> process_op(
+ ::crimson::interruptible::interruptible_future<
+ ::crimson::osd::IOInterruptCondition, seq_mode_t> process_op(
Ref<PG> &pg);
bool is_pg_op() const;
ConnectionPipeline &cp();
PGPipeline &pp(PG &pg);
+ class OpSequencer& sequencer;
+ // a tombstone used currently by OpSequencer. In the future it's supposed
+ // to be replaced with a reusage of OpTracking facilities.
+ bool finished = false;
+ friend class OpSequencer;
+
+ template <typename Errorator>
+ using interruptible_errorator =
+ ::crimson::interruptible::interruptible_errorator<
+ ::crimson::osd::IOInterruptCondition,
+ Errorator>;
private:
bool is_misdirected(const PG& pg) const;
};