Skip to content

Commit eff9755

Browse files
committed
crimson/os/seastore: copy attrs and omaps when cloning objects
At present, we just copy attrs and omaps one by one, which is not efficient but very important in terms of functionality especially for the teuthology tests Signed-off-by: Xuehan Xu <[email protected]>
1 parent 5dbd3bf commit eff9755

File tree

2 files changed

+77
-2
lines changed

2 files changed

+77
-2
lines changed

src/crimson/os/seastore/seastore.cc

Lines changed: 67 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -1584,6 +1584,69 @@ SeaStore::Shard::_write(
15841584
});
15851585
}
15861586

1587+
SeaStore::Shard::tm_ret
1588+
SeaStore::Shard::_clone_omaps(
1589+
internal_context_t &ctx,
1590+
OnodeRef &onode,
1591+
OnodeRef &d_onode,
1592+
const omap_type_t otype)
1593+
{
1594+
return trans_intr::repeat([&ctx, onode, d_onode, this, otype] {
1595+
return seastar::do_with(
1596+
std::optional<std::string>(std::nullopt),
1597+
[&ctx, onode, d_onode, this, otype](auto &start) {
1598+
auto& layout = onode->get_layout();
1599+
return omap_list(
1600+
*onode,
1601+
otype == omap_type_t::XATTR
1602+
? layout.xattr_root
1603+
: layout.omap_root,
1604+
*ctx.transaction,
1605+
start,
1606+
OMapManager::omap_list_config_t().with_inclusive(false, false)
1607+
).si_then([&ctx, onode, d_onode, this, otype, &start](auto p) mutable {
1608+
auto complete = std::get<0>(p);
1609+
auto &attrs = std::get<1>(p);
1610+
if (attrs.empty()) {
1611+
assert(complete);
1612+
return tm_iertr::make_ready_future<
1613+
seastar::stop_iteration>(
1614+
seastar::stop_iteration::yes);
1615+
}
1616+
std::string nstart = attrs.rbegin()->first;
1617+
return _omap_set_kvs(
1618+
d_onode,
1619+
otype == omap_type_t::XATTR
1620+
? d_onode->get_layout().xattr_root
1621+
: d_onode->get_layout().omap_root,
1622+
*ctx.transaction,
1623+
std::map<std::string, ceph::bufferlist>(attrs.begin(), attrs.end())
1624+
).si_then([complete, nstart=std::move(nstart),
1625+
&start, &ctx, d_onode, otype](auto root) mutable {
1626+
if (root.must_update()) {
1627+
if (otype == omap_type_t::XATTR) {
1628+
d_onode->update_xattr_root(*ctx.transaction, root);
1629+
} else {
1630+
assert(otype == omap_type_t::OMAP);
1631+
d_onode->update_omap_root(*ctx.transaction, root);
1632+
}
1633+
}
1634+
if (complete) {
1635+
return seastar::make_ready_future<
1636+
seastar::stop_iteration>(
1637+
seastar::stop_iteration::yes);
1638+
} else {
1639+
start = std::move(nstart);
1640+
return seastar::make_ready_future<
1641+
seastar::stop_iteration>(
1642+
seastar::stop_iteration::no);
1643+
}
1644+
});
1645+
});
1646+
});
1647+
});
1648+
}
1649+
15871650
SeaStore::Shard::tm_ret
15881651
SeaStore::Shard::_clone(
15891652
internal_context_t &ctx,
@@ -1595,8 +1658,6 @@ SeaStore::Shard::_clone(
15951658
return seastar::do_with(
15961659
ObjectDataHandler(max_object_size),
15971660
[this, &ctx, &onode, &d_onode](auto &objHandler) {
1598-
//TODO: currently, we only care about object data, leaving cloning
1599-
// of xattr/omap for future work
16001661
auto &object_size = onode->get_layout().size;
16011662
d_onode->update_onode_size(*ctx.transaction, object_size);
16021663
return objHandler.clone(
@@ -1605,6 +1666,10 @@ SeaStore::Shard::_clone(
16051666
*ctx.transaction,
16061667
*onode,
16071668
d_onode.get()});
1669+
}).si_then([&ctx, &onode, &d_onode, this] {
1670+
return _clone_omaps(ctx, onode, d_onode, omap_type_t::XATTR);
1671+
}).si_then([&ctx, &onode, &d_onode, this] {
1672+
return _clone_omaps(ctx, onode, d_onode, omap_type_t::OMAP);
16081673
});
16091674
}
16101675

src/crimson/os/seastore/seastore.h

Lines changed: 10 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -359,6 +359,16 @@ class SeaStore final : public FuturizedStore {
359359
uint64_t offset, size_t len,
360360
ceph::bufferlist &&bl,
361361
uint32_t fadvise_flags);
362+
enum class omap_type_t : uint8_t {
363+
XATTR = 0,
364+
OMAP,
365+
NUM_TYPES
366+
};
367+
tm_ret _clone_omaps(
368+
internal_context_t &ctx,
369+
OnodeRef &onode,
370+
OnodeRef &d_onode,
371+
const omap_type_t otype);
362372
tm_ret _clone(
363373
internal_context_t &ctx,
364374
OnodeRef &onode,

0 commit comments

Comments
 (0)