assert(!is_indirect());
return val->refcount;
}
- std::unique_ptr<LBACursor> duplicate() const {
- return std::make_unique<LBACursor>(*this);
- }
using base_ertr = crimson::errorator<
crimson::ct_error::input_output_error>;
).si_then([cursor=std::move(cursor)](auto mapping) mutable {
return clone_mapping_ret_t{
LBAMapping(mapping.direct_cursor, std::move(cursor)),
- mapping.duplicate()};
+ mapping};
});
});
});
return cursor->refresh(
).si_then([&ret, &mapping] {
for (auto &m : ret) {
- m.direct_cursor = mapping.direct_cursor->duplicate();
+ m.direct_cursor = mapping.direct_cursor;
}
});
}
get_child_ret_t<lba::LBALeafNode, LogicalChildNode>
get_logical_extent(Transaction &t) const;
- LBAMapping duplicate() const {
- assert(!is_null());
- auto dup_iter = [](const LBACursorRef &iter) -> LBACursorRef {
- if (iter) {
- return iter->duplicate();
- } else {
- return nullptr;
- }
- };
- return LBAMapping(dup_iter(direct_cursor), dup_iter(indirect_cursor));
- }
-
using refresh_iertr = LBACursor::base_iertr;
refresh_iertr::future<LBAMapping> refresh();
d_object_data.get_reserved_data_base(),
d_object_data.get_reserved_data_len());
return ctx.tm.remove(ctx.t, std::move(*mapping));
- }).si_then([mapping=mapping.duplicate(),
- &d_object_data, ctx](auto pos) mutable {
+ }).si_then([mapping, &d_object_data, ctx](auto pos) mutable {
auto base = d_object_data.get_reserved_data_base();
auto len = d_object_data.get_reserved_data_len();
return ctx.tm.clone_range(
auto v = pin.get_logical_extent(t);
if (v.has_child()) {
return v.get_child_fut(
- ).si_then([pin=pin.duplicate()](auto extent) {
+ ).si_then([pin](auto extent) {
#ifndef NDEBUG
auto lextent = extent->template cast<LogicalChildNode>();
auto pin_laddr = pin.get_intermediate_base();
return ext;
});
} else {
- return pin_to_extent_by_type(t, pin.duplicate(), v.get_child_pos(), type);
+ return pin_to_extent_by_type(t, pin, v.get_child_pos(), type);
}
}
original_len](auto newpin) {
pin = std::move(newpin);
if (full_extent_integrity_check) {
- return read_pin<T>(t, pin.duplicate()
+ return read_pin<T>(t, pin
).si_then([](auto maybe_indirect_extent) {
assert(!maybe_indirect_extent.is_indirect());
assert(!maybe_indirect_extent.is_clone);
return maybe_indirect_extent.extent;
});
} else {
- auto ret = get_extent_if_linked<T>(t, pin.duplicate());
+ auto ret = get_extent_if_linked<T>(t, pin);
if (ret.index() == 1) {
return std::get<1>(ret
).si_then([](auto extent) {
maybe_init(extent);
extent.set_seen_by_users();
}
- ).si_then([FNAME, &t, pin=pin.duplicate(), this](auto ref) mutable -> ret {
+ ).si_then([FNAME, &t, pin=pin, this](auto ref) mutable -> ret {
if (ref->is_fully_loaded()) {
auto crc = ref->calc_crc32c();
SUBTRACET(
// No change to extent::seen_by_user because this path is only
// for background cleaning.
}
- ).si_then([FNAME, &t, pin=pin.duplicate(), this](auto ref) {
+ ).si_then([FNAME, &t, pin=pin, this](auto ref) {
auto crc = ref->calc_crc32c();
SUBTRACET(
seastore_tm,
auto addr = pin.get_key();
auto im_addr = pin.get_intermediate_base();
auto ext = with_trans_intr(*(t.t), [&](auto& trans) {
- return tm->read_pin<TestBlock>(trans, pin.duplicate());
+ return tm->read_pin<TestBlock>(trans, pin);
}).safe_then([](auto ret) {
return ertr::make_ready_future<TestBlockRef>(ret.extent);
}).handle_error(
EXPECT_EQ(pin->get_length(), new_len);
EXPECT_EQ(pin->get_key(), o_laddr + new_offset);
- auto extent = try_read_pin(t, pin->duplicate());
+ auto extent = try_read_pin(t, *pin);
if (extent) {
if (!pin->is_indirect()) {
test_mappings.alloced(pin->get_key(), *extent, t.mapping_delta);
EXPECT_EQ(lpin->get_key(), o_laddr);
EXPECT_EQ(lpin->get_val(), o_paddr);
EXPECT_EQ(lpin->get_length(), new_offset);
- auto lext = try_read_pin(t, lpin->duplicate());
+ auto lext = try_read_pin(t, *lpin);
if (lext) {
test_mappings.alloced(lpin->get_key(), *lext, t.mapping_delta);
EXPECT_TRUE(lext->is_exist_clean());
EXPECT_EQ(rpin->get_val(), o_paddr.add_offset(new_offset)
.add_offset(new_len));
EXPECT_EQ(rpin->get_length(), o_len - new_offset - new_len);
- auto rext = try_read_pin(t, rpin->duplicate());
+ auto rext = try_read_pin(t, *rpin);
if (rext) {
test_mappings.alloced(rpin->get_key(), *rext, t.mapping_delta);
EXPECT_TRUE(rext->is_exist_clean());
}
auto empty_transaction = true;
- auto last_rpin = pin0->duplicate();
+ auto last_rpin = *pin0;
ASSERT_TRUE(!split_points.empty());
while(!split_points.empty()) {
// new overwrite area: start_off ~ end_off
bufferlist bl;
bl.append(ceph::bufferptr(ceph::buffer::create(new_len, 0)));
auto [lpin, ext, rpin] = overwrite_pin(
- t, last_rpin.duplicate(), new_off, new_len, bl);
+ t, std::move(last_rpin), new_off, new_len, bl);
if (!ext) {
conflicted++;
return;
assert(pin.is_viewable());
std::ignore = alloc_extent(t, get_laddr_hint((LEAF_NODE_CAPACITY + 1) * 4096), 4096, 'a');
assert(!pin.is_viewable());
- pin = refresh_lba_mapping(t, pin.duplicate());
+ pin = refresh_lba_mapping(t, pin);
auto extent2 = with_trans_intr(*(t.t), [&pin](auto& trans) {
auto v = pin.get_logical_extent(trans);
assert(v.has_child());