]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: replicated backend also uses attr_cache for xattrs handling
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 28 Nov 2025 12:49:07 +0000 (12:49 +0000)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Jan 2026 19:43:00 +0000 (19:43 +0000)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/ops_executer.h
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 3a76a88ca319c00ae25b4d3d4ce071033ebf969b..082c12ca92b7810d9698cfa9df4f0d19810105ff 100644 (file)
@@ -490,6 +490,12 @@ auto OpsExecuter::do_write_op(Func&& f, OpsExecuter::modified_by m) {
   check_init_op_params(m);
   return std::forward<Func>(f)(pg->get_backend(), obc->obs, txn);
 }
+template <class Func>
+auto OpsExecuter::do_write_op_attr_cache(Func&& f, OpsExecuter::modified_by m) {
+  ++num_write;
+  check_init_op_params(m);
+  return std::forward<Func>(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:
   {
index f78b29cef0e1cc54a0a7b674bc15ceca9963d5fc..3cb7f93a4d4d4305d92dfa86fd6df8fbbf3be4dc 100644 (file)
@@ -355,6 +355,8 @@ private:
 
   template <class Func>
   auto do_write_op(Func&& f, modified_by m = modified_by::user);
+  template <class Func>
+  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();
index 0e5d36648afade50aa0e1aae047dcd709d63772f..8071efc94ab4917838c12fb02b351191d78b240c 100644 (file)
@@ -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<crimson::os::FuturizedStore::Shard::attrs_t> {
     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();
 }
 
index 880b429b24b6cd0925d90ae672fc9c87f13bbbcc..39226297b7c754fdc48fc9b56e827301e7f704f9 100644 (file)
@@ -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<struct stat> stat(
     CollectionRef c,
     const ghobject_t& oid) const;