Skip to content

Commit

Permalink
crimson/os/seastore: get segment info from cold segment provider
Browse files Browse the repository at this point in the history
Signed-off-by: Zhang Song <[email protected]>
  • Loading branch information
zhscn committed Mar 15, 2023
1 parent 783c5e7 commit 7b0ccec
Show file tree
Hide file tree
Showing 3 changed files with 46 additions and 23 deletions.
39 changes: 21 additions & 18 deletions src/crimson/os/seastore/cache.cc
Original file line number Diff line number Diff line change
Expand Up @@ -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()
Expand Down Expand Up @@ -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(
Expand Down Expand Up @@ -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<bool>(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<bool>(false);
}
}
}

Expand Down
16 changes: 12 additions & 4 deletions src/crimson/os/seastore/cache.h
Original file line number Diff line number Diff line change
Expand Up @@ -567,6 +567,15 @@ class Cache {
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
Expand Down Expand Up @@ -685,9 +694,8 @@ class Cache {
*
* 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<SegmentProvider*> &&providers) {
segment_providers_by_device_id = std::move(providers);
}

/**
Expand Down Expand Up @@ -980,7 +988,7 @@ class Cache {
journal_seq_t last_commit = JOURNAL_SEQ_MIN;

// FIXME: This is specific to the segmented implementation
SegmentProvider *segment_provider = nullptr;
std::vector<SegmentProvider*> segment_providers_by_device_id;

/**
* dirty
Expand Down
14 changes: 13 additions & 1 deletion src/crimson/os/seastore/transaction_manager.cc
Original file line number Diff line number Diff line change
Expand Up @@ -643,6 +643,7 @@ TransactionManagerRef make_transaction_manager(
auto rbs = std::make_unique<RBMDeviceGroup>();
auto backref_manager = create_backref_manager(*cache);
SegmentManagerGroupRef cold_sms = nullptr;
std::vector<SegmentProvider*> segment_providers_by_id{DEVICE_ID_MAX, nullptr};

auto p_backend_type = primary_device->get_backend_type();

Expand Down Expand Up @@ -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<SegmentProvider*>(cold_segment_cleaner.get());
}
}
}

if (journal_type == journal_type_t::SEGMENTED) {
Expand All @@ -732,7 +739,10 @@ TransactionManagerRef make_transaction_manager(
epm->get_ool_segment_seq_allocator(),
cleaner_is_detailed);
auto segment_cleaner = static_cast<SegmentCleaner*>(cleaner.get());
cache->set_segment_provider(*segment_cleaner);
for (auto id : segment_cleaner->get_device_ids()) {
segment_providers_by_id[id] =
static_cast<SegmentProvider*>(segment_cleaner);
}
segment_cleaner->set_journal_trimmer(*journal_trimmer);
journal = journal::make_segmented(
*segment_cleaner,
Expand All @@ -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));
Expand Down

0 comments on commit 7b0ccec

Please sign in to comment.