]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: RGWBucketPipeSyncStatusManger takes optional ostream
authorAdam C. Emerson <aemerson@redhat.com>
Thu, 30 Jun 2022 17:48:49 +0000 (13:48 -0400)
committerAdam C. Emerson <aemerson@redhat.com>
Sun, 17 Jul 2022 04:42:55 +0000 (00:42 -0400)
`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 <aemerson@redhat.com>
src/rgw/rgw_admin.cc
src/rgw/rgw_data_sync.cc
src/rgw/rgw_data_sync.h

index eb1b8f8093966157bc7d1dd90f36f6e736e1d796..5e5bcb458119cca79169f2b1a539ce9c60df005c 100644 (file)
@@ -8939,7 +8939,7 @@ next:
 
     auto sync = RGWBucketPipeSyncStatusManager::construct(
       dpp(), static_cast<rgw::sal::RadosStore*>(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<rgw::sal::RadosStore*>(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<rgw::sal::RadosStore*>(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;
index fe420de82d57e4078f4666728d0484300bf8d9bf..3c110ebd50c394cd42a6066973fe922293a0b487 100644 (file)
@@ -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<rgw_zone_id> source_zone,
   std::optional<rgw_bucket> source_bucket,
-  const rgw_bucket& dest_bucket)
+  const rgw_bucket& dest_bucket,
+  std::ostream* ostr)
 {
   std::unique_ptr<RGWBucketPipeSyncStatusManager> 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);
   }
index dde6133770a3694c48672ad033c48f0885236f0c..35db02f1d729c9c52cda09c79f832c3739af74a2 100644 (file)
@@ -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<typename ...T>
+void pretty_print(const RGWDataSyncEnv* env, T&& ...t) {
+  if (unlikely(!!env->ostr)) {
+    fmt::print(*env->ostr, std::forward<T>(t)...);
+    env->ostr->flush();
+  }
+}
+
 struct RGWDataSyncCtx {
   RGWDataSyncEnv *env{nullptr};
   CephContext *cct{nullptr};
@@ -714,7 +726,7 @@ class RGWBucketPipeSyncStatusManager : public DoutPrefixProvider {
   };
   std::vector<source> sources;
 
-  int do_init(const DoutPrefixProvider *dpp);
+  int do_init(const DoutPrefixProvider *dpp, std::ostream* ostr);
   RGWBucketPipeSyncStatusManager(rgw::sal::RadosStore* store,
                                 std::optional<rgw_zone_id> source_zone,
                                 std::optional<rgw_bucket> source_bucket,
@@ -730,7 +742,7 @@ public:
   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);
+           const rgw_bucket& dest_bucket, std::ostream *ostream);
   ~RGWBucketPipeSyncStatusManager() = default;