]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: fix cmp_xattr handling for RGW delete
authorKautilya Tripathi <kautilya.tripathi@ibm.com>
Tue, 17 Feb 2026 10:58:31 +0000 (16:28 +0530)
committerKautilya Tripathi <kautilya.tripathi@ibm.com>
Mon, 23 Feb 2026 04:57:00 +0000 (10:27 +0530)
Match classic ENODATA behavior by only treating missing xattr as empty
for EQ+STRING with an empty expected value, so RGW null-version
deletes succeed.

Signed-off-by: Kautilya Tripathi <kautilya.tripathi@ibm.com>
src/crimson/osd/pg_backend.cc

index fb209d21bde781dc9dec6aa8a8ecf876239271e2..37cdf551591affd68cbd3c4db8ee9aaccb5c7ca8 100644 (file)
@@ -1269,6 +1269,20 @@ PGBackend::cmp_xattr_ierrorator::future<> PGBackend::cmp_xattr(
       ->cmp_xattr_errorator::future<> {
       delta_stats.num_rd++;
       delta_stats.num_rd_kb += shift_round_up(osd_op.op.xattr.value_len, 10);
+
+      if (osd_op.op.xattr.cmp_op == CEPH_OSD_CMPXATTR_OP_EQ) {
+        auto bp = osd_op.indata.cbegin();
+        bp += osd_op.op.xattr.name_len;
+        if (osd_op.op.xattr.cmp_mode == CEPH_OSD_CMPXATTR_MODE_STRING) {
+          string lhs;
+          bp.copy(osd_op.op.xattr.value_len, lhs);
+          if (lhs.empty()) {
+            osd_op.rval = 1;
+            return cmp_xattr_errorator::now();
+          }
+        }
+      }
+      logger().debug("cmpxattr: xattr does not exist, comparison failed");
       return crimson::ct_error::ecanceled::make();
     }),
     cmp_xattr_errorator::pass_further{}