Use the Named Constructor Idiom instead.
Signed-off-by: Adam C. Emerson <aemerson@redhat.com>
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;
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());
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;
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) {
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;
};
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) {
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,