From: Xuehan Xu Date: Thu, 12 Mar 2020 05:53:39 +0000 (+0800) Subject: crimson: make sure pg meta is valid when loading pg X-Git-Tag: v16.1.0~2758^2~2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=adbdd753f1d16942b279e5ae0cea01c2efd633f6;p=ceph.git crimson: make sure pg meta is valid when loading pg currently, PGMeta instances are all local variables in method, which would lead to daggling reference/pointer problems when using seastar::futures. Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index 01f938535774..8e6ae3ea8fbf 100644 --- a/src/crimson/osd/osd.cc +++ b/src/crimson/osd/osd.cc @@ -549,13 +549,15 @@ seastar::future> OSD::make_pg(cached_map_t create_map, seastar::future> OSD::load_pg(spg_t pgid) { - return PGMeta{store.get(), pgid}.get_epoch().then([this](epoch_t e) { + return seastar::do_with(PGMeta(store.get(), pgid), [this, pgid] (auto& pg_meta) { + return pg_meta.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, false); - }).then([this, pgid](Ref pg) { + }).then([this](Ref pg) { return pg->read_state(store.get()).then([pg] { - return seastar::make_ready_future>(std::move(pg)); + return seastar::make_ready_future>(std::move(pg)); }); }).handle_exception([pgid](auto ep) { logger().info("pg {} saw exception on load {}", pgid, ep); diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index fcef9c45aa19..62d5adfd0ff1 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -364,8 +364,9 @@ void PG::init( seastar::future<> PG::read_state(crimson::os::FuturizedStore* store) { - return PGMeta{store, pgid}.load( - ).then([this, store](pg_info_t pg_info, PastIntervals past_intervals) { + return seastar::do_with(PGMeta(store, pgid), [this, store] (auto& pg_meta) { + return pg_meta.load(); + }).then([this, store](pg_info_t pg_info, PastIntervals past_intervals) { return peering_state.init_from_disk_state( std::move(pg_info), std::move(past_intervals),