extent_types_t type, ///< [in] type tag
extent_len_t length, ///< [in] length
placement_hint_t hint, ///< [in] user hint
- rewrite_gen_t gen ///< [in] rewrite generation
+ rewrite_gen_t gen, ///< [in] rewrite generation
+ bool is_tracked
)
{
LOG_PREFIX(Cache::alloc_new_non_data_extent_by_type);
SUBDEBUGT(seastore_cache, "allocate {} 0x{:x}B, hint={}, gen={}",
t, type, length, hint, rewrite_gen_printer_t{gen});
ceph_assert(get_extent_category(type) == data_category_t::METADATA);
- auto opt = alloc_option_t{hint, gen};
+ auto opt = alloc_option_t{hint, gen, is_tracked};
switch (type) {
case extent_types_t::ROOT:
ceph_assert(0 == "ROOT is never directly alloc'd");
extent_types_t type, ///< [in] type tag
extent_len_t length, ///< [in] length
placement_hint_t hint, ///< [in] user hint
- rewrite_gen_t gen ///< [in] rewrite generation
+ rewrite_gen_t gen, ///< [in] rewrite generation
+ bool is_tracked
)
{
LOG_PREFIX(Cache::alloc_new_data_extents_by_type);
case extent_types_t::OBJECT_DATA_BLOCK:
{
auto extents = alloc_new_data_extents<
- ObjectDataBlock>(t, length, {hint, gen});
+ ObjectDataBlock>(t, length, {hint, gen, is_tracked});
res.insert(res.begin(), extents.begin(), extents.end());
}
return res;
case extent_types_t::TEST_BLOCK:
{
auto extents = alloc_new_data_extents<
- TestBlock>(t, length, {hint, gen});
+ TestBlock>(t, length, {hint, gen, is_tracked});
res.insert(res.begin(), extents.begin(), extents.end());
}
return res;
extent_types_t type, ///< [in] type tag
extent_len_t length, ///< [in] length
placement_hint_t hint, ///< [in] user hint
- rewrite_gen_t gen ///< [in] rewrite generation
+ rewrite_gen_t gen, ///< [in] rewrite generation
+ bool is_tracked
);
/**
extent_types_t type, ///< [in] type tag
extent_len_t length, ///< [in] length
placement_hint_t hint, ///< [in] user hint
- rewrite_gen_t gen ///< [in] rewrite generation
+ rewrite_gen_t gen, ///< [in] rewrite generation
+ bool is_tracked
);
/**
struct alloc_option_t {
placement_hint_t hint;
rewrite_gen_t gen;
+ bool is_tracked;
#ifdef UNIT_TESTS_BUILT
std::optional<paddr_t> external_paddr = std::nullopt;
#endif
assert(opt.gen == INIT_GENERATION || opt.hint == placement_hint_t::REWRITE);
data_category_t category = get_extent_category(type);
- opt.gen = adjust_generation(category, type, opt.hint, opt.gen);
+ opt.gen = adjust_generation(category, type, opt.hint, opt.gen, opt.is_tracked);
paddr_t addr;
#ifdef UNIT_TESTS_BUILT
assert(opt.gen == INIT_GENERATION || opt.hint == placement_hint_t::REWRITE);
data_category_t category = get_extent_category(type);
- opt.gen = adjust_generation(category, type, opt.hint, opt.gen);
+ opt.gen = adjust_generation(category, type, opt.hint, opt.gen, opt.is_tracked);
assert(opt.gen != INLINE_GENERATION);
// XXX: bp might be extended to point to different memory (e.g. PMem)
data_category_t category,
extent_types_t type,
placement_hint_t hint,
- rewrite_gen_t gen) {
+ rewrite_gen_t gen,
+ bool is_tracked) {
assert(is_real_type(type));
if (is_root_type(type)) {
gen = INLINE_GENERATION;
gen = background_process.adjust_generation(gen);
}
+ if (is_tracked && gen >= hot_tier_generations &&
+ hint != placement_hint_t::REWRITE) {
+ gen = hot_tier_generations - 1;
+ }
+
if (gen > dynamic_max_rewrite_generation) {
gen = dynamic_max_rewrite_generation;
}
journal(std::move(_journal)),
epm(std::move(_epm)),
backref_manager(std::move(_backref_manager)),
+ logical_bucket(nullptr),
full_extent_integrity_check(
crimson::common::get_conf<bool>(
"seastore_full_integrity_check")),
ceph_abort();
}
+ bool is_tracked =
+ support_logical_bucket() &&
+ // lextent is from hot tier
+ !epm->is_cold_device(extent->get_paddr().get_device_id()) &&
+ // lextent is cached by non volatile cache
+ logical_bucket->is_cached(
+ extent->get_laddr().get_object_prefix());
+
if (get_extent_category(extent->get_type()) == data_category_t::METADATA) {
assert(extent->is_fully_loaded());
cache->retire_extent(t, extent);
extent->get_length(),
extent->get_user_hint(),
// get target rewrite generation
- extent->get_rewrite_generation())->cast<LogicalChildNode>();
+ extent->get_rewrite_generation(),
+ is_tracked)->cast<LogicalChildNode>();
nextent->rewrite(t, *extent, 0);
DEBUGT("rewriting meta -- {} to {}", t, *extent, *nextent);
extent->get_length(),
extent->get_user_hint(),
// get target rewrite generation
- extent->get_rewrite_generation());
+ extent->get_rewrite_generation(),
+ is_tracked);
extent_len_t off = 0;
auto left = extent->get_length();
extent_ref_count_t refcount = 0;
orig_ext->get_type(),
orig_ext->get_length(),
placement_hint_t::HOT,
- INIT_GENERATION);
+ INIT_GENERATION,
+ true);
promoted_extents.reserve(promoted_raw_extents.size());
orig_ext->get_type(),
orig_ext->get_length(),
placement_hint_t::HOT,
- INIT_GENERATION);
+ INIT_GENERATION,
+ true);
auto lext = promoted_extent->cast<LogicalChildNode>();
lext->set_laddr(orig_ext->get_laddr());
lext->rewrite(t, *orig_ext, 0);
#include "crimson/os/seastore/logging.h"
#include "crimson/os/seastore/seastore_types.h"
#include "crimson/os/seastore/cache.h"
+#include "crimson/os/seastore/logical_bucket.h"
#include "crimson/os/seastore/root_meta.h"
#include "crimson/os/seastore/lba_manager.h"
#include "crimson/os/seastore/backref_manager.h"
co_return mapping;
}
+ bool support_logical_bucket() const {
+ return logical_bucket != nullptr;
+ }
+
~TransactionManager();
private:
BackrefManagerRef backref_manager;
WritePipeline write_pipeline;
+ LogicalBucket *logical_bucket;
bool full_extent_integrity_check = true;
get_extent_category(t),
t,
placement_hint_t::HOT,
- gen);
+ gen,
+ false);
if (expected_generations[t][gen] != epm_gen) {
logger().error("caller: {}, extent type: {}, input generation: {}, "
"expected generation : {}, adjust result from EPM: {}",