]>
Commit | Line | Data |
---|---|---|
20effc67 TL |
1 | // -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:nil -*- |
2 | // vim: ts=8 sw=2 smarttab expandtab | |
3 | ||
4 | #include "crimson/osd/osd_operations/client_request_common.h" | |
5 | #include "crimson/osd/pg.h" | |
1e59de90 | 6 | #include "crimson/osd/osd_operations/background_recovery.h" |
20effc67 TL |
7 | |
8 | namespace { | |
9 | seastar::logger& logger() { | |
10 | return crimson::get_logger(ceph_subsys_osd); | |
11 | } | |
12 | } | |
13 | ||
14 | namespace crimson::osd { | |
15 | ||
16 | typename InterruptibleOperation::template interruptible_future<> | |
17 | CommonClientRequest::do_recover_missing( | |
18 | Ref<PG>& pg, const hobject_t& soid) | |
19 | { | |
20 | eversion_t ver; | |
1e59de90 | 21 | assert(pg->is_primary()); |
20effc67 TL |
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(); | |
26 | } | |
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(); | |
30 | } else { | |
31 | auto [op, fut] = | |
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); | |
35 | } | |
36 | } | |
37 | ||
38 | bool CommonClientRequest::should_abort_request( | |
39 | const Operation& op, | |
40 | std::exception_ptr eptr) | |
41 | { | |
42 | if (*eptr.__cxa_exception_type() == | |
43 | typeid(::crimson::common::actingset_changed)) { | |
44 | try { | |
45 | std::rethrow_exception(eptr); | |
46 | } catch(::crimson::common::actingset_changed& e) { | |
47 | if (e.is_primary()) { | |
48 | logger().debug("{} {} operation restart, acting set changed", __func__, op); | |
49 | return false; | |
50 | } else { | |
51 | logger().debug("{} {} operation abort, up primary changed", __func__, op); | |
52 | return true; | |
53 | } | |
54 | } | |
55 | } else { | |
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); | |
60 | return true; | |
61 | } | |
62 | } | |
63 | ||
64 | } // namespace crimson::osd |