if (is_backref_mapped_type(extent->get_type()) ||
is_retired_placeholder_type(extent->get_type())) {
rel_delta.alloc_blk_ranges.emplace_back(
- extent->get_paddr(),
- L_ADDR_NULL,
- extent->get_length(),
- extent->get_type());
+ alloc_blk_t::create_retire(
+ extent->get_paddr(),
+ extent->get_length(),
+ extent->get_type()));
}
}
alloc_deltas.emplace_back(std::move(rel_delta));
alloc_laddr = L_ADDR_MIN;
}
alloc_delta.alloc_blk_ranges.emplace_back(
- i->get_paddr(),
- alloc_laddr,
- i->get_length(),
- i->get_type());
+ alloc_blk_t::create_alloc(
+ i->get_paddr(),
+ alloc_laddr,
+ i->get_length(),
+ i->get_type()));
}
}
alloc_laddr = i->cast<lba_manager::btree::LBANode>()->get_node_meta().begin;
}
alloc_delta.alloc_blk_ranges.emplace_back(
- i->get_paddr(),
- alloc_laddr,
- i->get_length(),
- i->get_type());
+ alloc_blk_t::create_alloc(
+ i->get_paddr(),
+ alloc_laddr,
+ i->get_length(),
+ i->get_type()));
}
}
for (auto &i: t.existing_block_list) {
if (i->is_valid()) {
alloc_delta.alloc_blk_ranges.emplace_back(
- i->get_paddr(),
- i->cast<LogicalCachedExtent>()->get_laddr(),
- i->get_length(),
- i->get_type());
+ alloc_blk_t::create_alloc(
+ i->get_paddr(),
+ i->cast<LogicalCachedExtent>()->get_laddr(),
+ i->get_length(),
+ i->get_type()));
}
}
alloc_deltas.emplace_back(std::move(alloc_delta));
alloc_laddr = L_ADDR_MIN;
}
backref_entries.emplace_back(
- std::make_unique<backref_entry_t>(
+ backref_entry_t::create_alloc(
i->get_paddr(),
alloc_laddr,
i->get_length(),
extent->get_paddr(),
extent->get_length());
backref_entries.emplace_back(
- std::make_unique<backref_entry_t>(
+ backref_entry_t::create_retire(
extent->get_paddr(),
- L_ADDR_NULL,
extent->get_length(),
extent->get_type()));
} else if (is_backref_node(extent->get_type())) {
i->get_paddr(),
i->get_length());
backref_entries.emplace_back(
- std::make_unique<backref_entry_t>(
+ backref_entry_t::create_alloc(
i->get_paddr(),
i->cast<LogicalCachedExtent>()->get_laddr(),
i->get_length(),
DEBUG("replay alloc_blk {}~0x{:x} {}, journal_seq: {}",
alloc_blk.paddr, alloc_blk.len, alloc_blk.laddr, journal_seq);
backref_entries.emplace_back(
- std::make_unique<backref_entry_t>(
- alloc_blk.paddr,
- alloc_blk.laddr,
- alloc_blk.len,
- alloc_blk.type));
+ backref_entry_t::create(alloc_blk));
}
if (!backref_entries.empty()) {
backref_batch_update(std::move(backref_entries), journal_seq);
class SegmentProvider;
struct backref_entry_t {
+ using ref_t = std::unique_ptr<backref_entry_t>;
+
backref_entry_t(
const paddr_t& paddr,
const laddr_t& laddr,
: paddr(paddr),
laddr(laddr),
len(len),
- type(type) {}
+ type(type) {
+ assert(len > 0);
+ }
paddr_t paddr = P_ADDR_NULL;
laddr_t laddr = L_ADDR_NULL;
extent_len_t len = 0;
return l.paddr < r;
}
};
+
+ static ref_t create_alloc(
+ const paddr_t& paddr,
+ const laddr_t& laddr,
+ extent_len_t len,
+ extent_types_t type) {
+ assert(is_backref_mapped_type(type));
+ assert(laddr != L_ADDR_NULL);
+ return std::make_unique<backref_entry_t>(
+ paddr, laddr, len, type);
+ }
+
+ static ref_t create_retire(
+ const paddr_t& paddr,
+ extent_len_t len,
+ extent_types_t type) {
+ assert(is_backref_mapped_type(type) ||
+ is_retired_placeholder_type(type));
+ return std::make_unique<backref_entry_t>(
+ paddr, L_ADDR_NULL, len, type);
+ }
+
+ static ref_t create(const alloc_blk_t& delta) {
+ return std::make_unique<backref_entry_t>(
+ delta.paddr, delta.laddr, delta.len, delta.type);
+ }
};
std::ostream &operator<<(std::ostream &out, const backref_entry_t &ent);
-using backref_entry_ref = std::unique_ptr<backref_entry_t>;
+using backref_entry_ref = backref_entry_t::ref_t;
using backref_entry_mset_t = backref_entry_t::multiset_t;
using backref_entry_refs_t = std::vector<backref_entry_ref>;
using backref_entryrefs_by_seq_t = std::map<journal_seq_t, backref_entry_refs_t>;
const laddr_t& laddr,
extent_len_t len,
extent_types_t type)
- : paddr(paddr), laddr(laddr), len(len), type(type) {}
+ : paddr(paddr), laddr(laddr), len(len), type(type) {
+ assert(len > 0);
+ }
explicit alloc_blk_t() = default;
denc(v.type, p);
DENC_FINISH(p);
}
+
+ static alloc_blk_t create_alloc(
+ const paddr_t& paddr,
+ const laddr_t& laddr,
+ extent_len_t len,
+ extent_types_t type) {
+ assert(is_backref_mapped_type(type));
+ assert(laddr != L_ADDR_NULL);
+ return alloc_blk_t(paddr, laddr, len, type);
+ }
+
+ static alloc_blk_t create_retire(
+ const paddr_t& paddr,
+ extent_len_t len,
+ extent_types_t type) {
+ assert(is_backref_mapped_type(type) ||
+ is_retired_placeholder_type(type));
+ return alloc_blk_t(paddr, L_ADDR_NULL, len, type);
+ }
};
// use absolute address