]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: initialize PGAdvanceMap::from inside critical section
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 15 Sep 2022 14:42:05 +0000 (14:42 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 15 Sep 2022 14:43:15 +0000 (14:43 +0000)
Fixes: https://tracker.ceph.com/issues/57542
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/osd_operations/pg_advance_map.cc
src/crimson/osd/osd_operations/pg_advance_map.h
src/crimson/osd/shard_services.cc

index 51b279c7edb8b7957d74f29b1ba1c9e2c89bec95..51af1dc183b197d08b8de25f416c73b7607ca554 100644 (file)
@@ -21,9 +21,9 @@ namespace {
 namespace crimson::osd {
 
 PGAdvanceMap::PGAdvanceMap(
-  PGShardManager &shard_manager, Ref<PG> pg, epoch_t from, epoch_t to,
+  PGShardManager &shard_manager, Ref<PG> 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(
index 51789a3a80270f6bb353f227daecc5aa3357946e..3391dd690fb71bff6a30221715644e50f7fcf021 100644 (file)
@@ -29,7 +29,7 @@ protected:
   Ref<PG> pg;
   PipelineHandle handle;
 
-  epoch_t from;
+  std::optional<epoch_t> from;
   epoch_t to;
 
   PeeringCtx rctx;
@@ -37,7 +37,7 @@ protected:
 
 public:
   PGAdvanceMap(
-    PGShardManager &shard_manager, Ref<PG> pg, epoch_t from, epoch_t to,
+    PGShardManager &shard_manager, Ref<PG> pg, epoch_t to,
     PeeringCtx &&rctx, bool do_init);
   ~PGAdvanceMap();
 
index 7b20baf09a90588de337a146ef6bd659996175f4..8b125e8600f635a858d34dfab6ad3f6474a7aa6d 100644 (file)
@@ -504,10 +504,10 @@ seastar::future<Ref<PG>> CoreState::handle_pg_create_info(
            rctx.transaction);
 
          return shard_services.start_operation<PGAdvanceMap>(
-           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<Ref<PG>>(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<PGAdvanceMap>(
-       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();