From: Xuehan Xu Date: Tue, 5 Mar 2024 07:58:05 +0000 (+0800) Subject: crimson/os/seastore: handle OP_COLL_MOVE_RENAME X-Git-Tag: testing/wip-batrick-testing-20240411.154038~243^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=70245c5b207eca6349920d1877ea237ec687f93d;p=ceph-ci.git crimson/os/seastore: handle OP_COLL_MOVE_RENAME Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 961fd04bd43..e29fd4c0ea6 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -1347,7 +1347,9 @@ SeaStore::Shard::_do_transaction_step( o = get_onode; d_onodes[op->oid] = get_onode; } - if (op->op == Transaction::OP_CLONE && !d_onodes[op->dest_oid]) { + if ((op->op == Transaction::OP_CLONE + || op->op == Transaction::OP_COLL_MOVE_RENAME) + && !d_onodes[op->dest_oid]) { //TODO: use when_all_succeed after making onode tree // support parallel extents loading return onode_manager->get_or_create_onode( @@ -1471,6 +1473,20 @@ SeaStore::Shard::_do_transaction_step( i.get_oid(op->dest_oid)); return _clone(ctx, onodes[op->oid], d_onodes[op->dest_oid]); } + case Transaction::OP_COLL_MOVE_RENAME: + { + ceph_assert(op->cid == op->dest_cid); + TRACET("renaming {} to {}", + *ctx.transaction, + i.get_oid(op->oid), + i.get_oid(op->dest_oid)); + return _rename( + ctx, onodes[op->oid], d_onodes[op->dest_oid] + ).si_then([&onodes, &d_onodes, op] { + onodes[op->oid].reset(); + d_onodes[op->oid].reset(); + }); + } default: ERROR("bad op {}", static_cast(op->op)); return crimson::ct_error::input_output_error::make(); @@ -1504,6 +1520,41 @@ SeaStore::Shard::_do_transaction_step( ); } +SeaStore::Shard::tm_ret +SeaStore::Shard::_rename( + internal_context_t &ctx, + OnodeRef &onode, + OnodeRef &d_onode) +{ + auto olayout = onode->get_layout(); + uint32_t size = olayout.size; + auto omap_root = olayout.omap_root.get( + d_onode->get_metadata_hint(device->get_block_size())); + auto xattr_root = olayout.xattr_root.get( + d_onode->get_metadata_hint(device->get_block_size())); + auto object_data = olayout.object_data.get(); + auto oi_bl = ceph::bufferlist::static_from_mem( + &olayout.oi[0], + (uint32_t)olayout.oi_size); + auto ss_bl = ceph::bufferlist::static_from_mem( + &olayout.ss[0], + (uint32_t)olayout.ss_size); + + d_onode->update_onode_size(*ctx.transaction, size); + d_onode->update_omap_root(*ctx.transaction, omap_root); + d_onode->update_xattr_root(*ctx.transaction, xattr_root); + d_onode->update_object_data(*ctx.transaction, object_data); + d_onode->update_object_info(*ctx.transaction, oi_bl); + d_onode->update_snapset(*ctx.transaction, ss_bl); + return onode_manager->erase_onode( + *ctx.transaction, onode + ).handle_error_interruptible( + crimson::ct_error::input_output_error::pass_further(), + crimson::ct_error::assert_all{ + "Invalid error in SeaStore::_rename"} + ); +} + SeaStore::Shard::tm_ret SeaStore::Shard::_remove_omaps( internal_context_t &ctx, diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index fe1aa143e1c..585ce735dd2 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -377,6 +377,10 @@ public: internal_context_t &ctx, OnodeRef &onode, OnodeRef &d_onode); + tm_ret _rename( + internal_context_t &ctx, + OnodeRef &onode, + OnodeRef &d_onode); tm_ret _zero( internal_context_t &ctx, OnodeRef &onode,