|
7 | 7 | #include <seastar/core/shared_future.hh> |
8 | 8 | #include <seastar/core/sharded.hh> |
9 | 9 |
|
| 10 | +#include "crimson/common/log.h" |
| 11 | + |
10 | 12 | #include "crimson/osd/osd_connection_priv.h" |
11 | 13 | #include "crimson/osd/shard_services.h" |
12 | 14 | #include "crimson/osd/pg_map.h" |
@@ -432,6 +434,48 @@ class PGShardManager { |
432 | 434 | return std::make_pair(id, std::move(fut)); |
433 | 435 | } |
434 | 436 |
|
| 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 | + |
435 | 479 | #undef FORWARD |
436 | 480 | #undef FORWARD_CONST |
437 | 481 | #undef FORWARD_TO_OSD_SINGLETON |
|
0 commit comments