From 70b86258f84e1af2e8e68f7aea0506f3f3196a61 Mon Sep 17 00:00:00 2001 From: "Adam C. Emerson" Date: Tue, 12 Apr 2022 21:37:05 -0400 Subject: [PATCH] rgw: Get rid of RGWBucketPipeSyncStatusManager::init Use the Named Constructor Idiom instead. Signed-off-by: Adam C. Emerson --- src/rgw/rgw_admin.cc | 41 +++++++++++++++++++++------------------- src/rgw/rgw_data_sync.cc | 24 ++++++++++++++++++++++- src/rgw/rgw_data_sync.h | 31 +++++++++++++++++++++++++++--- 3 files changed, 73 insertions(+), 23 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index 5d23d5ce8bf..5992fc82b55 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -8840,14 +8840,15 @@ next: opt_sb = sbuck->get_key(); } - RGWBucketPipeSyncStatusManager sync(static_cast(store), source_zone, opt_sb, bucket->get_key()); + auto sync = RGWBucketPipeSyncStatusManager::construct( + dpp(), static_cast(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(store), source_zone, opt_source_bucket, bucket->get_key()); + auto sync = RGWBucketPipeSyncStatusManager::construct( + dpp(), static_cast(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(store), source_zone, opt_source_bucket, bucket->get_key()); + auto sync = RGWBucketPipeSyncStatusManager::construct( + dpp(), static_cast(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; diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index abf4367b3f4..b35e36c230d 100644 --- a/src/rgw/rgw_data_sync.cc +++ b/src/rgw/rgw_data_sync.cc @@ -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, int> +RGWBucketPipeSyncStatusManager::construct( + const DoutPrefixProvider* dpp, + rgw::sal::RadosStore* store, + std::optional source_zone, + std::optional source_bucket, + const rgw_bucket& dest_bucket) +{ + std::unique_ptr 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 stacks; diff --git a/src/rgw/rgw_data_sync.h b/src/rgw/rgw_data_sync.h index fdfda1a0792..8d1d9925c73 100644 --- a/src/rgw/rgw_data_sync.h +++ b/src/rgw/rgw_data_sync.h @@ -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 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 sources; -public: + int do_init(const DoutPrefixProvider *dpp); RGWBucketPipeSyncStatusManager(rgw::sal::RadosStore* store, std::optional source_zone, std::optional 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, int> + construct(const DoutPrefixProvider* dpp, rgw::sal::RadosStore* store, + std::optional source_zone, + std::optional 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, -- 2.39.5