]>
git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/osd/osd_operations/internal_client_request.cc
e71804d88ea718f58ff48cf0b1230ff55b376bf4
1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*-
2 // vim: ts=8 sw=2 smarttab expandtab
4 #include <seastar/core/future.hh>
6 #include "crimson/osd/osd_operations/internal_client_request.h"
9 seastar::logger
& logger() {
10 return crimson::get_logger(ceph_subsys_osd
);
16 struct EventBackendRegistry
<osd::InternalClientRequest
> {
17 static std::tuple
<> get_backends() {
24 namespace crimson::osd
{
26 InternalClientRequest::InternalClientRequest(Ref
<PG
> pg
)
29 assert(bool(this->pg
));
30 assert(this->pg
->is_primary());
33 InternalClientRequest::~InternalClientRequest()
35 logger().debug("{}: destroying", *this);
38 void InternalClientRequest::print(std::ostream
&) const
42 void InternalClientRequest::dump_detail(Formatter
*f
) const
46 CommonPGPipeline
& InternalClientRequest::pp()
48 return pg
->request_pg_pipeline
;
51 seastar::future
<> InternalClientRequest::start()
53 track_event
<StartEvent
>();
54 return crimson::common::handle_system_shutdown([this] {
55 return seastar::repeat([this] {
56 logger().debug("{}: in repeat", *this);
57 return interruptor::with_interruption([this]() mutable {
58 return enter_stage
<interruptor
>(
60 ).then_interruptible([this] {
61 return with_blocking_event
<PGActivationBlocker::BlockingEvent
,
62 interruptor
>([this] (auto&& trigger
) {
63 return pg
->wait_for_active_blocker
.wait(std::move(trigger
));
65 }).then_interruptible([this] {
66 return enter_stage
<interruptor
>(
67 pp().recover_missing
);
68 }).then_interruptible([this] {
69 return do_recover_missing(pg
, get_target_oid());
70 }).then_interruptible([this] {
71 return enter_stage
<interruptor
>(
73 }).then_interruptible([this] () -> PG::load_obc_iertr::future
<> {
74 logger().debug("{}: getting obc lock", *this);
75 return seastar::do_with(create_osd_ops(),
76 [this](auto& osd_ops
) mutable {
77 logger().debug("InternalClientRequest: got {} OSDOps to execute",
79 [[maybe_unused
]] const int ret
= op_info
.set_from_op(
80 std::as_const(osd_ops
), pg
->get_pgid().pgid
, *pg
->get_osdmap());
82 return pg
->with_locked_obc(get_target_oid(), op_info
,
83 [&osd_ops
, this](auto obc
) {
84 return enter_stage
<interruptor
>(pp().process
).then_interruptible(
85 [obc
=std::move(obc
), &osd_ops
, this] {
86 return pg
->do_osd_ops(
89 std::as_const(op_info
),
90 get_do_osd_ops_params(),
92 return PG::do_osd_ops_iertr::now();
94 [] (const std::error_code
& e
) {
95 return PG::do_osd_ops_iertr::now();
97 ).safe_then_unpack_interruptible(
98 [](auto submitted
, auto all_completed
) {
99 return all_completed
.handle_error_interruptible(
100 crimson::ct_error::eagain::handle([] {
101 return seastar::now();
103 }, crimson::ct_error::eagain::handle([] {
104 return interruptor::now();
110 }).handle_error_interruptible(PG::load_obc_ertr::all_same_way([] {
111 return seastar::now();
112 })).then_interruptible([] {
113 return seastar::stop_iteration::yes
;
115 }, [this](std::exception_ptr eptr
) {
116 if (should_abort_request(*this, std::move(eptr
))) {
117 return seastar::stop_iteration::yes
;
119 return seastar::stop_iteration::no
;
123 track_event
<CompletionEvent
>();
128 } // namespace crimson::osd