]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: RunBucketSourceSync uses num_shards from remote bilog info
authorAdam C. Emerson <aemerson@redhat.com>
Fri, 10 Sep 2021 16:06:53 +0000 (12:06 -0400)
committerAdam C. Emerson <aemerson@redhat.com>
Tue, 1 Feb 2022 22:26:03 +0000 (17:26 -0500)
Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
src/rgw/rgw_data_sync.cc

index a904d0ea1c1f336c20095b80b40e7dddd9506f19..d40ac4dffcae3e2697d7adf04527eef224492379 100644 (file)
@@ -841,8 +841,8 @@ class RGWReadRemoteBucketIndexLogInfoCR : public RGWCoroutine {
 
 public:
   RGWReadRemoteBucketIndexLogInfoCR(RGWDataSyncCtx *_sc,
-                                  const rgw_bucket& bucket,
-                                  rgw_bucket_index_marker_info *_info)
+                                   const rgw_bucket& bucket,
+                                   rgw_bucket_index_marker_info *_info)
     : RGWCoroutine(_sc->cct), sc(_sc), sync_env(_sc->env),
       instance_key(bucket.get_key()), info(_info) {}
 
@@ -1278,6 +1278,8 @@ class RGWRunBucketSourcesSyncCR : public RGWCoroutine {
   int cur_shard{0};
   bool again = false;
   std::optional<uint64_t> gen;
+  rgw_bucket_index_marker_info marker_info;
+  BucketIndexShardsManager marker_mgr;
 
 public:
   RGWRunBucketSourcesSyncCR(RGWDataSyncCtx *_sc,
@@ -4773,8 +4775,21 @@ int RGWRunBucketSourcesSyncCR::operate(const DoutPrefixProvider *dpp)
     for (siter = pipes.begin(); siter != pipes.end(); ++siter) {
       {
         ldpp_dout(dpp, 20) << __func__ << "(): sync pipe=" << *siter << dendl;
+       yield call(new RGWReadRemoteBucketIndexLogInfoCR(
+                    sc, siter->source.get_bucket_info().bucket, &marker_info));
+       if (retcode < 0) {
+         tn->log(0, SSTR("ERROR: failed to fetch markers for bucket: "
+                         << siter->source.get_bucket_info().bucket));
+         return set_cr_error(retcode);
+       }
+       retcode = marker_mgr.from_string(marker_info.max_marker, -1);
+       if (retcode < 0) {
+         ldpp_dout(dpp, 0) << "ERROR: failed to decode markers for bucket: "
+                           << siter->source.get_bucket_info().bucket << dendl;
+         return set_cr_error(retcode);
+       }
+       source_num_shards = marker_mgr.get().size();
 
-        source_num_shards = siter->source.get_bucket_info().layout.current_index.layout.normal.num_shards;
        target_num_shards = siter->target.get_bucket_info().layout.current_index.layout.normal.num_shards;
         if (source_bs) {
           sync_pair.source_bs = *source_bs;