From: chunmei-liu Date: Fri, 4 Mar 2022 21:46:10 +0000 (-0800) Subject: crimson/seastore: add OP_RMATTR support X-Git-Tag: v18.0.0~1243^2~1 X-Git-Url: http://git.apps.os.sepia.ceph.com/?a=commitdiff_plain;h=51cf941053c551cd686dfedd4449b86e9944cbc8;p=ceph.git crimson/seastore: add OP_RMATTR support Signed-off-by: chunmei-liu --- diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 844a2e1ba059d..a1a9f278aae07 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -1094,6 +1094,24 @@ SeaStore::tm_ret SeaStore::_do_transaction_step( return _setattrs(ctx, get_onode(op->oid), std::move(to_set)); } break; + case Transaction::OP_SETATTRS: + { + std::map to_set; + i.decode_attrset(to_set); + return _setattrs(ctx, get_onode(op->oid), std::move(to_set)); + } + break; + case Transaction::OP_RMATTR: + { + std::string name = i.decode_string(); + return _rmattr(ctx, get_onode(op->oid), name); + } + break; + case Transaction::OP_RMATTRS: + { + return _rmattrs(ctx, get_onode(op->oid)); + } + break; case Transaction::OP_MKCOLL: { coll_t cid = i.get_cid(op->cid); @@ -1367,7 +1385,7 @@ SeaStore::tm_ret SeaStore::_setattrs( val.c_str(), val.length(), onode_layout_t::MAX_SS_LENGTH); - it = aset.erase(it); + aset.erase(it); } else { layout.ss_size = 0; } @@ -1385,6 +1403,100 @@ SeaStore::tm_ret SeaStore::_setattrs( std::move(aset)); } +SeaStore::tm_ret SeaStore::_rmattr( + internal_context_t &ctx, + OnodeRef &onode, + std::string name) +{ + LOG_PREFIX(SeaStore::_rmattr); + DEBUGT("onode={}", *ctx.transaction, *onode); + auto& layout = onode->get_mutable_layout(*ctx.transaction); + if ((name == OI_ATTR) && (layout.oi_size > 0)) { + memset(&layout.oi[0], 0, layout.oi_size); + layout.oi_size = 0; + return tm_iertr::now(); + } else if ((name == SS_ATTR) && (layout.ss_size > 0)) { + memset(&layout.ss[0], 0, layout.ss_size); + layout.ss_size = 0; + return tm_iertr::now(); + } else { + return _xattr_rmattr( + ctx, + onode, + std::move(name)); + } +} + +SeaStore::tm_ret SeaStore::_xattr_rmattr( + internal_context_t &ctx, + OnodeRef &onode, + std::string &&name) +{ + LOG_PREFIX(SeaStore::_xattr_rmattr); + DEBUGT("onode={}", *ctx.transaction, *onode); + auto xattr_root = onode->get_layout().xattr_root.get( + onode->get_metadata_hint(segment_manager->get_block_size())); + if (xattr_root.is_null()) { + return seastar::now(); + } else { + return seastar::do_with( + BtreeOMapManager(*transaction_manager), + onode->get_layout().xattr_root.get( + onode->get_metadata_hint(segment_manager->get_block_size())), + std::move(name), + [&ctx, &onode](auto &omap_manager, auto &xattr_root, auto &name) { + return omap_manager.omap_rm_key(xattr_root, *ctx.transaction, name) + .si_then([&] { + if (xattr_root.must_update()) { + onode->get_mutable_layout(*ctx.transaction + ).xattr_root.update(xattr_root); + } + }); + }); + } +} + +SeaStore::tm_ret SeaStore::_rmattrs( + internal_context_t &ctx, + OnodeRef &onode) +{ + LOG_PREFIX(SeaStore::_rmattrs); + DEBUGT("onode={}", *ctx.transaction, *onode); + auto& layout = onode->get_mutable_layout(*ctx.transaction); + memset(&layout.oi[0], 0, layout.oi_size); + layout.oi_size = 0; + memset(&layout.ss[0], 0, layout.ss_size); + layout.ss_size = 0; + return _xattr_clear(ctx, onode); +} + +SeaStore::tm_ret SeaStore::_xattr_clear( + internal_context_t &ctx, + OnodeRef &onode) +{ + LOG_PREFIX(SeaStore::_xattr_clear); + DEBUGT("onode={}", *ctx.transaction, *onode); + auto xattr_root = onode->get_layout().xattr_root.get( + onode->get_metadata_hint(segment_manager->get_block_size())); + if (xattr_root.is_null()) { + return seastar::now(); + } else { + return seastar::do_with( + BtreeOMapManager(*transaction_manager), + onode->get_layout().xattr_root.get( + onode->get_metadata_hint(segment_manager->get_block_size())), + [&ctx, &onode](auto &omap_manager, auto &xattr_root) { + return omap_manager.omap_clear(xattr_root, *ctx.transaction) + .si_then([&] { + if (xattr_root.must_update()) { + onode->get_mutable_layout(*ctx.transaction + ).xattr_root.update(xattr_root); + } + }); + }); + } +} + SeaStore::tm_ret SeaStore::_create_collection( internal_context_t &ctx, const coll_t& cid, int bits) diff --git a/src/crimson/os/seastore/seastore.h b/src/crimson/os/seastore/seastore.h index 29e78a6f2af07..571d0458aeb78 100644 --- a/src/crimson/os/seastore/seastore.h +++ b/src/crimson/os/seastore/seastore.h @@ -363,6 +363,20 @@ private: internal_context_t &ctx, OnodeRef &onode, std::map&& aset); + tm_ret _rmattr( + internal_context_t &ctx, + OnodeRef &onode, + std::string name); + tm_ret _rmattrs( + internal_context_t &ctx, + OnodeRef &onode); + tm_ret _xattr_rmattr( + internal_context_t &ctx, + OnodeRef &onode, + std::string &&name); + tm_ret _xattr_clear( + internal_context_t &ctx, + OnodeRef &onode); tm_ret _create_collection( internal_context_t &ctx, const coll_t& cid, int bits);