From: Radoslaw Zarzynski Date: Fri, 28 Nov 2025 12:49:07 +0000 (+0000) Subject: crimson/osd: replicated backend also uses attr_cache for xattrs handling X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=d71c7f654afa4e98ac14936c545e3e19b2bc6556;p=ceph-ci.git crimson/osd: replicated backend also uses attr_cache for xattrs handling Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 3a76a88ca31..082c12ca92b 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -490,6 +490,12 @@ auto OpsExecuter::do_write_op(Func&& f, OpsExecuter::modified_by m) { check_init_op_params(m); return std::forward(f)(pg->get_backend(), obc->obs, txn); } +template +auto OpsExecuter::do_write_op_attr_cache(Func&& f, OpsExecuter::modified_by m) { + ++num_write; + check_init_op_params(m); + return std::forward(f)(pg->get_backend(), obc->obs, txn, obc->attr_cache); +} OpsExecuter::call_errorator::future<> OpsExecuter::do_assert_ver( OSDOp& osd_op, const ObjectState& os) @@ -644,8 +650,8 @@ OpsExecuter::do_execute_op(OSDOp& osd_op) return backend.cmp_xattr(os, osd_op, delta_stats); }); case CEPH_OSD_OP_RMXATTR: - return do_write_op([&osd_op](auto& backend, auto& os, auto& txn) { - return backend.rm_xattr(os, osd_op, txn); + return do_write_op_attr_cache([&osd_op](auto& backend, auto& os, auto& txn, auto& attr_cache) { + return backend.rm_xattr(os, osd_op, txn, attr_cache); }); case CEPH_OSD_OP_CREATE: return do_write_op([this, &osd_op](auto& backend, auto& os, auto& txn) { @@ -690,8 +696,8 @@ OpsExecuter::do_execute_op(OSDOp& osd_op) return backend.set_allochint(os, osd_op, txn, delta_stats); }); case CEPH_OSD_OP_SETXATTR: - return do_write_op([this, &osd_op](auto& backend, auto& os, auto& txn) { - return backend.setxattr(os, osd_op, txn, delta_stats); + return do_write_op_attr_cache([this, &osd_op](auto& backend, auto& os, auto& txn, auto& attr_cache) { + return backend.setxattr(os, osd_op, txn, delta_stats, attr_cache); }); case CEPH_OSD_OP_DELETE: { diff --git a/src/crimson/osd/ops_executer.h b/src/crimson/osd/ops_executer.h index f78b29cef0e..3cb7f93a4d4 100644 --- a/src/crimson/osd/ops_executer.h +++ b/src/crimson/osd/ops_executer.h @@ -355,6 +355,8 @@ private: template auto do_write_op(Func&& f, modified_by m = modified_by::user); + template + auto do_write_op_attr_cache(Func&& f, modified_by m = modified_by::user); decltype(auto) dont_do_legacy_op() { return crimson::ct_error::operation_not_supported::make(); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 0e5d36648af..8071efc94ab 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -1101,7 +1101,8 @@ PGBackend::setxattr_ierrorator::future<> PGBackend::setxattr( ObjectState& os, const OSDOp& osd_op, ceph::os::Transaction& txn, - object_stat_sum_t& delta_stats) + object_stat_sum_t& delta_stats, + ObjectContext::attr_cache_t& attr_cache) { if (local_conf()->osd_max_attr_size > 0 && osd_op.op.xattr.value_len > local_conf()->osd_max_attr_size) { @@ -1125,6 +1126,7 @@ PGBackend::setxattr_ierrorator::future<> PGBackend::setxattr( } logger().debug("setxattr on obj={} for attr={}", os.oi.soid, name); txn.setattr(coll->get_cid(), ghobject_t{os.oi.soid}, name, val); + attr_cache[name] = val; delta_stats.num_wr++; return seastar::now(); } @@ -1149,7 +1151,7 @@ PGBackend::get_attr_ierrorator::future<> PGBackend::getxattr( cache_it->second); } logger().debug("getxattr on obj={} for attr={}", os.oi.soid, name); - return getxattr(os.oi.soid, std::move(name)); + return crimson::ct_error::enodata::make(); }; return get_attr_maybe_from_cache().safe_then_interruptible( [&delta_stats, &osd_op] (ceph::bufferlist&& val) { @@ -1168,12 +1170,12 @@ PGBackend::get_attr_ierrorator::future<> PGBackend::get_xattrs( object_stat_sum_t& delta_stats) const { auto get_attrs_maybe_from_cache = - [&] () { + [&] () -> get_attr_errorator::future { if (!std::empty(attr_cache)) { - return crimson::os::FuturizedStore::Shard::get_attrs_ertr::make_ready_future< + return get_attr_errorator::make_ready_future< crimson::os::FuturizedStore::Shard::attrs_t>(attr_cache); } - return store->get_attrs(coll, ghobject_t{os.oi.soid}); + return crimson::ct_error::enodata::make(); }; return get_attrs_maybe_from_cache().safe_then( [&delta_stats, &osd_op](auto&& attrs) { @@ -1304,7 +1306,8 @@ PGBackend::rm_xattr_iertr::future<> PGBackend::rm_xattr( ObjectState& os, const OSDOp& osd_op, - ceph::os::Transaction& txn) + ceph::os::Transaction& txn, + ObjectContext::attr_cache_t& attr_cache) { if (!os.exists || os.oi.is_whiteout()) { logger().debug("{}: {} DNE", __func__, os.oi.soid); @@ -1314,6 +1317,7 @@ PGBackend::rm_xattr( string attr_name{"_"}; bp.copy(osd_op.op.xattr.name_len, attr_name); txn.rmattr(coll->get_cid(), ghobject_t{os.oi.soid}, attr_name); + attr_cache.erase(attr_name); return rm_xattr_iertr::now(); } diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 880b429b24b..39226297b7c 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -271,7 +271,8 @@ public: ObjectState& os, const OSDOp& osd_op, ceph::os::Transaction& trans, - object_stat_sum_t& delta_stats); + object_stat_sum_t& delta_stats, + ObjectContext::attr_cache_t& attr_cache); using get_attr_errorator = crimson::os::FuturizedStore::Shard::get_attr_errorator; using get_attr_ierrorator = ::crimson::interruptible::interruptible_errorator< @@ -309,7 +310,8 @@ public: rm_xattr_iertr::future<> rm_xattr( ObjectState& os, const OSDOp& osd_op, - ceph::os::Transaction& trans); + ceph::os::Transaction& trans, + ObjectContext::attr_cache_t& attr_cache); interruptible_future stat( CollectionRef c, const ghobject_t& oid) const;