From: Zhang Song Date: Tue, 10 Jan 2023 10:02:50 +0000 (+0800) Subject: crimson/os/seastore: get segment info from cold segment provider X-Git-Tag: v19.0.0~1546^2~6 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=7b0ccecbced037bbceca707d62d81fe2accc5a39;p=ceph.git crimson/os/seastore: get segment info from cold segment provider Signed-off-by: Zhang Song --- diff --git a/src/crimson/os/seastore/cache.cc b/src/crimson/os/seastore/cache.cc index 064cb0cc8421e..86e307246f3b7 100644 --- a/src/crimson/os/seastore/cache.cc +++ b/src/crimson/os/seastore/cache.cc @@ -46,6 +46,7 @@ Cache::Cache( LOG_PREFIX(Cache::Cache); INFO("created, lru_size={}", lru.get_capacity()); register_metrics(); + segment_providers_by_device_id.resize(DEVICE_ID_MAX, nullptr); } Cache::~Cache() @@ -1116,12 +1117,13 @@ record_t Cache::prepare_record( auto stype = segment_type_t::NULL_SEG; // FIXME: This is specific to the segmented implementation - if (segment_provider != nullptr && - i->get_paddr().get_addr_type() == paddr_types_t::SEGMENT) { + if (i->get_paddr().get_addr_type() == paddr_types_t::SEGMENT) { auto sid = i->get_paddr().as_seg_paddr().get_segment_id(); - auto &sinfo = segment_provider->get_seg_info(sid); - sseq = sinfo.seq; - stype = sinfo.type; + auto sinfo = get_segment_info(sid); + if (sinfo) { + sseq = sinfo->seq; + stype = sinfo->type; + } } record.push_back( @@ -1660,21 +1662,22 @@ Cache::replay_delta( * safetly skip these deltas because the extent must already * have been rewritten. */ - if (segment_provider != nullptr && - delta.paddr != P_ADDR_NULL && + if (delta.paddr != P_ADDR_NULL && delta.paddr.get_addr_type() == paddr_types_t::SEGMENT) { auto& seg_addr = delta.paddr.as_seg_paddr(); - auto& seg_info = segment_provider->get_seg_info(seg_addr.get_segment_id()); - auto delta_paddr_segment_seq = seg_info.seq; - auto delta_paddr_segment_type = seg_info.type; - if (delta_paddr_segment_seq != delta.ext_seq || - delta_paddr_segment_type != delta.seg_type) { - DEBUG("delta is obsolete, delta_paddr_segment_seq={}," - " delta_paddr_segment_type={} -- {}", - segment_seq_printer_t{delta_paddr_segment_seq}, - delta_paddr_segment_type, - delta); - return replay_delta_ertr::make_ready_future(false); + auto seg_info = get_segment_info(seg_addr.get_segment_id()); + if (seg_info) { + auto delta_paddr_segment_seq = seg_info->seq; + auto delta_paddr_segment_type = seg_info->type; + if (delta_paddr_segment_seq != delta.ext_seq || + delta_paddr_segment_type != delta.seg_type) { + DEBUG("delta is obsolete, delta_paddr_segment_seq={}," + " delta_paddr_segment_type={} -- {}", + segment_seq_printer_t{delta_paddr_segment_seq}, + delta_paddr_segment_type, + delta); + return replay_delta_ertr::make_ready_future(false); + } } } diff --git a/src/crimson/os/seastore/cache.h b/src/crimson/os/seastore/cache.h index 375771d15511e..575d148408f65 100644 --- a/src/crimson/os/seastore/cache.h +++ b/src/crimson/os/seastore/cache.h @@ -567,6 +567,15 @@ private: return backref_entryrefs_by_seq; } + const segment_info_t* get_segment_info(segment_id_t sid) { + auto provider = segment_providers_by_device_id[sid.device_id()]; + if (provider) { + return &provider->get_seg_info(sid); + } else { + return nullptr; + } + } + public: /** * get_extent_by_type @@ -685,9 +694,8 @@ public: * * FIXME: This is specific to the segmented implementation */ - void set_segment_provider(SegmentProvider &sp) { - assert(segment_provider == nullptr); - segment_provider = &sp; + void set_segment_providers(std::vector &&providers) { + segment_providers_by_device_id = std::move(providers); } /** @@ -980,7 +988,7 @@ private: journal_seq_t last_commit = JOURNAL_SEQ_MIN; // FIXME: This is specific to the segmented implementation - SegmentProvider *segment_provider = nullptr; + std::vector segment_providers_by_device_id; /** * dirty diff --git a/src/crimson/os/seastore/transaction_manager.cc b/src/crimson/os/seastore/transaction_manager.cc index 841abde33399a..5fa136534fc32 100644 --- a/src/crimson/os/seastore/transaction_manager.cc +++ b/src/crimson/os/seastore/transaction_manager.cc @@ -643,6 +643,7 @@ TransactionManagerRef make_transaction_manager( auto rbs = std::make_unique(); auto backref_manager = create_backref_manager(*cache); SegmentManagerGroupRef cold_sms = nullptr; + std::vector segment_providers_by_id{DEVICE_ID_MAX, nullptr}; auto p_backend_type = primary_device->get_backend_type(); @@ -722,6 +723,12 @@ TransactionManagerRef make_transaction_manager( epm->get_ool_segment_seq_allocator(), cleaner_is_detailed, /* is_cold = */ true); + if (journal_type == journal_type_t::SEGMENTED) { + for (auto id : cold_segment_cleaner->get_device_ids()) { + segment_providers_by_id[id] = + static_cast(cold_segment_cleaner.get()); + } + } } if (journal_type == journal_type_t::SEGMENTED) { @@ -732,7 +739,10 @@ TransactionManagerRef make_transaction_manager( epm->get_ool_segment_seq_allocator(), cleaner_is_detailed); auto segment_cleaner = static_cast(cleaner.get()); - cache->set_segment_provider(*segment_cleaner); + for (auto id : segment_cleaner->get_device_ids()) { + segment_providers_by_id[id] = + static_cast(segment_cleaner); + } segment_cleaner->set_journal_trimmer(*journal_trimmer); journal = journal::make_segmented( *segment_cleaner, @@ -748,6 +758,8 @@ TransactionManagerRef make_transaction_manager( ""); } + cache->set_segment_providers(std::move(segment_providers_by_id)); + epm->init(std::move(journal_trimmer), std::move(cleaner), std::move(cold_segment_cleaner));