]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: Get rid of RGWBucketPipeSyncStatusManager::init
authorAdam C. Emerson <aemerson@redhat.com>
Wed, 13 Apr 2022 01:37:05 +0000 (21:37 -0400)
committerCasey Bodley <cbodley@redhat.com>
Fri, 27 May 2022 19:47:34 +0000 (15:47 -0400)
Use the Named Constructor Idiom instead.

Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
src/rgw/rgw_admin.cc
src/rgw/rgw_data_sync.cc
src/rgw/rgw_data_sync.h

index 5d23d5ce8bfafc61299620e1d2344ec73e431405..5992fc82b5556e928f31141a704125b57f57e6a2 100644 (file)
@@ -8840,14 +8840,15 @@ next:
       opt_sb = sbuck->get_key();
     }
 
-    RGWBucketPipeSyncStatusManager sync(static_cast<rgw::sal::RadosStore*>(store), source_zone, opt_sb, bucket->get_key());
+    auto sync = RGWBucketPipeSyncStatusManager::construct(
+      dpp(), static_cast<rgw::sal::RadosStore*>(store), source_zone, opt_sb,
+      bucket->get_key());
 
-    ret = sync.init(dpp());
-    if (ret < 0) {
-      cerr << "ERROR: sync.init() returned ret=" << ret << std::endl;
-      return -ret;
+    if (!sync) {
+      cerr << "ERROR: sync.init() returned error=" << sync.error() << std::endl;
+      return -sync.error();
     }
-    ret = sync.init_sync_status(dpp());
+    ret = (*sync)->init_sync_status(dpp());
     if (ret < 0) {
       cerr << "ERROR: sync.init_sync_status() returned ret=" << ret << std::endl;
       return -ret;
@@ -8947,19 +8948,20 @@ next:
     if (ret < 0) {
       return -ret;
     }
-    RGWBucketPipeSyncStatusManager sync(static_cast<rgw::sal::RadosStore*>(store), source_zone, opt_source_bucket, bucket->get_key());
+    auto sync = RGWBucketPipeSyncStatusManager::construct(
+      dpp(), static_cast<rgw::sal::RadosStore*>(store), source_zone,
+      opt_source_bucket, bucket->get_key());
 
-    ret = sync.init(dpp());
-    if (ret < 0) {
-      cerr << "ERROR: sync.init() returned ret=" << ret << std::endl;
-      return -ret;
+    if (!sync) {
+      cerr << "ERROR: sync.init() returned error=" << sync.error() << std::endl;
+      return -sync.error();
     }
 
-    auto sync_status = sync.read_sync_status(dpp());
+    auto sync_status = (*sync)->read_sync_status(dpp());
     if (!sync_status) {
       cerr << "ERROR: sync.read_sync_status() returned error="
           << sync_status.error() << std::endl;
-      return -ret;
+      return -sync_status.error();
     }
 
     encode_json("sync_status", *sync_status, formatter.get());
@@ -8979,15 +8981,16 @@ next:
     if (ret < 0) {
       return -ret;
     }
-    RGWBucketPipeSyncStatusManager sync(static_cast<rgw::sal::RadosStore*>(store), source_zone, opt_source_bucket, bucket->get_key());
+    auto sync = RGWBucketPipeSyncStatusManager::construct(
+      dpp(), static_cast<rgw::sal::RadosStore*>(store), source_zone,
+      opt_source_bucket, bucket->get_key());
 
-    ret = sync.init(dpp());
-    if (ret < 0) {
-      cerr << "ERROR: sync.init() returned ret=" << ret << std::endl;
-      return -ret;
+    if (!sync) {
+      cerr << "ERROR: sync.init() returned error=" << sync.error() << std::endl;
+      return -sync.error();
     }
 
-    ret = sync.run(dpp());
+    ret = (*sync)->run(dpp());
     if (ret < 0) {
       cerr << "ERROR: sync.run() returned ret=" << ret << std::endl;
       return -ret;
index abf4367b3f4401f1f144f79f557ea435dde03f4b..b35e36c230dc7747b962290832ac36dfcfb011f4 100644 (file)
@@ -5385,7 +5385,7 @@ RGWCoroutine *RGWRemoteBucketManager::run_sync_cr(int num)
                               sync_env->sync_tracer->root_node, nullptr);
 }
 
-int RGWBucketPipeSyncStatusManager::init(const DoutPrefixProvider *dpp)
+int RGWBucketPipeSyncStatusManager::do_init(const DoutPrefixProvider *dpp)
 {
   int ret = http_manager.start();
   if (ret < 0) {
@@ -5440,11 +5440,33 @@ int RGWBucketPipeSyncStatusManager::init(const DoutPrefixProvider *dpp)
                             pipe.source.get_bucket_info(),
                             num_shards,
                             pipe.target.get_bucket());
+    sources.emplace_back(&sync_env, szone, conn,
+                        pipe.source.get_bucket_info(),
+                        pipe.target.get_bucket(),
+                        pipe.handler);
   }
 
   return 0;
 }
 
+tl::expected<std::unique_ptr<RGWBucketPipeSyncStatusManager>, int>
+RGWBucketPipeSyncStatusManager::construct(
+  const DoutPrefixProvider* dpp,
+  rgw::sal::RadosStore* store,
+  std::optional<rgw_zone_id> source_zone,
+  std::optional<rgw_bucket> source_bucket,
+  const rgw_bucket& dest_bucket)
+{
+  std::unique_ptr<RGWBucketPipeSyncStatusManager> self{
+    new RGWBucketPipeSyncStatusManager(store, source_zone, source_bucket,
+                                      dest_bucket)};
+  auto r = self->do_init(dpp);
+  if (r < 0) {
+    return tl::unexpected(r);
+  }
+  return self;
+}
+
 int RGWBucketPipeSyncStatusManager::init_sync_status(const DoutPrefixProvider *dpp)
 {
   list<RGWCoroutinesStack *> stacks;
index fdfda1a079264dac3f849da7368050d7ae82df27..8d1d9925c73bccdf4bbc517f7f2474bf57ded2bc 100644 (file)
@@ -331,12 +331,19 @@ struct RGWDataSyncEnv {
 };
 
 struct RGWDataSyncCtx {
-  CephContext *cct{nullptr};
   RGWDataSyncEnv *env{nullptr};
+  CephContext *cct{nullptr};
 
   RGWRESTConn *conn{nullptr};
   rgw_zone_id source_zone;
 
+  RGWDataSyncCtx() = default;
+
+  RGWDataSyncCtx(RGWDataSyncEnv* env,
+                RGWRESTConn* conn,
+                const rgw_zone_id& source_zone)
+    : env(env), cct(env->cct), conn(conn), source_zone(source_zone) {}
+
   void init(RGWDataSyncEnv *_env,
             RGWRESTConn *_conn,
             const rgw_zone_id& _source_zone) {
@@ -728,17 +735,35 @@ class RGWBucketPipeSyncStatusManager : public DoutPrefixProvider {
   rgw_bucket dest_bucket;
 
   std::vector<RGWRemoteBucketManager> source_mgrs;
+  struct source {
+    RGWDataSyncCtx sc;
+    RGWBucketInfo info;
+    rgw_bucket dest;
+    RGWBucketSyncFlowManager::pipe_handler handler;
+
+    source(RGWDataSyncEnv* env, const rgw_zone_id& zone, RGWRESTConn* conn,
+          const RGWBucketInfo& info, const rgw_bucket& dest,
+          const RGWBucketSyncFlowManager::pipe_handler& handler)
+      : sc(env, conn, zone), info(info), dest(dest), handler(handler) {}
+  };
+  std::vector<source> sources;
 
-public:
+  int do_init(const DoutPrefixProvider *dpp);
   RGWBucketPipeSyncStatusManager(rgw::sal::RadosStore* store,
                                 std::optional<rgw_zone_id> source_zone,
                                 std::optional<rgw_bucket> source_bucket,
                                 const rgw_bucket& dest_bucket)
     : store(store), source_zone(source_zone), source_bucket(source_bucket),
       dest_bucket(dest_bucket) {}
+
+public:
+  static tl::expected<std::unique_ptr<RGWBucketPipeSyncStatusManager>, int>
+  construct(const DoutPrefixProvider* dpp, rgw::sal::RadosStore* store,
+           std::optional<rgw_zone_id> source_zone,
+           std::optional<rgw_bucket> source_bucket,
+           const rgw_bucket& dest_bucket);
   ~RGWBucketPipeSyncStatusManager() = default;
 
-  int init(const DoutPrefixProvider *dpp);
 
   static std::string full_status_oid(const rgw_zone_id& source_zone,
                                     const rgw_bucket& source_bucket,