@@ -256,18 +256,40 @@ class PGShardManager {
256256 auto &opref = *op;
257257 return opref.template with_blocking_event <
258258 PGMap::PGCreationBlockingEvent
259- >([&target_shard_services, &opref](auto &&trigger) {
260- return target_shard_services.wait_for_pg (
261- std::move (trigger), opref.get_pgid ());
262- }).safe_then ([&logger, &target_shard_services, &opref](Ref<PG> pgref) {
263- logger.debug (" {}: have_pg" , opref);
264- return opref.with_pg (target_shard_services, pgref);
265- }).handle_error (
266- crimson::ct_error::ecanceled::handle ([&logger, &opref](auto ) {
267- logger.debug (" {}: pg creation canceled, dropping" , opref);
268- return seastar::now ();
269- })
270- ).then ([op=std::move (op)] {});
259+ >([&target_shard_services, &opref, &logger](auto &&trigger) mutable {
260+ auto pg = target_shard_services.get_pg (opref.get_pgid ());
261+ auto fut = ShardServices::wait_for_pg_ertr::make_ready_future<Ref<PG>>(pg);
262+ if (!pg) {
263+ if (opref.requires_pg ()) {
264+ auto osdmap = target_shard_services.get_map ();
265+ if (!osdmap->is_up_acting_osd_shard (
266+ opref.get_pgid (), target_shard_services.local_state .whoami )) {
267+ logger.debug (
268+ " pg {} for {} is no longer here, discarding" ,
269+ opref.get_pgid (), opref);
270+ opref.get_handle ().exit ();
271+ auto _fut = seastar::now ();
272+ if (osdmap->get_epoch () > opref.get_epoch_sent_at ()) {
273+ _fut = target_shard_services.send_incremental_map (
274+ std::ref (opref.get_foreign_connection ()),
275+ opref.get_epoch_sent_at () + 1 );
276+ }
277+ return _fut;
278+ }
279+ }
280+ fut = target_shard_services.wait_for_pg (
281+ std::move (trigger), opref.get_pgid ());
282+ }
283+ return fut.safe_then ([&logger, &target_shard_services, &opref](Ref<PG> pgref) {
284+ logger.debug (" {}: have_pg" , opref);
285+ return opref.with_pg (target_shard_services, pgref);
286+ }).handle_error (
287+ crimson::ct_error::ecanceled::handle ([&logger, &opref](auto ) {
288+ logger.debug (" {}: pg creation canceled, dropping" , opref);
289+ return seastar::now ();
290+ })
291+ );
292+ }).then ([op=std::move (op)] {});
271293 }
272294
273295 seastar::future<> load_pgs (crimson::os::FuturizedStore& store);
0 commit comments