]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls/rgw: preserve olh entry's name on last unlink 36015/head
authorCasey Bodley <cbodley@redhat.com>
Fri, 10 Jul 2020 16:38:06 +0000 (12:38 -0400)
committerCasey Bodley <cbodley@redhat.com>
Fri, 10 Jul 2020 17:07:27 +0000 (13:07 -0400)
When rgw_bucket_unlink_instance removes the last instance of a name, it
also clears the value of rgw_bucket_olh_entry.key. However, bucket index
resharding uses this key when choosing its shard placement, so an empty
key causes all of these olh entries to be misplaced in shard 0. After
reshard, all of the olh recovery/cleanup logic would be sent to the
correct shard, and these misplaced olh entries would never be cleaned
up.

Preserving the key's name on last unlink allows the olh entry to be
resharded correctly and cleaned up normally.

Fixes: https://tracker.ceph.com/issues/46456
Signed-off-by: Casey Bodley <cbodley@redhat.com>
src/cls/rgw/cls_rgw.cc

index b05849763e31dbd496bb1dec8d9e5037e2c8ea7d..cd61adf73fce8cbdc5aa81eddd2b22e40de9cb93 100644 (file)
@@ -1807,7 +1807,9 @@ static int rgw_bucket_unlink_instance(cls_method_context_t hctx, bufferlist *in,
       olh.update(next_key, next.is_delete_marker());
       olh.update_log(CLS_RGW_OLH_OP_LINK_OLH, op.op_tag, next_key, next.is_delete_marker());
     } else {
-      /* next_key is empty */
+      // next_key is empty, but we need to preserve its name in case this entry
+      // gets resharded, because this key is used for hash placement
+      next_key.name = dest_key.name;
       olh.update(next_key, false);
       olh.update_log(CLS_RGW_OLH_OP_UNLINK_OLH, op.op_tag, next_key, false);
       olh.set_exists(false);