/// Dump live extents
void dump_contents();
+ void force_roll_backref_buffer() {
+ may_roll_backref_buffer(P_ADDR_NULL, true);
+ }
void may_roll_backref_buffer(
const paddr_t &final_block_start,
bool force_roll = false) {
void mark_space_free(
paddr_t addr,
- extent_len_t len) {
- if (!init_complete)
+ extent_len_t len,
+ const bool force = false) {
+ if (!init_complete && !force)
return;
ceph_assert(stats.used_bytes >= len);
*tref,
[this, FNAME](auto &t) {
return cache->init_cached_extents(t, [this](auto &t, auto &e) {
- return lba_manager->init_cached_extent(t, e);
+ if (is_backref_node(e->get_type()))
+ return backref_manager->init_cached_extent(t, e);
+ else
+ return lba_manager->init_cached_extent(t, e);
}).si_then([this, FNAME, &t] {
assert(segment_cleaner->debug_check_space(
*segment_cleaner->get_empty_space_tracker()));
- return lba_manager->scan_mapped_space(
+ return backref_manager->scan_mapped_space(
t,
[this, FNAME, &t](paddr_t addr, extent_len_t len, depth_t depth) {
TRACET(
seastar::lowres_system_clock::time_point(),
/* init_scan = */ true);
}
+ if (depth) {
+ if (depth > 1) {
+ cache->add_backref_extent(
+ addr, extent_types_t::BACKREF_INTERNAL);
+ } else {
+ cache->add_backref_extent(
+ addr, extent_types_t::BACKREF_LEAF);
+ }
+ }
+ }).si_then([this] {
+ LOG_PREFIX(TransactionManager::mount);
+ auto &backrefs = cache->get_backrefs();
+ DEBUG("marking {} backrefs used", backrefs.size());
+ for (auto &backref : backrefs) {
+ segment_cleaner->mark_space_used(
+ backref.paddr,
+ backref.len,
+ seastar::lowres_system_clock::time_point(),
+ seastar::lowres_system_clock::time_point(),
+ true);
+ }
+ auto &del_backrefs = cache->get_del_backrefs();
+ DEBUG("marking {} backrefs free", del_backrefs.size());
+ for (auto &del_backref : del_backrefs) {
+ segment_cleaner->mark_space_free(
+ del_backref.paddr,
+ del_backref.len,
+ true);
+ }
+ return seastar::now();
});
});
});
});
}).safe_then([this] {
+ cache->force_roll_backref_buffer();
return epm->open();
}).safe_then([FNAME, this] {
segment_cleaner->complete_init();
auto get_lba_manager() {
return lba_manager.get();
}
+
+ auto get_backref_manager() {
+ return backref_manager.get();
+ }
+
+ auto get_cache() {
+ return cache.get();
+ }
};
using TransactionManagerRef = std::unique_ptr<TransactionManager>;
with_trans_intr(
*t.t,
[this, &tracker](auto &t) {
- return lba_manager->scan_mapped_space(
+ return backref_manager->scan_mapped_space(
t,
[&tracker](auto offset, auto len, depth_t) {
+ logger().debug("check_usage: tracker alloc {}~{}",
+ offset, len);
tracker->allocate(
offset.as_seg_paddr().get_segment_id(),
offset.as_seg_paddr().get_segment_off(),
len);
+ }).si_then([&tracker, this] {
+ auto &backrefs = cache->get_backrefs();
+ for (auto &backref : backrefs) {
+ logger().debug("check_usage: by backref, tracker alloc {}~{}",
+ backref.paddr, backref.len);
+ tracker->allocate(
+ backref.paddr.as_seg_paddr().get_segment_id(),
+ backref.paddr.as_seg_paddr().get_segment_off(),
+ backref.len);
+ }
+ auto &del_backrefs = cache->get_del_backrefs();
+ for (auto &del_backref : del_backrefs) {
+ logger().debug("check_usage: by backref, tracker release {}~{}",
+ del_backref.paddr, del_backref.len);
+ tracker->release(
+ del_backref.paddr.as_seg_paddr().get_segment_id(),
+ del_backref.paddr.as_seg_paddr().get_segment_off(),
+ del_backref.len);
+ }
+ return seastar::now();
});
}).unsafe_get0();
return segment_cleaner->debug_check_space(*tracker);
protected:
TransactionManagerRef tm;
LBAManager *lba_manager;
+ BackrefManager *backref_manager;
+ Cache* cache;
SegmentCleaner *segment_cleaner;
TMTestState() : EphemeralTestState(1) {}
}
segment_cleaner = tm->get_segment_cleaner();
lba_manager = tm->get_lba_manager();
+ backref_manager = tm->get_backref_manager();
+ cache = tm->get_cache();
}
virtual void _destroy() override {