]> git.proxmox.com Git - ceph.git/blob - ceph/src/crimson/osd/osd_operations/client_request_common.cc
update ceph source to reef 18.1.2
[ceph.git] / ceph / src / crimson / osd / osd_operations / client_request_common.cc
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"
6 #include "crimson/osd/osd_operations/background_recovery.h"
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;
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();
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