]> git.proxmox.com Git - ceph.git/blame - 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
CommitLineData
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
8namespace {
9 seastar::logger& logger() {
10 return crimson::get_logger(ceph_subsys_osd);
11 }
12}
13
14namespace crimson::osd {
15
16typename InterruptibleOperation::template interruptible_future<>
17CommonClientRequest::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
38bool 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