From c6fcdbc9926ac62cfc51aea1863a41c97f07843d Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Thu, 15 Sep 2022 14:42:05 +0000 Subject: [PATCH] crimson/osd: initialize PGAdvanceMap::from inside critical section Fixes: https://tracker.ceph.com/issues/57542 Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/osd_operations/pg_advance_map.cc | 13 ++++++++----- src/crimson/osd/osd_operations/pg_advance_map.h | 4 ++-- src/crimson/osd/shard_services.cc | 10 +++++----- 3 files changed, 15 insertions(+), 12 deletions(-) diff --git a/src/crimson/osd/osd_operations/pg_advance_map.cc b/src/crimson/osd/osd_operations/pg_advance_map.cc index 51b279c7edb..51af1dc183b 100644 --- a/src/crimson/osd/osd_operations/pg_advance_map.cc +++ b/src/crimson/osd/osd_operations/pg_advance_map.cc @@ -21,9 +21,9 @@ namespace { namespace crimson::osd { PGAdvanceMap::PGAdvanceMap( - PGShardManager &shard_manager, Ref pg, epoch_t from, epoch_t to, + PGShardManager &shard_manager, Ref pg, epoch_t to, PeeringCtx &&rctx, bool do_init) - : shard_manager(shard_manager), pg(pg), from(from), to(to), + : shard_manager(shard_manager), pg(pg), from(std::nullopt), to(to), rctx(std::move(rctx)), do_init(do_init) {} PGAdvanceMap::~PGAdvanceMap() {} @@ -32,7 +32,7 @@ void PGAdvanceMap::print(std::ostream &lhs) const { lhs << "PGAdvanceMap(" << "pg=" << pg->get_pgid() - << " from=" << from + << " from=" << (from ? *from : -1) << " to=" << to; if (do_init) { lhs << " do_init"; @@ -44,7 +44,9 @@ void PGAdvanceMap::dump_detail(Formatter *f) const { f->open_object_section("PGAdvanceMap"); f->dump_stream("pgid") << pg->get_pgid(); - f->dump_int("from", from); + if (from) { + f->dump_int("from", *from); + } f->dump_int("to", to); f->dump_bool("do_init", do_init); f->close_section(); @@ -60,12 +62,13 @@ seastar::future<> PGAdvanceMap::start() return enter_stage<>( pg->peering_request_pg_pipeline.process ).then([this] { + from = pg->get_osdmap_epoch(); if (do_init) { pg->handle_initialize(rctx); pg->handle_activate_map(rctx); } return seastar::do_for_each( - boost::make_counting_iterator(from + 1), + boost::make_counting_iterator(*from + 1), boost::make_counting_iterator(to + 1), [this](epoch_t next_epoch) { return shard_manager.get_map(next_epoch).then( diff --git a/src/crimson/osd/osd_operations/pg_advance_map.h b/src/crimson/osd/osd_operations/pg_advance_map.h index 51789a3a802..3391dd690fb 100644 --- a/src/crimson/osd/osd_operations/pg_advance_map.h +++ b/src/crimson/osd/osd_operations/pg_advance_map.h @@ -29,7 +29,7 @@ protected: Ref pg; PipelineHandle handle; - epoch_t from; + std::optional from; epoch_t to; PeeringCtx rctx; @@ -37,7 +37,7 @@ protected: public: PGAdvanceMap( - PGShardManager &shard_manager, Ref pg, epoch_t from, epoch_t to, + PGShardManager &shard_manager, Ref pg, epoch_t to, PeeringCtx &&rctx, bool do_init); ~PGAdvanceMap(); diff --git a/src/crimson/osd/shard_services.cc b/src/crimson/osd/shard_services.cc index 7b20baf09a9..8b125e8600f 100644 --- a/src/crimson/osd/shard_services.cc +++ b/src/crimson/osd/shard_services.cc @@ -504,10 +504,10 @@ seastar::future> CoreState::handle_pg_create_info( rctx.transaction); return shard_services.start_operation( - shard_manager, pg, pg->get_osdmap_epoch(), - osdmap->get_epoch(), std::move(rctx), true).second.then([pg=pg] { + shard_manager, pg, osdmap->get_epoch(), std::move(rctx), true + ).second.then([pg=pg] { return seastar::make_ready_future>(pg); - }); + }); }); }); } @@ -635,8 +635,8 @@ seastar::future<> CoreState::broadcast_map_to_pgs( pgs.begin(), pgs.end(), [=, &shard_manager, &shard_services](auto& pg) { return shard_services.start_operation( - shard_manager, pg.second, pg.second->get_osdmap_epoch(), epoch, - PeeringCtx{}, false).second; + shard_manager, pg.second, epoch, PeeringCtx{}, false + ).second; }).then([epoch, this] { osdmap_gate.got_map(epoch); return seastar::make_ready_future(); -- 2.39.5