assert(next->version == prev->version + 1);
extents.replace(*next, *prev);
- if (prev->get_type() == extent_types_t::ROOT) {
+ if (is_root_type(prev->get_type())) {
assert(prev->is_stable_clean()
|| prev->primary_ref_list_hook.is_linked());
if (prev->is_dirty()) {
auto [iter, inserted] = i->mutation_pendings.insert(*ret);
ceph_assert(inserted);
t.add_mutated_extent(ret);
- if (ret->get_type() == extent_types_t::ROOT) {
+ if (is_root_type(ret->get_type())) {
t.root = ret->cast<RootBlock>();
} else {
ret->last_committed_crc = i->last_committed_crc;
assert(i->get_version() > 0);
auto final_crc = i->calc_crc32c();
- if (i->get_type() == extent_types_t::ROOT) {
+ if (is_root_type(i->get_type())) {
SUBTRACET(seastore_t, "writing out root delta {}B -- {}",
t, delta_length, *i);
assert(t.root == i);
retire_stat.increment(extent->get_length());
DEBUGT("retired and remove extent -- {}", t, *extent);
commit_retire_extent(t, extent);
- if (is_backref_mapped_extent_node(extent)
- || is_retired_placeholder(extent->get_type())) {
+ if (is_backref_mapped_extent_node(extent) ||
+ is_retired_placeholder_type(extent->get_type())) {
rel_delta.alloc_blk_ranges.emplace_back(
extent->get_paddr(),
L_ADDR_NULL,
i->prepare_write();
i->prepare_commit();
bl.append(i->get_bptr());
- if (i->get_type() == extent_types_t::ROOT) {
+ if (is_root_type(i->get_type())) {
ceph_assert(0 == "ROOT never gets written as a fresh block");
}
i->prior_instance = CachedExtentRef();
i->state = CachedExtent::extent_state_t::DIRTY;
assert(i->version > 0);
- if (i->version == 1 || i->get_type() == extent_types_t::ROOT) {
+ if (i->version == 1 || is_root_type(i->get_type())) {
i->dirty_from_or_retired_at = start_seq;
DEBUGT("commit extent done, become dirty -- {}", t, *i);
} else {
for (auto &i: t.retired_set) {
auto &extent = i.extent;
extent->dirty_from_or_retired_at = start_seq;
- if (is_backref_mapped_extent_node(extent)
- || is_retired_placeholder(extent->get_type())) {
+ if (is_backref_mapped_extent_node(extent) ||
+ is_retired_placeholder_type(extent->get_type())) {
DEBUGT("backref_list free {} len {}",
t,
extent->get_paddr(),
std::make_pair(false, nullptr));
}
- if (delta.type == extent_types_t::ROOT) {
+ if (is_root_type(delta.type)) {
TRACE("replay root delta at {} {}, remove extent ... -- {}, prv_root={}",
journal_seq, record_base, delta, *root);
remove_extent(root);
if (ret) {
// no retired-placeholder should be exist yet because no transaction
// has been created.
- assert(ret->get_type() != extent_types_t::RETIRED_PLACEHOLDER);
+ assert(!is_retired_placeholder_type(ret->get_type()));
return ret->wait_io().then([ret] {
return ret;
});
if (result == Transaction::get_extent_ret::ABSENT) {
DEBUGT("extent is absent on t -- {}", t, *ext);
t.add_to_read_set(ext);
- if (ext->get_type() == extent_types_t::ROOT) {
+ if (is_root_type(ext->get_type())) {
if (t.root) {
assert(&*t.root == &*ext);
ceph_assert(0 == "t.root would have to already be in the read set");
if (!ret) {
SUBDEBUGT(seastore_cache, "{} {} is absent", t, type, offset);
return get_extent_if_cached_iertr::make_ready_future<CachedExtentRef>();
- } else if (ret->get_type() == extent_types_t::RETIRED_PLACEHOLDER) {
+ } else if (is_retired_placeholder_type(ret->get_type())) {
// retired_placeholder is not really cached yet
SUBDEBUGT(seastore_cache, "{} {} is absent(placeholder)",
t, type, offset);
}
// user should not see RETIRED_PLACEHOLDER extents
- ceph_assert(p_extent->get_type() != extent_types_t::RETIRED_PLACEHOLDER);
+ ceph_assert(!is_retired_placeholder_type(p_extent->get_type()));
if (!p_extent->is_fully_loaded()) {
assert(!p_extent->is_mutable());
LOG_PREFIX(Cache::get_extent_viewable_by_trans);
}
// extent PRESENT in cache
- if (cached->get_type() == extent_types_t::RETIRED_PLACEHOLDER) {
+ if (is_retired_placeholder_type(cached->get_type())) {
auto ret = CachedExtent::make_cached_extent_ref<T>(
alloc_cache_buf(length));
ret->init(CachedExtent::extent_state_t::CLEAN_PENDING,
iter != extents.end()) {
if (p_metric_key &&
// retired_placeholder is not really cached yet
- iter->get_type() != extent_types_t::RETIRED_PLACEHOLDER) {
+ !is_retired_placeholder_type(iter->get_type())) {
++p_counters->hit;
}
return CachedExtentRef(&*iter);
/// Returns true if extent is a plcaeholder
bool is_placeholder() const {
- return get_type() == extent_types_t::RETIRED_PLACEHOLDER;
+ return is_retired_placeholder_type(get_type());
}
bool is_pending_io() const {
return false;
}
assert(t.get_src() == transaction_type_t::TRIM_DIRTY);
- ceph_assert_always(extent->get_type() == extent_types_t::ROOT ||
+ ceph_assert_always(is_root_type(extent->get_type()) ||
extent->get_paddr().is_absolute());
return crimson::os::seastore::can_inplace_rewrite(extent->get_type());
}
extent_types_t type,
placement_hint_t hint,
rewrite_gen_t gen) {
- if (type == extent_types_t::ROOT) {
+ assert(is_real_type(type));
+ if (is_root_type(type)) {
gen = INLINE_GENERATION;
} else if (get_main_backend_type() == backend_type_t::SEGMENTED &&
is_lba_backref_node(type)) {
return out << "OBJECT_DATA_BLOCK";
case extent_types_t::RETIRED_PLACEHOLDER:
return out << "RETIRED_PLACEHOLDER";
+ case extent_types_t::ALLOC_INFO:
+ return out << "ALLOC_INFO";
+ case extent_types_t::JOURNAL_TAIL:
+ return out << "JOURNAL_TAIL";
case extent_types_t::TEST_BLOCK:
return out << "TEST_BLOCK";
case extent_types_t::TEST_BLOCK_PHYSICAL:
case extent_types_t::NONE:
return out << "NONE";
default:
- return out << "UNKNOWN";
+ return out << "UNKNOWN(" << (unsigned)t << ")";
}
}
}
bool can_inplace_rewrite(extent_types_t type) {
- return get_extent_category(type) == data_category_t::DATA;
+ return is_data_type(type);
}
std::ostream &operator<<(std::ostream &out, sea_time_point_printer_t tp)
std::ostream &operator<<(std::ostream &out, extent_types_t t);
+constexpr bool is_data_type(extent_types_t type) {
+ return type == extent_types_t::OBJECT_DATA_BLOCK ||
+ type == extent_types_t::TEST_BLOCK;
+}
+
+constexpr bool is_logical_metadata_type(extent_types_t type) {
+ return type >= extent_types_t::OMAP_INNER &&
+ type <= extent_types_t::COLL_BLOCK;
+}
+
constexpr bool is_logical_type(extent_types_t type) {
- switch (type) {
- case extent_types_t::ROOT:
- case extent_types_t::LADDR_INTERNAL:
- case extent_types_t::LADDR_LEAF:
- case extent_types_t::BACKREF_INTERNAL:
- case extent_types_t::BACKREF_LEAF:
- return false;
- default:
+ if ((type >= extent_types_t::OMAP_INNER &&
+ type <= extent_types_t::OBJECT_DATA_BLOCK) ||
+ type == extent_types_t::TEST_BLOCK) {
+ assert(is_logical_metadata_type(type) ||
+ is_data_type(type));
return true;
+ } else {
+ assert(!is_logical_metadata_type(type) &&
+ !is_data_type(type));
+ return false;
}
}
-constexpr bool is_retired_placeholder(extent_types_t type)
-{
+constexpr bool is_retired_placeholder_type(extent_types_t type) {
return type == extent_types_t::RETIRED_PLACEHOLDER;
}
-constexpr bool is_lba_node(extent_types_t type)
-{
+constexpr bool is_root_type(extent_types_t type) {
+ return type == extent_types_t::ROOT;
+}
+
+constexpr bool is_lba_node(extent_types_t type) {
return type == extent_types_t::LADDR_INTERNAL ||
- type == extent_types_t::LADDR_LEAF ||
- type == extent_types_t::DINK_LADDR_LEAF;
+ type == extent_types_t::LADDR_LEAF ||
+ type == extent_types_t::DINK_LADDR_LEAF;
}
-constexpr bool is_backref_node(extent_types_t type)
-{
+constexpr bool is_backref_node(extent_types_t type) {
return type == extent_types_t::BACKREF_INTERNAL ||
- type == extent_types_t::BACKREF_LEAF;
+ type == extent_types_t::BACKREF_LEAF;
}
-constexpr bool is_lba_backref_node(extent_types_t type)
-{
+constexpr bool is_lba_backref_node(extent_types_t type) {
return is_lba_node(type) || is_backref_node(type);
}
+constexpr bool is_physical_type(extent_types_t type) {
+ if (type <= extent_types_t::DINK_LADDR_LEAF ||
+ (type >= extent_types_t::TEST_BLOCK_PHYSICAL &&
+ type <= extent_types_t::BACKREF_LEAF)) {
+ assert(is_root_type(type) ||
+ is_lba_backref_node(type) ||
+ type == extent_types_t::TEST_BLOCK_PHYSICAL);
+ return true;
+ } else {
+ assert(!is_root_type(type) &&
+ !is_lba_backref_node(type) &&
+ type != extent_types_t::TEST_BLOCK_PHYSICAL);
+ return false;
+ }
+}
+
+constexpr bool is_real_type(extent_types_t type) {
+ if (type <= extent_types_t::OBJECT_DATA_BLOCK ||
+ (type >= extent_types_t::TEST_BLOCK &&
+ type <= extent_types_t::BACKREF_LEAF)) {
+ assert(is_logical_type(type) ||
+ is_physical_type(type));
+ return true;
+ } else {
+ assert(!is_logical_type(type) &&
+ !is_physical_type(type));
+ return false;
+ }
+}
+
std::ostream &operator<<(std::ostream &out, extent_types_t t);
/**
std::ostream &operator<<(std::ostream &out, data_category_t c);
constexpr data_category_t get_extent_category(extent_types_t type) {
- if (type == extent_types_t::OBJECT_DATA_BLOCK ||
- type == extent_types_t::TEST_BLOCK) {
+ if (is_data_type(type)) {
return data_category_t::DATA;
} else {
return data_category_t::METADATA;
iter != read_set.end()) {
// placeholder in read-set should be in the retired-set
// at the same time.
- assert(iter->ref->get_type() != extent_types_t::RETIRED_PLACEHOLDER);
+ assert(!is_retired_placeholder_type(iter->ref->get_type()));
if (out)
*out = iter->ref;
SUBTRACET(seastore_cache, "{} is present in read_set -- {}",
void replace_placeholder(CachedExtent& placeholder, CachedExtent& extent) {
ceph_assert(!is_weak());
- assert(placeholder.get_type() == extent_types_t::RETIRED_PLACEHOLDER);
- assert(extent.get_type() != extent_types_t::RETIRED_PLACEHOLDER);
- assert(extent.get_type() != extent_types_t::ROOT);
+ assert(is_retired_placeholder_type(placeholder.get_type()));
+ assert(!is_retired_placeholder_type(extent.get_type()));
+ assert(!is_root_type(extent.get_type()));
assert(extent.get_paddr() == placeholder.get_paddr());
{
auto where = read_set.find(placeholder.get_paddr());
return backref_manager->rewrite_extent(t, extent);
}
- if (extent->get_type() == extent_types_t::ROOT) {
+ if (is_root_type(extent->get_type())) {
DEBUGT("rewriting root extent -- {}", t, *extent);
cache->duplicate_for_write(t, extent);
return rewrite_extent_iertr::now();
extent_types_t::ONODE_BLOCK_STAGED,
extent_types_t::COLL_BLOCK,
extent_types_t::OBJECT_DATA_BLOCK,
- extent_types_t::RETIRED_PLACEHOLDER,
- extent_types_t::ALLOC_INFO,
- extent_types_t::JOURNAL_TAIL,
extent_types_t::TEST_BLOCK,
extent_types_t::TEST_BLOCK_PHYSICAL,
extent_types_t::BACKREF_INTERNAL,
extent_types_t::BACKREF_LEAF
};
+ // exclude DINK_LADDR_LEAF, RETIRED_PLACEHOLDER,
+ // ALLOC_INFO, JOURNAL_TAIL
+ assert(all_extent_types.size() == EXTENT_TYPES_MAX - 4);
std::vector<rewrite_gen_t> all_generations;
for (auto i = INIT_GENERATION; i < REWRITE_GENERATIONS; i++) {
// this loop should be consistent with EPM::adjust_generation
for (auto t : all_extent_types) {
+ assert(is_real_type(t));
expected_generations[t] = {};
- if (!is_logical_type(t)) {
+ if (is_root_type(t) || is_lba_backref_node(t)) {
for (auto gen : all_generations) {
expected_generations[t][gen] = INLINE_GENERATION;
}
auto update_data_gen_mapping = [&](std::function<rewrite_gen_t(rewrite_gen_t)> func) {
for (auto t : all_extent_types) {
- if (!is_logical_type(t)) {
+ if (is_root_type(t) || is_lba_backref_node(t)) {
continue;
}
for (auto i = INIT_GENERATION + 1; i < REWRITE_GENERATIONS; i++) {