From adbdd753f1d16942b279e5ae0cea01c2efd633f6 Mon Sep 17 00:00:00 2001 From: Xuehan Xu Date: Thu, 12 Mar 2020 13:53:39 +0800 Subject: [PATCH] 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 --- src/crimson/osd/osd.cc | 8 +++++--- src/crimson/osd/pg.cc | 5 +++-- 2 files changed, 8 insertions(+), 5 deletions(-) diff --git a/src/crimson/osd/osd.cc b/src/crimson/osd/osd.cc index 01f93853577..8e6ae3ea8fb 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 fcef9c45aa1..62d5adfd0ff 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), -- 2.47.3