From 702c03c9c841a20899c40d1f7cb81e09cf7227c7 Mon Sep 17 00:00:00 2001 From: "Adam C. Emerson" Date: Thu, 30 Jun 2022 13:48:49 -0400 Subject: [PATCH] rgw: RGWBucketPipeSyncStatusManger takes optional ostream `radosgw-admin` provides it when the `--extra-info` option is provided. It gets stashed in the SyncEnv for later use. Signed-off-by: Adam C. Emerson --- src/rgw/rgw_admin.cc | 6 +++--- src/rgw/rgw_data_sync.cc | 10 +++++++--- src/rgw/rgw_data_sync.h | 16 ++++++++++++++-- 3 files changed, 24 insertions(+), 8 deletions(-) diff --git a/src/rgw/rgw_admin.cc b/src/rgw/rgw_admin.cc index eb1b8f8093966..5e5bcb458119c 100644 --- a/src/rgw/rgw_admin.cc +++ b/src/rgw/rgw_admin.cc @@ -8939,7 +8939,7 @@ next: auto sync = RGWBucketPipeSyncStatusManager::construct( dpp(), static_cast(store), source_zone, opt_sb, - bucket->get_key()); + bucket->get_key(), extra_info ? &std::cout : nullptr); if (!sync) { cerr << "ERROR: sync.init() returned error=" << sync.error() << std::endl; @@ -9047,7 +9047,7 @@ next: } auto sync = RGWBucketPipeSyncStatusManager::construct( dpp(), static_cast(store), source_zone, - opt_source_bucket, bucket->get_key()); + opt_source_bucket, bucket->get_key(), nullptr); if (!sync) { cerr << "ERROR: sync.init() returned error=" << sync.error() << std::endl; @@ -9080,7 +9080,7 @@ next: } auto sync = RGWBucketPipeSyncStatusManager::construct( dpp(), static_cast(store), source_zone, - opt_source_bucket, bucket->get_key()); + opt_source_bucket, bucket->get_key(), extra_info ? &std::cout : nullptr); if (!sync) { cerr << "ERROR: sync.init() returned error=" << sync.error() << std::endl; diff --git a/src/rgw/rgw_data_sync.cc b/src/rgw/rgw_data_sync.cc index fe420de82d57e..3c110ebd50c39 100644 --- a/src/rgw/rgw_data_sync.cc +++ b/src/rgw/rgw_data_sync.cc @@ -5328,7 +5328,8 @@ int RGWSyncBucketCR::operate(const DoutPrefixProvider *dpp) return 0; } -int RGWBucketPipeSyncStatusManager::do_init(const DoutPrefixProvider *dpp) +int RGWBucketPipeSyncStatusManager::do_init(const DoutPrefixProvider *dpp, + std::ostream* ostr) { int ret = http_manager.start(); if (ret < 0) { @@ -5344,6 +5345,8 @@ int RGWBucketPipeSyncStatusManager::do_init(const DoutPrefixProvider *dpp) error_logger.get(), store->getRados()->get_sync_tracer(), sync_module, nullptr); + sync_env.ostr = ostr; + rgw_sync_pipe_info_set pipes; ret = cr_mgr.run(dpp, new RGWGetBucketPeersCR(&sync_env, @@ -5421,12 +5424,13 @@ RGWBucketPipeSyncStatusManager::construct( rgw::sal::RadosStore* store, std::optional source_zone, std::optional source_bucket, - const rgw_bucket& dest_bucket) + const rgw_bucket& dest_bucket, + std::ostream* ostr) { std::unique_ptr self{ new RGWBucketPipeSyncStatusManager(store, source_zone, source_bucket, dest_bucket)}; - auto r = self->do_init(dpp); + auto r = self->do_init(dpp, ostr); if (r < 0) { return tl::unexpected(r); } diff --git a/src/rgw/rgw_data_sync.h b/src/rgw/rgw_data_sync.h index dde6133770a36..35db02f1d729c 100644 --- a/src/rgw/rgw_data_sync.h +++ b/src/rgw/rgw_data_sync.h @@ -7,6 +7,7 @@ #include "include/encoding.h" #include "common/ceph_json.h" +#include "common/likely.h" #include "rgw_coroutine.h" #include "rgw_http_client.h" @@ -328,8 +329,19 @@ struct RGWDataSyncEnv { std::string shard_obj_name(int shard_id); std::string status_oid(); + + std::ostream* ostr{nullptr}; // For pretty printing progress }; +// pretty ostream output for `radosgw-admin bucket sync run` +template +void pretty_print(const RGWDataSyncEnv* env, T&& ...t) { + if (unlikely(!!env->ostr)) { + fmt::print(*env->ostr, std::forward(t)...); + env->ostr->flush(); + } +} + struct RGWDataSyncCtx { RGWDataSyncEnv *env{nullptr}; CephContext *cct{nullptr}; @@ -714,7 +726,7 @@ class RGWBucketPipeSyncStatusManager : public DoutPrefixProvider { }; std::vector sources; - int do_init(const DoutPrefixProvider *dpp); + int do_init(const DoutPrefixProvider *dpp, std::ostream* ostr); RGWBucketPipeSyncStatusManager(rgw::sal::RadosStore* store, std::optional source_zone, std::optional source_bucket, @@ -730,7 +742,7 @@ public: construct(const DoutPrefixProvider* dpp, rgw::sal::RadosStore* store, std::optional source_zone, std::optional source_bucket, - const rgw_bucket& dest_bucket); + const rgw_bucket& dest_bucket, std::ostream *ostream); ~RGWBucketPipeSyncStatusManager() = default; -- 2.39.5