From: Xuehan Xu Date: Fri, 16 Dec 2022 13:36:26 +0000 (+0800) Subject: crimson/os/seastore: remove oi/ss from omap when setting oi/ss in onodes' layouts X-Git-Tag: v18.1.0~388^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=dfa97f46e50a28ece0388a9f1cd60574aae6b6ee;p=ceph.git crimson/os/seastore: remove oi/ss from omap when setting oi/ss in onodes' layouts Signed-off-by: Xuehan Xu --- diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index 3b977643890..c585ee4c4bc 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -1545,16 +1545,24 @@ SeaStore::tm_ret SeaStore::_setattrs( { LOG_PREFIX(SeaStore::_setattrs); DEBUGT("onode={}", *ctx.transaction, *onode); + + auto fut = tm_iertr::now(); auto& layout = onode->get_mutable_layout(*ctx.transaction); if (auto it = aset.find(OI_ATTR); it != aset.end()) { auto& val = it->second; if (likely(val.length() <= onode_layout_t::MAX_OI_LENGTH)) { - layout.oi_size = val.length(); maybe_inline_memcpy( &layout.oi[0], val.c_str(), val.length(), onode_layout_t::MAX_OI_LENGTH); + + if (!layout.oi_size) { + // if oi was not in the layout, it probably exists in the omap, + // need to remove it first + fut = _xattr_rmattr(ctx, onode, OI_ATTR); + } + layout.oi_size = val.length(); aset.erase(it); } else { layout.oi_size = 0; @@ -1564,12 +1572,17 @@ SeaStore::tm_ret SeaStore::_setattrs( if (auto it = aset.find(SS_ATTR); it != aset.end()) { auto& val = it->second; if (likely(val.length() <= onode_layout_t::MAX_SS_LENGTH)) { - layout.ss_size = val.length(); maybe_inline_memcpy( &layout.ss[0], val.c_str(), val.length(), onode_layout_t::MAX_SS_LENGTH); + + if (!layout.ss_size) { + fut = _xattr_rmattr(ctx, onode, SS_ATTR); + } + layout.ss_size = val.length(); + aset.erase(it); } else { layout.ss_size = 0; @@ -1577,15 +1590,19 @@ SeaStore::tm_ret SeaStore::_setattrs( } if (aset.empty()) { - return tm_iertr::now(); + return fut; } - return _omap_set_kvs( - onode, - onode->get_layout().xattr_root, - *ctx.transaction, - layout.xattr_root, - std::move(aset)); + return fut.si_then( + [this, onode, &ctx, &layout, + aset=std::move(aset)]() mutable { + return _omap_set_kvs( + onode, + onode->get_layout().xattr_root, + *ctx.transaction, + layout.xattr_root, + std::move(aset)); + }); } SeaStore::tm_ret SeaStore::_rmattr(