Skip to content

Commit 8b06b72

Browse files
athanatosMatan-B
authored andcommitted
crimson/.../pg_shard_manager: add start_pg_operation_active
Messages between OSDs for PGs that have already completed peering require fewer checks than otherwise. Signed-off-by: Samuel Just <[email protected]> (cherry picked from commit 1a75da4)
1 parent 80358b6 commit 8b06b72

File tree

1 file changed

+44
-0
lines changed

1 file changed

+44
-0
lines changed

src/crimson/osd/pg_shard_manager.h

Lines changed: 44 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include <seastar/core/shared_future.hh>
88
#include <seastar/core/sharded.hh>
99

10+
#include "crimson/common/log.h"
11+
1012
#include "crimson/osd/osd_connection_priv.h"
1113
#include "crimson/osd/shard_services.h"
1214
#include "crimson/osd/pg_map.h"
@@ -432,6 +434,48 @@ class PGShardManager {
432434
return std::make_pair(id, std::move(fut));
433435
}
434436

437+
template <typename T, typename... Args>
438+
auto start_pg_operation_active(Args&&... args) {
439+
LOG_PREFIX(PGShardManager::start_pg_operation_active);
440+
auto op = get_local_state().registry.create_operation<T>(
441+
std::forward<Args>(args)...);
442+
SUBDEBUG(osd, "{} starting", *op);
443+
444+
auto &opref = *op;
445+
if constexpr (T::is_trackable) {
446+
op->template track_event<typename T::StartEvent>();
447+
}
448+
449+
auto core = get_pg_to_shard_mapping().get_pg_mapping(opref.get_pgid());
450+
if (core == NULL_CORE) {
451+
// PG target has been removed, there *must* have been an interval change
452+
SUBDEBUG(
453+
osd,
454+
"{} no core mapping for pg {} found, must be from a prior interval",
455+
opref, opref.get_pgid());
456+
return seastar::now();
457+
}
458+
459+
return this->template with_remote_shard_state_and_op<T>(
460+
core, std::move(op),
461+
[FNAME](ShardServices &target_shard_services,
462+
typename T::IRef op) {
463+
auto &opref = *op;
464+
auto pg = target_shard_services.get_pg(
465+
opref.get_pgid());
466+
if (!pg) {
467+
SUBDEBUG(
468+
osd,
469+
"{} pg {} not present, must be from prior interval",
470+
opref, opref.get_pgid());
471+
return seastar::now();
472+
}
473+
return op->with_pg(
474+
target_shard_services, pg
475+
).finally([op] {});
476+
});
477+
}
478+
435479
#undef FORWARD
436480
#undef FORWARD_CONST
437481
#undef FORWARD_TO_OSD_SINGLETON

0 commit comments

Comments
 (0)