]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os: init PG with pg coll not meta coll
authorKefu Chai <kchai@redhat.com>
Wed, 5 Feb 2020 14:34:44 +0000 (22:34 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 5 Feb 2020 14:40:05 +0000 (22:40 +0800)
* fix a regression introduced by 36ef2b4d
* also consolidate the open/create collection step into make_pg()

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/osd.cc
src/crimson/osd/osd.h
src/crimson/osd/pg.cc
src/crimson/osd/pg.h

index fcbfe47f83746390785a087b586e021a811a6179..3544888d949f86ea0267085701816de8be6bff31 100644 (file)
@@ -430,10 +430,12 @@ seastar::future<> OSD::load_pgs()
   });
 }
 
-seastar::future<Ref<PG>> OSD::make_pg(cached_map_t create_map, spg_t pgid)
+seastar::future<Ref<PG>> OSD::make_pg(cached_map_t create_map,
+                                     spg_t pgid,
+                                     bool do_create)
 {
   using ec_profile_t = map<string,string>;
-  return ([&]() {
+  auto get_pool_info = [create_map, pgid, this] {
     if (create_map->have_pg_pool(pgid.pool())) {
       pg_pool_t pi = *create_map->get_pg_pool(pgid.pool());
       string name = create_map->get_pool_name(pgid.pool());
@@ -449,21 +451,30 @@ seastar::future<Ref<PG>> OSD::make_pg(cached_map_t create_map, spg_t pgid)
       // pool was deleted; grab final pg_pool_t off disk.
       return meta_coll->load_final_pool_info(pgid.pool());
     }
-  })().then([pgid, this, create_map](pg_pool_t&& pool,
-                       string&& name,
-                       ec_profile_t&& ec_profile) {
-    return shard_services.get_store().open_collection(coll_t::meta()).then(
-      [this, pgid, create_map, pool=std::move(pool), name, ec_profile]
-      (auto coll_ref) mutable {
-      return seastar::make_ready_future<Ref<PG>>(new PG{pgid,
-           pg_shard_t{whoami, pgid.shard},
-           coll_ref,
-           std::move(pool),
-           std::move(name),
-           create_map,
-           shard_services,
-           ec_profile});
-    });
+  };
+  auto get_collection = [pgid, do_create, this] {
+    const coll_t cid{pgid};
+    if (do_create) {
+      return store->create_new_collection(cid);
+    } else {
+      return store->open_collection(cid);
+    }
+  };
+  return seastar::when_all_succeed(
+    std::move(get_pool_info),
+    std::move(get_collection)
+  ).then([pgid, create_map, this] (auto info,
+                                  auto coll) {
+    auto [pool, name, ec_profile] = std::move(info);
+    return seastar::make_ready_future<Ref<PG>>(
+      new PG{pgid,
+            pg_shard_t{whoami, pgid.shard},
+            std::move(coll),
+            std::move(pool),
+            std::move(name),
+            create_map,
+            shard_services,
+            ec_profile});
   });
 }
 
@@ -472,15 +483,13 @@ seastar::future<Ref<PG>> OSD::load_pg(spg_t pgid)
   return PGMeta{store.get(), pgid}.get_epoch().then([this](epoch_t e) {
     return get_map(e);
   }).then([pgid, this] (auto&& create_map) {
-    return make_pg(std::move(create_map), pgid);
+    return make_pg(std::move(create_map), pgid, false);
   }).then([this, pgid](Ref<PG> pg) {
-    return pg->read_state(store.get()).then([pg] {
-      return seastar::make_ready_future<Ref<PG>>(std::move(pg));
-    }).handle_exception([pgid](auto ep) {
-      logger().info("pg {} saw exception on load {}", pgid, ep);
-      ceph_abort("Could not load pg" == 0);
-      return seastar::make_exception_future<Ref<PG>>(ep);
-    });
+    return seastar::make_ready_future<Ref<PG>>(std::move(pg));
+  }).handle_exception([pgid](auto ep) {
+    logger().info("pg {} saw exception on load {}", pgid, ep);
+    ceph_abort("Could not load pg" == 0);
+    return seastar::make_exception_future<Ref<PG>>(ep);
   });
 }
 
@@ -695,56 +704,53 @@ seastar::future<Ref<PG>> OSD::handle_pg_create_info(
                startmap);
            }
          }
-         return make_pg(startmap, pgid).then(
+         return make_pg(startmap, pgid, true).then(
            [startmap=std::move(startmap)](auto pg) mutable {
              return seastar::make_ready_future<Ref<PG>, cached_map_t>(
                std::move(pg),
                std::move(startmap));
            });
-      }).then(
-       [this, &info](auto pg, auto startmap) -> seastar::future<Ref<PG>> {
-         if (!pg)
-           return seastar::make_ready_future<Ref<PG>>(Ref<PG>());
-        return store->create_new_collection(coll_t(info->pgid)).then([this, &info, startmap, pg] (auto coll) {
-         PeeringCtx rctx{ceph_release_t::octopus};
-         const pg_pool_t* pp = startmap->get_pg_pool(info->pgid.pool());
-
-         int up_primary, acting_primary;
-         vector<int> up, acting;
-         startmap->pg_to_up_acting_osds(
-           info->pgid.pgid, &up, &up_primary, &acting, &acting_primary);
-
-         int role = startmap->calc_pg_role(pg_shard_t(whoami, info->pgid.shard),
-                                           acting);
-
-         create_pg_collection(
-           rctx.transaction,
-           info->pgid,
-           info->pgid.get_split_bits(pp->get_pg_num()));
-         init_pg_ondisk(
-           rctx.transaction,
-           info->pgid,
-           pp);
-
-         pg->init(
-           coll,
-           role,
-           up,
-           up_primary,
-           acting,
-           acting_primary,
-           info->history,
-           info->past_intervals,
-           false,
-           rctx.transaction);
-
-         return shard_services.start_operation<PGAdvanceMap>(
-           *this, pg, pg->get_osdmap_epoch(),
-           osdmap->get_epoch(), std::move(rctx), true).second.then([pg] {
-             return seastar::make_ready_future<Ref<PG>>(pg);
-         });
-       });
-    });
+      }).then([this, &info](auto pg, auto startmap) ->
+              seastar::future<Ref<PG>> {
+        if (!pg)
+          return seastar::make_ready_future<Ref<PG>>(Ref<PG>());
+        PeeringCtx rctx{ceph_release_t::octopus};
+        const pg_pool_t* pp = startmap->get_pg_pool(info->pgid.pool());
+
+        int up_primary, acting_primary;
+        vector<int> up, acting;
+        startmap->pg_to_up_acting_osds(
+          info->pgid.pgid, &up, &up_primary, &acting, &acting_primary);
+
+        int role = startmap->calc_pg_role(pg_shard_t(whoami, info->pgid.shard),
+                                          acting);
+
+        create_pg_collection(
+          rctx.transaction,
+          info->pgid,
+          info->pgid.get_split_bits(pp->get_pg_num()));
+        init_pg_ondisk(
+          rctx.transaction,
+          info->pgid,
+          pp);
+
+        pg->init(
+          role,
+          up,
+          up_primary,
+          acting,
+          acting_primary,
+          info->history,
+          info->past_intervals,
+          false,
+          rctx.transaction);
+
+        return shard_services.start_operation<PGAdvanceMap>(
+          *this, pg, pg->get_osdmap_epoch(),
+          osdmap->get_epoch(), std::move(rctx), true).second.then([pg] {
+            return seastar::make_ready_future<Ref<PG>>(pg);
+        });
+      });
   });
 }
 
index 570017a8a9bb1c190e128ebea397e57792b0bba0..b645f2dec6dfc4bb01a60be2352e8e811727c371 100644 (file)
@@ -134,7 +134,9 @@ private:
   seastar::future<> _send_boot();
   seastar::future<> _add_me_to_crush();
 
-  seastar::future<Ref<PG>> make_pg(cached_map_t create_map, spg_t pgid);
+  seastar::future<Ref<PG>> make_pg(cached_map_t create_map,
+                                  spg_t pgid,
+                                  bool do_create);
   seastar::future<Ref<PG>> load_pg(spg_t pgid);
   seastar::future<> load_pgs();
 
index afacf0163cf46a7d318cf328f10ba87166cf5efa..3a89c59f41684889f9806c70d7e77f617709288d 100644 (file)
@@ -343,7 +343,6 @@ void PG::schedule_renew_lease(epoch_t last_peering_reset, ceph::timespan delay)
 
 
 void PG::init(
-  crimson::os::CollectionRef coll,
   int role,
   const vector<int>& newup, int new_up_primary,
   const vector<int>& newacting, int new_acting_primary,
@@ -352,7 +351,6 @@ void PG::init(
   bool backfill,
   ObjectStore::Transaction &t)
 {
-  coll_ref = coll;
   peering_state.init(
     role, newup, new_up_primary, newacting,
     new_acting_primary, history, pi, backfill, t);
index d303745c544c8ede8ad9e71e3e12512aba0fa8ee..90e7cc4062be4f6dde7f7f51b4970832758b03f7 100644 (file)
@@ -394,7 +394,6 @@ public:
 
   /// initialize created PG
   void init(
-    crimson::os::CollectionRef coll_ref,
     int role,
     const std::vector<int>& up,
     int up_primary,