]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix `radosgw-admin object unlink ...` 66123/head
authorJ. Eric Ivancich <ivancich@redhat.com>
Tue, 4 Nov 2025 21:55:38 +0000 (16:55 -0500)
committerJ. Eric Ivancich <ivancich@redhat.com>
Wed, 5 Nov 2025 13:36:49 +0000 (08:36 -0500)
The unlink subcommand did not handle unsharded bucket indices
appropriately. These are when the number of shards listed in the
bucket instance object is 0. In that case there will actually be 1
shard.

When number of shards as 0 is passed into the function that maps
object names to shards, it returns -1. And that was not handled
properly. That is now fixed.

Signed-off-by: J. Eric Ivancich <ivancich@redhat.com>
src/rgw/driver/rados/rgw_rados.cc

index b43113ccc58aa61fdd0a27e9594f78a204ea11d9..7cd7b41e68aaa375519357cd2cbfbc05e8ec1d2a 100644 (file)
@@ -11206,8 +11206,11 @@ int RGWRados::remove_objs_from_index(const DoutPrefixProvider *dpp,
   std::map<int, std::set<std::string>> sharded_removals;
   for (const auto& entry_key : entry_key_list) {
     const rgw_obj_key obj_key(entry_key);
-    const uint32_t shard =
-      RGWSI_BucketIndex_RADOS::bucket_shard_index(obj_key, num_shards);
+    const uint32_t shard = [&obj_key, num_shards]() -> uint32_t {
+      int32_t temp = RGWSI_BucketIndex_RADOS::bucket_shard_index(obj_key, num_shards);
+      return (-1 == temp) ? 0 : (uint32_t) temp;
+    }();
+
 
     // entry_key already combines namespace and name, so we first have
     // to break that apart before we can then combine with instance