Skip to content

Commit 80358b6

Browse files
athanatosMatan-B
authored andcommitted
crimson: remove CommonClientRequest, move do_recover_missing to PG
do_recover_missing was the only thing left, and inheriting from a class to get a static method is somewhat confusing. Simply move do_recover_missing to PG. Signed-off-by: Samuel Just <[email protected]> (cherry picked from commit ee11626)
1 parent b81ccd1 commit 80358b6

File tree

9 files changed

+74
-113
lines changed

9 files changed

+74
-113
lines changed

src/crimson/osd/CMakeLists.txt

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -19,7 +19,6 @@ add_executable(crimson-osd
1919
ops_executer.cc
2020
osd_operation.cc
2121
osd_operations/client_request.cc
22-
osd_operations/client_request_common.cc
2322
osd_operations/internal_client_request.cc
2423
osd_operations/peering_event.cc
2524
osd_operations/pg_advance_map.cc

src/crimson/osd/osd_operations/client_request.cc

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -321,7 +321,7 @@ ClientRequest::recover_missing_snaps(
321321
co_await std::move(resolve_oids);
322322

323323
for (auto &oid : ret) {
324-
auto unfound = co_await do_recover_missing(pg, oid, m->get_reqid());
324+
auto unfound = co_await pg->do_recover_missing(oid, m->get_reqid());
325325
if (unfound) {
326326
DEBUGDPP("{} unfound, hang it for now", *pg, oid);
327327
co_await interruptor::make_interruptible(
@@ -347,8 +347,8 @@ ClientRequest::process_op(
347347
"Skipping recover_missings on non primary pg for soid {}",
348348
*pg, m->get_hobj());
349349
} else {
350-
auto unfound = co_await do_recover_missing(
351-
pg, m->get_hobj().get_head(), m->get_reqid());
350+
auto unfound = co_await pg->do_recover_missing(
351+
m->get_hobj().get_head(), m->get_reqid());
352352
if (unfound) {
353353
DEBUGDPP("{} unfound, hang it for now", *pg, m->get_hobj().get_head());
354354
co_await interruptor::make_interruptible(

src/crimson/osd/osd_operations/client_request.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -15,7 +15,6 @@
1515
#include "crimson/osd/object_context_loader.h"
1616
#include "crimson/osd/osdmap_gate.h"
1717
#include "crimson/osd/osd_operation.h"
18-
#include "crimson/osd/osd_operations/client_request_common.h"
1918
#include "crimson/osd/pg_activation_blocker.h"
2019
#include "crimson/osd/pg_map.h"
2120
#include "crimson/osd/scrub/pg_scrubber.h"
@@ -28,8 +27,7 @@ class PG;
2827
class OSD;
2928
class ShardServices;
3029

31-
class ClientRequest final : public PhasedOperationT<ClientRequest>,
32-
private CommonClientRequest {
30+
class ClientRequest final : public PhasedOperationT<ClientRequest> {
3331
// Initially set to primary core, updated to pg core after with_pg()
3432
ShardServices *shard_services = nullptr;
3533

src/crimson/osd/osd_operations/client_request_common.cc

Lines changed: 0 additions & 80 deletions
This file was deleted.

src/crimson/osd/osd_operations/client_request_common.h

Lines changed: 0 additions & 21 deletions
This file was deleted.

src/crimson/osd/osd_operations/internal_client_request.cc

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -64,8 +64,8 @@ InternalClientRequest::with_interruption()
6464

6565
co_await enter_stage<interruptor>(obc_orderer->obc_pp().process);
6666

67-
bool unfound = co_await do_recover_missing(
68-
pg, get_target_oid(), osd_reqid_t());
67+
bool unfound = co_await pg->do_recover_missing(
68+
get_target_oid(), osd_reqid_t());
6969

7070
if (unfound) {
7171
throw std::system_error(

src/crimson/osd/osd_operations/internal_client_request.h

Lines changed: 1 addition & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -6,14 +6,12 @@
66
#include "crimson/common/type_helpers.h"
77
#include "crimson/osd/object_context_loader.h"
88
#include "crimson/osd/osd_operation.h"
9-
#include "crimson/osd/osd_operations/client_request_common.h"
109
#include "crimson/osd/pg.h"
1110
#include "crimson/osd/pg_activation_blocker.h"
1211

1312
namespace crimson::osd {
1413

15-
class InternalClientRequest : public PhasedOperationT<InternalClientRequest>,
16-
private CommonClientRequest {
14+
class InternalClientRequest : public PhasedOperationT<InternalClientRequest> {
1715
public:
1816
explicit InternalClientRequest(Ref<PG> pg);
1917
~InternalClientRequest();

src/crimson/osd/pg.cc

Lines changed: 63 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -660,6 +660,69 @@ void PG::on_active_advmap(const OSDMapRef &osdmap)
660660
}
661661
}
662662

663+
PG::interruptible_future<bool> PG::do_recover_missing(
664+
const hobject_t& soid,
665+
const osd_reqid_t& reqid)
666+
{
667+
LOG_PREFIX(PG::do_recover_missing);
668+
DEBUGDPP(
669+
"reqid {} check for recovery, {}",
670+
*this, reqid, soid);
671+
assert(is_primary());
672+
eversion_t ver;
673+
auto &missing_loc = peering_state.get_missing_loc();
674+
bool needs_recovery_or_backfill = false;
675+
676+
if (is_unreadable_object(soid)) {
677+
DEBUGDPP(
678+
"reqid {}, {} is unreadable",
679+
*this, reqid, soid);
680+
ceph_assert(missing_loc.needs_recovery(soid, &ver));
681+
needs_recovery_or_backfill = true;
682+
}
683+
684+
if (is_degraded_or_backfilling_object(soid)) {
685+
DEBUGDPP(
686+
"reqid {}, {} is degraded or backfilling",
687+
*this, reqid, soid);
688+
if (missing_loc.needs_recovery(soid, &ver)) {
689+
needs_recovery_or_backfill = true;
690+
}
691+
}
692+
693+
if (!needs_recovery_or_backfill) {
694+
DEBUGDPP(
695+
"reqid {} nothing to recover {}",
696+
*this, reqid, soid);
697+
co_return false;
698+
}
699+
700+
if (peering_state.get_missing_loc().is_unfound(soid)) {
701+
co_return true;
702+
}
703+
DEBUGDPP(
704+
"reqid {} need to wait for recovery, {} version {}",
705+
*this, reqid, soid);
706+
if (recovery_backend->is_recovering(soid)) {
707+
DEBUGDPP(
708+
"reqid {} object {} version {}, already recovering",
709+
*this, reqid, soid, ver);
710+
co_await PG::interruptor::make_interruptible(
711+
recovery_backend->get_recovering(
712+
soid).wait_for_recovered());
713+
co_return false;
714+
} else {
715+
DEBUGDPP(
716+
"reqid {} object {} version {}, starting recovery",
717+
*this, reqid, soid, ver);
718+
auto [op, fut] =
719+
shard_services.start_operation<UrgentRecovery>(
720+
soid, ver, this, shard_services, get_osdmap_epoch());
721+
co_await PG::interruptor::make_interruptible(std::move(fut));
722+
co_return false;
723+
}
724+
}
725+
663726
void PG::scrub_requested(scrub_level_t scrub_level, scrub_type_t scrub_type)
664727
{
665728
/* We don't actually route the scrub request message into the state machine.

src/crimson/osd/pg.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -760,6 +760,10 @@ class PG : public boost::intrusive_ref_counter<
760760
public:
761761
PeeringState peering_state;
762762

763+
interruptible_future<bool> do_recover_missing(
764+
const hobject_t& soid,
765+
const osd_reqid_t& reqid);
766+
763767
// scrub state
764768

765769
friend class ScrubScan;

0 commit comments

Comments
 (0)