static bool is_meta_pool(int64_t pool) {
return pool == POOL_META;
}
+ static int64_t get_logical_pool(int64_t pool) {
+ if (is_temp_pool(pool))
+ return get_temp_pool(pool); // it's reversible
+ else
+ return pool;
+ }
public:
object_t oid;
return is_meta_pool(pool);
}
int64_t get_logical_pool() const {
- if (is_temp_pool(pool))
- return get_temp_pool(pool); // it's reversible
- else
- return pool;
+ return get_logical_pool(pool);
}
hobject_t() : snap(0), hash(0), max(false), pool(INT64_MIN) {
"ObjectDataHandler::read hit invalid error"
)
);
+ auto prefix = l_start.get_laddr().get_object_prefix();
+ bool all_cold = true;
for (auto &pin : rpins) {
if (pin.mapping.is_zero_reserved()) {
ret.append_zero(pin.unaligned_len);
assert(pin.unaligned_start_offset == 0);
ret.append(std::move(aligned_bl));
}
+ DEBUGT("got extent: {}", ctx.t, *maybe_indirect_extent.extent);
+ auto paddr = maybe_indirect_extent.extent->get_paddr();
+ all_cold &= ctx.tm.is_cold_device(paddr.get_device_id());
+ }
+ if (!all_cold) {
+ assert(ctx.tm.is_prefix_cached(prefix));
+ ctx.tm.update_logical_bucket_for_read(prefix);
}
co_return std::move(ret);
}
views.clear();
copied_lba_keys.clear();
update_copied_lba_key = nullptr;
+ touched_prefix.clear();
}
bool did_reset() const {
return cache_hint;
}
+ void touch_laddr_prefix(laddr_t laddr) {
+ touched_prefix.insert(laddr.get_object_prefix());
+ }
+
+ std::unordered_set<laddr_t> &get_touched_laddr_prefix() {
+ return touched_prefix;
+ }
+
btree_cursor_stats_t cursor_stats;
bool force_rewrite_conflict = false;
*/
retired_extent_set_t retired_set;
+ std::unordered_set<laddr_t> touched_prefix;
+
/// stats to collect when commit or invalidate
tree_stats_t onode_tree_stats;
tree_stats_t omap_tree_stats; // exclude omap tree depth
assert(paddr.is_absolute());
cache->update_tree_extents_num(type, 1);
epm->mark_space_used(paddr, len);
+ if (support_logical_bucket() &&
+ !epm->is_cold_device(paddr.get_device_id())) {
+ logical_bucket->move_to_top(laddr.get_object_prefix());
+ }
});
} else {
return backref_manager->scan_mapped_space(
assert(backref_key == P_ADDR_NULL);
cache->update_tree_extents_num(type, 1);
epm->mark_space_used(paddr, len);
+ if (support_logical_bucket() &&
+ !epm->is_cold_device(paddr.get_device_id())) {
+ logical_bucket->move_to_top(laddr.get_object_prefix());
+ }
}
});
}
journal->get_trimmer().update_journal_tails(
cache->get_oldest_dirty_from().value_or(start_seq),
cache->get_oldest_backref_dirty_from().value_or(start_seq));
+ if (support_logical_bucket()) {
+ for (auto &prefix : tref.get_touched_laddr_prefix()) {
+ logical_bucket->move_to_top(prefix.get_object_prefix());
+ }
+ }
}).handle_error(
submit_transaction_iertr::pass_further{},
crimson::ct_error::assert_all("Hit error submitting to journal")
true,
write_policy_t::WRITE_BACK
});
+ t.touch_laddr_prefix(orig_ext->get_laddr().get_object_prefix());
promoted_extents.reserve(promoted_raw_extents.size());
lext->rewrite(t, *orig_ext, 0);
assert(!extent->get_paddr().is_absolute() ||
!cache->is_on_cold_tier(lext->get_paddr()));
+ t.touch_laddr_prefix(orig_ext->get_laddr().get_object_prefix());
//TODO: this memory copy should be saved
orig_ext->get_bptr().copy_out(
0,
exts.begin(), exts.end()),
EXTENT_DEFAULT_REF_COUNT);
}
+ auto &front = exts.front();
+ if (front->get_write_policy() != write_policy_t::WRITE_THROUGH &&
+ front->get_rewrite_generation() <= epm->get_max_hot_gen()) {
+ auto prefix = front->get_laddr().get_object_prefix();
+ t.touch_laddr_prefix(prefix);
+ if (auto pool = prefix.get_pool();
+ unlikely(hobject_t::is_temp_pool(pool))) {
+ prefix.set_pool(hobject_t::get_logical_pool(pool));
+ t.touch_laddr_prefix(prefix);
+ }
+ }
for (auto &ext : exts) {
SUBDEBUGT(seastore_tm, "allocated {}", t, *ext);
}
});
}
+ // non-trivial method, should only be used in DEBUG build
+ bool is_prefix_cached(laddr_t prefix) {
+ if (!logical_bucket) {
+ return true;
+ }
+ return logical_bucket->is_cached(prefix);
+ }
+
+ void update_logical_bucket_for_read(laddr_t prefix) {
+ if (logical_bucket) {
+ logical_bucket->move_to_top(prefix.get_object_prefix());
+ }
+ }
+
+ bool is_cold_device(device_id_t id) const {
+ return epm->is_cold_device(id);
+ }
+
/**
* submit_transaction
*
}
bool support_logical_bucket() const {
- return logical_bucket != nullptr;
+ return epm->has_cold_tier() && logical_bucket != nullptr;
}
~TransactionManager();