Skip to content

Commit 4f8e6cf

Browse files
authored
Merge pull request ceph#55947 from xxhdx1985126/wip-seastore-coll-move-rename
crimson/os/seastore: handle OP_COLL_MOVE_RENAME Reviewed-by: Yingxin Cheng <[email protected]>
2 parents 6185d08 + 2520927 commit 4f8e6cf

File tree

3 files changed

+88
-1
lines changed

3 files changed

+88
-1
lines changed

src/crimson/os/seastore/seastore.cc

Lines changed: 52 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1347,7 +1347,9 @@ SeaStore::Shard::_do_transaction_step(
13471347
o = get_onode;
13481348
d_onodes[op->oid] = get_onode;
13491349
}
1350-
if (op->op == Transaction::OP_CLONE && !d_onodes[op->dest_oid]) {
1350+
if ((op->op == Transaction::OP_CLONE
1351+
|| op->op == Transaction::OP_COLL_MOVE_RENAME)
1352+
&& !d_onodes[op->dest_oid]) {
13511353
//TODO: use when_all_succeed after making onode tree
13521354
// support parallel extents loading
13531355
return onode_manager->get_or_create_onode(
@@ -1471,6 +1473,20 @@ SeaStore::Shard::_do_transaction_step(
14711473
i.get_oid(op->dest_oid));
14721474
return _clone(ctx, onodes[op->oid], d_onodes[op->dest_oid]);
14731475
}
1476+
case Transaction::OP_COLL_MOVE_RENAME:
1477+
{
1478+
ceph_assert(op->cid == op->dest_cid);
1479+
TRACET("renaming {} to {}",
1480+
*ctx.transaction,
1481+
i.get_oid(op->oid),
1482+
i.get_oid(op->dest_oid));
1483+
return _rename(
1484+
ctx, onodes[op->oid], d_onodes[op->dest_oid]
1485+
).si_then([&onodes, &d_onodes, op] {
1486+
onodes[op->oid].reset();
1487+
d_onodes[op->oid].reset();
1488+
});
1489+
}
14741490
default:
14751491
ERROR("bad op {}", static_cast<unsigned>(op->op));
14761492
return crimson::ct_error::input_output_error::make();
@@ -1504,6 +1520,41 @@ SeaStore::Shard::_do_transaction_step(
15041520
);
15051521
}
15061522

1523+
SeaStore::Shard::tm_ret
1524+
SeaStore::Shard::_rename(
1525+
internal_context_t &ctx,
1526+
OnodeRef &onode,
1527+
OnodeRef &d_onode)
1528+
{
1529+
auto olayout = onode->get_layout();
1530+
uint32_t size = olayout.size;
1531+
auto omap_root = olayout.omap_root.get(
1532+
d_onode->get_metadata_hint(device->get_block_size()));
1533+
auto xattr_root = olayout.xattr_root.get(
1534+
d_onode->get_metadata_hint(device->get_block_size()));
1535+
auto object_data = olayout.object_data.get();
1536+
auto oi_bl = ceph::bufferlist::static_from_mem(
1537+
&olayout.oi[0],
1538+
(uint32_t)olayout.oi_size);
1539+
auto ss_bl = ceph::bufferlist::static_from_mem(
1540+
&olayout.ss[0],
1541+
(uint32_t)olayout.ss_size);
1542+
1543+
d_onode->update_onode_size(*ctx.transaction, size);
1544+
d_onode->update_omap_root(*ctx.transaction, omap_root);
1545+
d_onode->update_xattr_root(*ctx.transaction, xattr_root);
1546+
d_onode->update_object_data(*ctx.transaction, object_data);
1547+
d_onode->update_object_info(*ctx.transaction, oi_bl);
1548+
d_onode->update_snapset(*ctx.transaction, ss_bl);
1549+
return onode_manager->erase_onode(
1550+
*ctx.transaction, onode
1551+
).handle_error_interruptible(
1552+
crimson::ct_error::input_output_error::pass_further(),
1553+
crimson::ct_error::assert_all{
1554+
"Invalid error in SeaStore::_rename"}
1555+
);
1556+
}
1557+
15071558
SeaStore::Shard::tm_ret
15081559
SeaStore::Shard::_remove_omaps(
15091560
internal_context_t &ctx,

src/crimson/os/seastore/seastore.h

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -377,6 +377,10 @@ class SeaStore final : public FuturizedStore {
377377
internal_context_t &ctx,
378378
OnodeRef &onode,
379379
OnodeRef &d_onode);
380+
tm_ret _rename(
381+
internal_context_t &ctx,
382+
OnodeRef &onode,
383+
OnodeRef &d_onode);
380384
tm_ret _zero(
381385
internal_context_t &ctx,
382386
OnodeRef &onode,

src/test/crimson/seastore/test_seastore.cc

Lines changed: 32 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -262,6 +262,19 @@ struct seastore_test_t :
262262
return clone_obj;
263263
}
264264

265+
void rename(
266+
SeaStoreShard &sharded_seastore,
267+
object_state_t &other) {
268+
CTransaction t;
269+
t.collection_move_rename(cid, oid, cid, other.oid);
270+
sharded_seastore.do_transaction(
271+
coll,
272+
std::move(t)).get0();
273+
other.contents = contents;
274+
other.omap = omap;
275+
other.clone_contents = clone_contents;
276+
}
277+
265278
void write(
266279
SeaStoreShard &sharded_seastore,
267280
uint64_t offset,
@@ -787,6 +800,25 @@ TEST_P(seastore_test_t, omap_test_simple)
787800
});
788801
}
789802

803+
TEST_P(seastore_test_t, rename)
804+
{
805+
run_async([this] {
806+
auto &test_obj = get_object(make_oid(0));
807+
test_obj.write(*sharded_seastore, 0, 4096, 'a');
808+
test_obj.set_omap(
809+
*sharded_seastore,
810+
"asdf",
811+
make_bufferlist(128));
812+
auto test_other = object_state_t{
813+
test_obj.cid,
814+
test_obj.coll,
815+
ghobject_t(hobject_t(sobject_t(std::string("object_1"), CEPH_NOSNAP)))};
816+
test_obj.rename(*sharded_seastore, test_other);
817+
test_other.read(*sharded_seastore, 0, 4096);
818+
test_other.check_omap(*sharded_seastore);
819+
});
820+
}
821+
790822
TEST_P(seastore_test_t, clone_aligned_extents)
791823
{
792824
run_async([this] {

0 commit comments

Comments
 (0)