Transaction &t,
CachedExtentRef extent) = 0;
+ /**
+ * delayed_update_mapping
+ *
+ * update lba mapping for delayed allocated extents
+ */
+ using update_le_mapping_iertr = base_iertr;
+ using update_le_mapping_ret = base_iertr::future<>;
+ virtual update_le_mapping_ret update_mapping(
+ Transaction& t,
+ laddr_t laddr,
+ paddr_t prev_addr,
+ paddr_t paddr) = 0;
/**
* get_physical_extent_if_live
*
ERRORT("{} has been invalidated", t, *extent);
}
assert(!extent->has_been_invalidated());
+ assert(!extent->is_logical());
logger().debug(
"{}: rewriting {}",
__func__,
*extent);
- if (extent->is_logical()) {
- auto lextent = extent->cast<LogicalCachedExtent>();
- cache.retire_extent(t, extent);
- auto nlextent = cache.alloc_new_extent_by_type(
- t,
- lextent->get_type(),
- lextent->get_length())->cast<LogicalCachedExtent>();
- lextent->get_bptr().copy_out(
- 0,
- lextent->get_length(),
- nlextent->get_bptr().c_str());
- nlextent->set_laddr(lextent->get_laddr());
- nlextent->set_pin(lextent->get_pin().duplicate());
-
- logger().debug(
- "{}: rewriting {} into {}",
- __func__,
- *lextent,
- *nlextent);
-
- return update_mapping(
- t,
- lextent->get_laddr(),
- [prev_addr = lextent->get_paddr(), addr = nlextent->get_paddr()](
- const lba_map_val_t &in) {
- lba_map_val_t ret = in;
- ceph_assert(in.paddr == prev_addr);
- ret.paddr = addr;
- return ret;
- }).si_then(
- [nlextent](auto) {},
- rewrite_extent_iertr::pass_further{},
- /* ENOENT in particular should be impossible */
- crimson::ct_error::assert_all{
- "Invalid error in BtreeLBAManager::rewrite_extent after update_mapping"
- }
- );
- } else if (is_lba_node(*extent)) {
+ if (is_lba_node(*extent)) {
auto c = get_context(t);
return with_btree(
c,
}
}
+BtreeLBAManager::update_le_mapping_ret
+BtreeLBAManager::update_mapping(
+ Transaction& t,
+ laddr_t laddr,
+ paddr_t prev_addr,
+ paddr_t addr)
+{
+ return update_mapping(
+ t,
+ laddr,
+ [prev_addr, addr](
+ const lba_map_val_t &in) {
+ assert(!addr.is_null());
+ lba_map_val_t ret = in;
+ ceph_assert(in.paddr == prev_addr);
+ ret.paddr = addr;
+ return ret;
+ }).si_then(
+ [](auto) {},
+ update_le_mapping_iertr::pass_further{},
+ /* ENOENT in particular should be impossible */
+ crimson::ct_error::assert_all{
+ "Invalid error in BtreeLBAManager::rewrite_extent after update_mapping"
+ }
+ );
+}
+
BtreeLBAManager::get_physical_extent_if_live_ret
BtreeLBAManager::get_physical_extent_if_live(
Transaction &t,
Transaction &t,
CachedExtentRef extent) final;
+ update_le_mapping_ret update_mapping(
+ Transaction& t,
+ laddr_t laddr,
+ paddr_t prev_addr,
+ paddr_t paddr) final;
+
get_physical_extent_if_live_ret get_physical_extent_if_live(
Transaction &t,
extent_types_t type,
return cache->get_next_dirty_extents(t, seq, max_bytes);
}
+TransactionManager::rewrite_extent_ret
+TransactionManager::rewrite_logical_extent(
+ Transaction& t,
+ LogicalCachedExtentRef extent)
+{
+ LOG_PREFIX(TransactionManager::rewrite_logical_extent);
+ if (extent->has_been_invalidated()) {
+ ERRORT("{} has been invalidated", t, *extent);
+ }
+ assert(!extent->has_been_invalidated());
+ DEBUGT("rewriting {}", t, *extent);
+
+ auto lextent = extent->cast<LogicalCachedExtent>();
+ cache->retire_extent(t, extent);
+ auto nlextent = cache->alloc_new_extent_by_type(
+ t,
+ lextent->get_type(),
+ lextent->get_length())->cast<LogicalCachedExtent>();
+ lextent->get_bptr().copy_out(
+ 0,
+ lextent->get_length(),
+ nlextent->get_bptr().c_str());
+ nlextent->set_laddr(lextent->get_laddr());
+ nlextent->set_pin(lextent->get_pin().duplicate());
+
+ DEBUGT(
+ "rewriting {} into {}",
+ t,
+ *lextent,
+ *nlextent);
+
+ return lba_manager->update_mapping(
+ t,
+ lextent->get_laddr(),
+ lextent->get_paddr(),
+ nlextent->get_paddr());
+}
+
TransactionManager::rewrite_extent_ret TransactionManager::rewrite_extent(
Transaction &t,
CachedExtentRef extent)
cache->duplicate_for_write(t, extent);
return rewrite_extent_iertr::now();
}
- return lba_manager->rewrite_extent(t, extent);
+
+ if (extent->is_logical()) {
+ return rewrite_logical_extent(t, extent->cast<LogicalCachedExtent>());
+ } else {
+ return lba_manager->rewrite_extent(t, extent);
+ }
}
TransactionManager::get_extent_if_live_ret TransactionManager::get_extent_if_live(
seastar::metrics::metric_group metrics;
void register_metrics();
+ rewrite_extent_ret rewrite_logical_extent(
+ Transaction& t,
+ LogicalCachedExtentRef extent);
public:
// Testing interfaces
auto get_segment_cleaner() {