]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: update the hash source for multipart entries during resharding 32617/head
authortaodd <dongdong.tao@canonical.com>
Mon, 13 Jan 2020 14:18:45 +0000 (22:18 +0800)
committertaodd <dongdong.tao@canonical.com>
Tue, 14 Jan 2020 05:55:54 +0000 (13:55 +0800)
Fixes: https://tracker.ceph.com/issues/43583
Signed-off-by: dongdong tao <dongdong.tao@canonical.com>
src/rgw/rgw_reshard.cc

index 589641487def927996becc688e5bfa64d45c7501..1f49b45ed487b9aebc1de9579e199e732daee3f3 100644 (file)
@@ -18,6 +18,7 @@
 
 #include "services/svc_zone.h"
 #include "services/svc_sys_obj.h"
+#include "services/svc_tier_rados.h"
 
 #define dout_context g_ceph_context
 #define dout_subsys ceph_subsys_rgw
@@ -603,6 +604,11 @@ int RGWBucketReshard::do_reshard(int num_shards,
        bool account = entry.get_info(&cls_key, &category, &stats);
        rgw_obj_key key(cls_key);
        rgw_obj obj(new_bucket_info.bucket, key);
+       RGWMPObj mp;
+       if (key.ns == RGW_OBJ_NS_MULTIPART && mp.from_meta(key.name)) {
+         // place the multipart .meta object on the same shard as its head object
+         obj.index_hash_source = mp.get_key();
+       }
        int ret = store->getRados()->get_target_shard_id(new_bucket_info, obj.get_hash_object(), &target_shard_id);
        if (ret < 0) {
          lderr(store->ctx()) << "ERROR: get_target_shard_id() returned ret=" << ret << dendl;