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()
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(
* 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);
+ }
}
}
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
*
* 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);
}
/**
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
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();
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) {
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,
"");
}
+ cache->set_segment_providers(std::move(segment_providers_by_id));
+
epm->init(std::move(journal_trimmer),
std::move(cleaner),
std::move(cold_segment_cleaner));