1 // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*-
2 // vim: ts=8 sw=2 smarttab expandtab
4 #include "crimson/osd/osd_operations/client_request_common.h"
5 #include "crimson/osd/pg.h"
6 #include "crimson/osd/osd_operations/background_recovery.h"
9 seastar::logger
& logger() {
10 return crimson::get_logger(ceph_subsys_osd
);
14 namespace crimson::osd
{
16 typename
InterruptibleOperation::template interruptible_future
<>
17 CommonClientRequest::do_recover_missing(
18 Ref
<PG
>& pg
, const hobject_t
& soid
)
21 assert(pg
->is_primary());
22 logger().debug("{} check for recovery, {}", __func__
, soid
);
23 if (!pg
->is_unreadable_object(soid
, &ver
) &&
24 !pg
->is_degraded_or_backfilling_object(soid
)) {
25 return seastar::now();
27 logger().debug("{} need to wait for recovery, {}", __func__
, soid
);
28 if (pg
->get_recovery_backend()->is_recovering(soid
)) {
29 return pg
->get_recovery_backend()->get_recovering(soid
).wait_for_recovered();
32 pg
->get_shard_services().start_operation
<UrgentRecovery
>(
33 soid
, ver
, pg
, pg
->get_shard_services(), pg
->get_osdmap_epoch());
34 return std::move(fut
);
38 bool CommonClientRequest::should_abort_request(
40 std::exception_ptr eptr
)
42 if (*eptr
.__cxa_exception_type() ==
43 typeid(::crimson::common::actingset_changed
)) {
45 std::rethrow_exception(eptr
);
46 } catch(::crimson::common::actingset_changed
& e
) {
48 logger().debug("{} {} operation restart, acting set changed", __func__
, op
);
51 logger().debug("{} {} operation abort, up primary changed", __func__
, op
);
56 assert(*eptr
.__cxa_exception_type() ==
57 typeid(crimson::common::system_shutdown_exception
));
58 crimson::get_logger(ceph_subsys_osd
).debug(
59 "{} {} operation skipped, system shutdown", __func__
, op
);
64 } // namespace crimson::osd