]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/sal: unify ReadStatsCB for async user/bucket stats
authorCasey Bodley <cbodley@redhat.com>
Wed, 22 Nov 2023 16:20:26 +0000 (11:20 -0500)
committerCasey Bodley <cbodley@redhat.com>
Thu, 23 Nov 2023 19:47:08 +0000 (14:47 -0500)
`rgw::sal::Bucket::read_stats_async()` had returned stats as
`map<RGWObjCategory, RGWStorageStats>`, but the only caller in
rgw_quota.cc just summed up the categories into a single instance
of `RGWStorageStats`. moving this summation up into rgw_rados'
`RGWGetBucketStatsContext` allows us to unify these sal callbacks
around `RGWStorageStats` alone

the `RGWGetUserStats_CB`/`RGWGetBucketStats_CB` callbacks had inherited
from `RefCountedObject` and required manual reference counting. switch
to `boost::intrusive_ptr` for scope-based shared ownership

Signed-off-by: Casey Bodley <cbodley@redhat.com>
22 files changed:
src/rgw/driver/daos/rgw_sal_daos.cc
src/rgw/driver/daos/rgw_sal_daos.h
src/rgw/driver/motr/rgw_sal_motr.cc
src/rgw/driver/motr/rgw_sal_motr.h
src/rgw/driver/posix/rgw_sal_posix.cc
src/rgw/driver/posix/rgw_sal_posix.h
src/rgw/driver/rados/rgw_rados.cc
src/rgw/driver/rados/rgw_rados.h
src/rgw/driver/rados/rgw_sal_rados.cc
src/rgw/driver/rados/rgw_sal_rados.h
src/rgw/driver/rados/rgw_user.h
src/rgw/rgw_quota.cc
src/rgw/rgw_sal.h
src/rgw/rgw_sal_dbstore.cc
src/rgw/rgw_sal_dbstore.h
src/rgw/rgw_sal_filter.cc
src/rgw/rgw_sal_filter.h
src/rgw/rgw_sal_fwd.h
src/rgw/services/svc_user.h
src/rgw/services/svc_user_rados.cc
src/rgw/services/svc_user_rados.h
src/test/rgw/test_rgw_lua.cc

index 3687f57b8c89f84aa3456363b8f16cc6c4fa38cb..6943205657973511b1e5a75e354e4a3507923299 100644 (file)
@@ -179,7 +179,7 @@ int DaosUser::read_stats(const DoutPrefixProvider* dpp, optional_yield y,
 
 /* stats - Not for first pass */
 int DaosUser::read_stats_async(const DoutPrefixProvider* dpp,
-                               RGWGetUserStats_CB* cb) {
+                               boost::intrusive_ptr<ReadStatsCB> cb) {
   return DAOS_NOT_IMPLEMENTED_LOG(dpp);
 }
 
@@ -495,7 +495,7 @@ int DaosBucket::read_stats(const DoutPrefixProvider* dpp,
 int DaosBucket::read_stats_async(
     const DoutPrefixProvider* dpp,
     const bucket_index_layout_generation& idx_layout, int shard_id,
-    RGWGetBucketStats_CB* ctx) {
+    boost::intrusive_ptr<ReadStatsCB> ctx) {
   return DAOS_NOT_IMPLEMENTED_LOG(dpp);
 }
 
index 66f570064632379089bf6ffaf16ef5d4d13dad39..146ba7077a4094e8ddec13d75f785d2c23bc47be 100644 (file)
@@ -187,7 +187,7 @@ class DaosUser : public StoreUser {
                          ceph::real_time* last_stats_sync = nullptr,
                          ceph::real_time* last_stats_update = nullptr) override;
   virtual int read_stats_async(const DoutPrefixProvider* dpp,
-                               RGWGetUserStats_CB* cb) override;
+                               boost::intrusive_ptr<ReadStatsCB> cb) override;
   virtual int complete_flush_stats(const DoutPrefixProvider* dpp,
                                    optional_yield y) override;
   virtual int read_usage(
@@ -309,7 +309,7 @@ class DaosBucket : public StoreBucket {
   virtual int read_stats_async(const DoutPrefixProvider* dpp,
                                const bucket_index_layout_generation& idx_layout,
                                int shard_id,
-                               RGWGetBucketStats_CB* ctx) override;
+                               boost::intrusive_ptr<ReadStatsCB> ctx) override;
   virtual int sync_user_stats(const DoutPrefixProvider* dpp,
                               optional_yield y) override;
   virtual int check_bucket_shards(const DoutPrefixProvider* dpp) override;
index 8cc8df987d2bb14c0987cddade76842fc4397759..a352e9c9c1387ecdfaccee6a5e09821b133e1e97 100644 (file)
@@ -289,7 +289,7 @@ int MotrUser::read_stats(const DoutPrefixProvider *dpp,
 }
 
 /* stats - Not for first pass */
-int MotrUser::read_stats_async(const DoutPrefixProvider *dpp, RGWGetUserStats_CB *cb)
+int MotrUser::read_stats_async(const DoutPrefixProvider *dpp, boost::intrusive_ptr<ReadStatsCB> cb)
 {
   return 0;
 }
@@ -803,7 +803,7 @@ int MotrBucket::create_multipart_indices()
 
 int MotrBucket::read_stats_async(const DoutPrefixProvider *dpp,
                                  const bucket_index_layout_generation& idx_layout,
-                                 int shard_id, RGWGetBucketStats_CB *ctx)
+                                 int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx)
 {
   return 0;
 }
index 3a110e36f173adfe997537cf07fa43aa8c3f9a7b..dad8ff8f4bd39247f2a9f4e7281a6857c01e2e2b 100644 (file)
@@ -241,7 +241,7 @@ class MotrUser : public StoreUser {
         optional_yield y, RGWStorageStats* stats,
         ceph::real_time *last_stats_sync = nullptr,
         ceph::real_time *last_stats_update = nullptr) override;
-    virtual int read_stats_async(const DoutPrefixProvider *dpp, RGWGetUserStats_CB* cb) override;
+    virtual int read_stats_async(const DoutPrefixProvider *dpp, boost::intrusive_ptr<ReadStatsCB> cb) override;
     virtual int complete_flush_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
     virtual int read_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch, uint32_t max_entries,
         bool* is_truncated, RGWUsageIter& usage_iter,
@@ -372,7 +372,7 @@ class MotrBucket : public StoreBucket {
         bool *syncstopped = nullptr) override;
     virtual int read_stats_async(const DoutPrefixProvider *dpp,
                                  const bucket_index_layout_generation& idx_layout,
-                                 int shard_id, RGWGetBucketStats_CB* ctx) override;
+                                 int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx) override;
     int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y,
                         RGWBucketEnt* ent) override;
     int check_bucket_shards(const DoutPrefixProvider *dpp,
index fc48c4f8fa8c5d3bafad904fbeeff144b1bd4cbf..6afa731d8e3f8c736a4f013ed5766bb7228ecb83 100644 (file)
@@ -959,7 +959,7 @@ int POSIXBucket::read_stats(const DoutPrefixProvider *dpp,
 
 int POSIXBucket::read_stats_async(const DoutPrefixProvider *dpp,
                                  const bucket_index_layout_generation& idx_layout,
-                                 int shard_id, RGWGetBucketStats_CB* ctx)
+                                 int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx)
 {
   return 0;
 }
index 1599808beff33b34d07ac7ca4ada4596b94eab6c..3b76295b0c479371689b9ef3b899b0e8725b1baf 100644 (file)
@@ -195,7 +195,7 @@ public:
                         bool* syncstopped = nullptr) override;
   virtual int read_stats_async(const DoutPrefixProvider *dpp,
                               const bucket_index_layout_generation& idx_layout,
-                              int shard_id, RGWGetBucketStats_CB* ctx) override;
+                              int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx) override;
   virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y,
                               RGWBucketEnt* ent) override;
   virtual int check_bucket_shards(const DoutPrefixProvider* dpp,
index 3632e66af595beadee8db32db8dbc3eb4e84f3c2..06ddda412271b56062a3be144147347d80f460ba 100644 (file)
@@ -8467,34 +8467,36 @@ int RGWRados::get_bucket_stats(const DoutPrefixProvider *dpp,
 }
 
 class RGWGetBucketStatsContext : public RGWGetDirHeader_CB {
-  RGWGetBucketStats_CB *cb;
+  boost::intrusive_ptr<rgw::sal::ReadStatsCB> cb;
   uint32_t pendings;
-  map<RGWObjCategory, RGWStorageStats> stats;
+  RGWStorageStats stats;
   int ret_code;
   bool should_cb;
   ceph::mutex lock = ceph::make_mutex("RGWGetBucketStatsContext");
 
 public:
-  RGWGetBucketStatsContext(RGWGetBucketStats_CB *_cb, uint32_t _pendings)
-    : cb(_cb), pendings(_pendings), stats(), ret_code(0), should_cb(true)
+  RGWGetBucketStatsContext(boost::intrusive_ptr<rgw::sal::ReadStatsCB> cb, uint32_t _pendings)
+    : cb(std::move(cb)), pendings(_pendings), stats(), ret_code(0), should_cb(true)
   {}
 
   void handle_response(int r, rgw_bucket_dir_header& header) override {
     std::lock_guard l{lock};
     if (should_cb) {
-      if ( r >= 0) {
-        accumulate_raw_stats(header, stats);
+      if (r >= 0) {
+        for (const auto& [c, s] : header.stats) {
+          stats.size += s.total_size;
+          stats.size_rounded += s.total_size_rounded;
+          stats.size_utilized += s.actual_size;
+          stats.num_objects += s.num_entries;
+        }
       } else {
         ret_code = r;
       }
 
       // Are we all done?
       if (--pendings == 0) {
-        if (!ret_code) {
-          cb->set_response(&stats);
-        }
-        cb->handle_response(ret_code);
-        cb->put();
+        cb->handle_response(ret_code, stats);
+        cb.reset();
       }
     }
   }
@@ -8505,14 +8507,13 @@ public:
   }
 };
 
-int RGWRados::get_bucket_stats_async(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, RGWGetBucketStats_CB *ctx)
+int RGWRados::get_bucket_stats_async(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, boost::intrusive_ptr<rgw::sal::ReadStatsCB> cb)
 {
   int num_aio = 0;
-  RGWGetBucketStatsContext *get_ctx = new RGWGetBucketStatsContext(ctx, bucket_info.layout.current_index.layout.normal.num_shards ? : 1);
+  RGWGetBucketStatsContext *get_ctx = new RGWGetBucketStatsContext(std::move(cb), bucket_info.layout.current_index.layout.normal.num_shards ? : 1);
   ceph_assert(get_ctx);
   int r = cls_bucket_head_async(dpp, bucket_info, idx_layout, shard_id, get_ctx, &num_aio);
   if (r < 0) {
-    ctx->put();
     if (num_aio) {
       get_ctx->unset_cb();
     }
index 77a08c068a647ffc23b575a7a8948d106d04ca96..19916992b9d586c256c44369032ca47964be7967 100644 (file)
@@ -1392,7 +1392,7 @@ public:
   int decode_policy(const DoutPrefixProvider *dpp, bufferlist& bl, ACLOwner *owner);
   int get_bucket_stats(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, std::string *bucket_ver, std::string *master_ver,
       std::map<RGWObjCategory, RGWStorageStats>& stats, std::string *max_marker, bool* syncstopped = NULL);
-  int get_bucket_stats_async(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, RGWGetBucketStats_CB *cb);
+  int get_bucket_stats_async(const DoutPrefixProvider *dpp, RGWBucketInfo& bucket_info, const rgw::bucket_index_layout_generation& idx_layout, int shard_id, boost::intrusive_ptr<rgw::sal::ReadStatsCB> cb);
 
   int put_bucket_instance_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, const std::map<std::string, bufferlist> *pattrs, const DoutPrefixProvider *dpp, optional_yield y);
   /* xxx dang obj_ctx -> svc */
index ed6e2525ac2b818c311242bc676e7ff351d57e62..194c2bcd6ae1b5fa38555aa55fa3c3465bb230e0 100644 (file)
@@ -187,7 +187,7 @@ int RadosUser::read_stats(const DoutPrefixProvider *dpp,
   return store->ctl()->user->read_stats(dpp, get_id(), stats, y, last_stats_sync, last_stats_update);
 }
 
-int RadosUser::read_stats_async(const DoutPrefixProvider *dpp, RGWGetUserStats_CB* cb)
+int RadosUser::read_stats_async(const DoutPrefixProvider *dpp, boost::intrusive_ptr<ReadStatsCB> cb)
 {
   return store->svc()->user->read_stats_async(dpp, get_id(), cb);
 }
@@ -531,7 +531,7 @@ int RadosBucket::read_stats(const DoutPrefixProvider *dpp,
 
 int RadosBucket::read_stats_async(const DoutPrefixProvider *dpp,
                                  const bucket_index_layout_generation& idx_layout,
-                                 int shard_id, RGWGetBucketStats_CB* ctx)
+                                 int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx)
 {
   return store->getRados()->get_bucket_stats_async(dpp, get_info(), idx_layout, shard_id, ctx);
 }
index 7efd7757c3c4b8e011c0b3731cb4109eac14589c..fbf14410c173f89658168347816450fc98eb5eeb 100644 (file)
@@ -271,7 +271,7 @@ class RadosUser : public StoreUser {
                            optional_yield y, RGWStorageStats* stats,
                           ceph::real_time* last_stats_sync = nullptr,
                           ceph::real_time* last_stats_update = nullptr) override;
-    virtual int read_stats_async(const DoutPrefixProvider *dpp, RGWGetUserStats_CB* cb) override;
+    virtual int read_stats_async(const DoutPrefixProvider *dpp, boost::intrusive_ptr<ReadStatsCB> cb) override;
     virtual int complete_flush_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
     virtual int read_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch, uint32_t max_entries,
                           bool* is_truncated, RGWUsageIter& usage_iter,
@@ -512,7 +512,7 @@ class RadosBucket : public StoreBucket {
                            bool* syncstopped = nullptr) override;
     virtual int read_stats_async(const DoutPrefixProvider *dpp,
                                  const bucket_index_layout_generation& idx_layout,
-                                 int shard_id, RGWGetBucketStats_CB* ctx) override;
+                                 int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx) override;
     int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y,
                         RGWBucketEnt* ent) override;
     int check_bucket_shards(const DoutPrefixProvider* dpp, uint64_t num_objs,
index d5eb167daa3fb46b8caf3754f2a5d21cfe882c47..a0cd7ed84fee7b295336c8c0c3957040ef410d1c 100644 (file)
@@ -30,8 +30,6 @@ class RGWUserCtl;
 class RGWBucketCtl;
 class RGWUserBuckets;
 
-class RGWGetUserStats_CB;
-
 /**
  * A string wrapper that includes encode/decode functions
  * for easily accessing a UID in all forms
index b245f7a972126a62ddb3bc09ff0a80aebc96d46e..6c76ce2367b50caffc8ef2c12bb656d87ad51da1 100644 (file)
@@ -247,16 +247,19 @@ void RGWQuotaCache<T>::adjust_stats(const rgw_user& user, rgw_bucket& bucket, in
 }
 
 class BucketAsyncRefreshHandler : public RGWQuotaCache<rgw_bucket>::AsyncRefreshHandler,
-                                  public RGWGetBucketStats_CB {
+                                  public rgw::sal::ReadStatsCB {
   rgw_user user;
+  rgw_bucket bucket;
 public:
   BucketAsyncRefreshHandler(rgw::sal::Driver* _driver, RGWQuotaCache<rgw_bucket> *_cache,
-                            const rgw_user& _user, const rgw_bucket& _bucket) :
-                                      RGWQuotaCache<rgw_bucket>::AsyncRefreshHandler(_driver, _cache),
-                                      RGWGetBucketStats_CB(_bucket), user(_user) {}
+                            const rgw_user& _user, const rgw_bucket& _bucket)
+    : RGWQuotaCache<rgw_bucket>::AsyncRefreshHandler(_driver, _cache),
+      user(_user), bucket(_bucket) {}
 
-  void drop_reference() override { put(); }
-  void handle_response(int r) override;
+  void drop_reference() override {
+    intrusive_ptr_release(this);
+  }
+  void handle_response(int r, const RGWStorageStats& stats) override;
   int init_fetch() override;
 };
 
@@ -289,7 +292,7 @@ int BucketAsyncRefreshHandler::init_fetch()
   return 0;
 }
 
-void BucketAsyncRefreshHandler::handle_response(const int r)
+void BucketAsyncRefreshHandler::handle_response(const int r, const RGWStorageStats& stats)
 {
   if (r < 0) {
     ldout(driver->ctx(), 20) << "AsyncRefreshHandler::handle_response() r=" << r << dendl;
@@ -297,17 +300,7 @@ void BucketAsyncRefreshHandler::handle_response(const int r)
     return;
   }
 
-  RGWStorageStats bs;
-
-  for (const auto& pair : *stats) {
-    const RGWStorageStats& s = pair.second;
-
-    bs.size += s.size;
-    bs.size_rounded += s.size_rounded;
-    bs.num_objects += s.num_objects;
-  }
-
-  cache->async_refresh_response(user, bucket, bs);
+  cache->async_refresh_response(user, bucket, stats);
 }
 
 class RGWBucketStatsCache : public RGWQuotaCache<rgw_bucket> {
@@ -377,7 +370,7 @@ int RGWBucketStatsCache::fetch_stats_from_storage(const rgw_user& _u, const rgw_
 }
 
 class UserAsyncRefreshHandler : public RGWQuotaCache<rgw_user>::AsyncRefreshHandler,
-                                public RGWGetUserStats_CB {
+                                public rgw::sal::ReadStatsCB {
   const DoutPrefixProvider *dpp;
   rgw_bucket bucket;
   rgw_user user;
@@ -389,7 +382,9 @@ class UserAsyncRefreshHandler : public RGWQuotaCache<rgw_user>::AsyncRefreshHand
         dpp(_dpp), bucket(_bucket), user(_user)
   {}
 
-  void drop_reference() override { put(); }
+  void drop_reference() override {
+    intrusive_ptr_release(this);
+  }
   int init_fetch() override;
   void handle_response(int r, const RGWStorageStats& stats) override;
 };
index 73ba1e18fd12532a420b5212487d7cab5824c3fa..38072f2c013ebb2299380163dd09aff80cc9824d 100644 (file)
@@ -15,6 +15,9 @@
 
 #pragma once
 
+#include <boost/intrusive_ptr.hpp>
+#include <boost/smart_ptr/intrusive_ref_counter.hpp>
+
 #include "common/tracer.h"
 #include "rgw_sal_fwd.h"
 #include "rgw_lua.h"
@@ -81,24 +84,6 @@ struct RGWClusterStat {
   uint64_t num_objects;
 };
 
-class RGWGetBucketStats_CB : public RefCountedObject {
-protected:
-  rgw_bucket bucket;
-  std::map<RGWObjCategory, RGWStorageStats>* stats;
-public:
-  explicit RGWGetBucketStats_CB(const rgw_bucket& _bucket) : bucket(_bucket), stats(NULL) {}
-  ~RGWGetBucketStats_CB() override {}
-  virtual void handle_response(int r) = 0;
-  virtual void set_response(std::map<RGWObjCategory, RGWStorageStats>* _stats) {
-    stats = _stats;
-  }
-};
-
-class RGWGetUserStats_CB : public RefCountedObject {
- public:
-  virtual void handle_response(int r, const RGWStorageStats& stats) = 0;
-};
-
 struct RGWObjState {
   rgw_obj obj;
   bool is_atomic{false};
@@ -441,6 +426,14 @@ class Driver {
     virtual void register_admin_apis(RGWRESTMgr* mgr) = 0;
 };
 
+
+/// \brief Ref-counted callback object for User/Bucket read_stats_async().
+class ReadStatsCB : public boost::intrusive_ref_counter<ReadStatsCB> {
+ public:
+  virtual ~ReadStatsCB() {}
+  virtual void handle_response(int r, const RGWStorageStats& stats) = 0;
+};
+
 /**
  * @brief A list of buckets
  *
@@ -522,7 +515,8 @@ class User {
                           ceph::real_time* last_stats_sync = nullptr,
                           ceph::real_time* last_stats_update = nullptr) = 0;
     /** Read the User stats from the backing Store, asynchronous */
-    virtual int read_stats_async(const DoutPrefixProvider *dpp, RGWGetUserStats_CB* cb) = 0;
+    virtual int read_stats_async(const DoutPrefixProvider *dpp,
+                                 boost::intrusive_ptr<ReadStatsCB> cb) = 0;
     /** Flush accumulated stat changes for this User to the backing store */
     virtual int complete_flush_stats(const DoutPrefixProvider *dpp, optional_yield y) = 0;
     /** Read detailed usage stats for this User from the backing store */
@@ -675,7 +669,7 @@ class Bucket {
     /** Read the bucket stats from the backing Store, asynchronous */
     virtual int read_stats_async(const DoutPrefixProvider *dpp,
                                 const bucket_index_layout_generation& idx_layout,
-                                int shard_id, RGWGetBucketStats_CB* ctx) = 0;
+                                int shard_id, boost::intrusive_ptr<ReadStatsCB> cb) = 0;
     /** Sync this bucket's stats to the owning user's stats in the backing store */
     virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y,
                                 RGWBucketEnt* optional_ent) = 0;
index 6c8778b872383a395b77ebc2756ade46f52ed75b..2305b217f8882f7fee9fd916b78cd0aed0ed6f8e 100644 (file)
@@ -90,7 +90,7 @@ namespace rgw::sal {
   }
 
   /* stats - Not for first pass */
-  int DBUser::read_stats_async(const DoutPrefixProvider *dpp, RGWGetUserStats_CB *cb)
+  int DBUser::read_stats_async(const DoutPrefixProvider *dpp, boost::intrusive_ptr<ReadStatsCB> cb)
   {
     return 0;
   }
@@ -221,7 +221,7 @@ namespace rgw::sal {
     return 0;
   }
 
-  int DBBucket::read_stats_async(const DoutPrefixProvider *dpp, const bucket_index_layout_generation& idx_layout, int shard_id, RGWGetBucketStats_CB *ctx)
+  int DBBucket::read_stats_async(const DoutPrefixProvider *dpp, const bucket_index_layout_generation& idx_layout, int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx)
   {
     return 0;
   }
index 646ee23f8875065385004338b634b325db0687af..bfa424e269feb5723a06adb4fc206631cf077a50 100644 (file)
@@ -93,7 +93,7 @@ protected:
           optional_yield y, RGWStorageStats* stats,
           ceph::real_time *last_stats_sync = nullptr,
           ceph::real_time *last_stats_update = nullptr) override;
-      virtual int read_stats_async(const DoutPrefixProvider *dpp, RGWGetUserStats_CB* cb) override;
+      virtual int read_stats_async(const DoutPrefixProvider *dpp, boost::intrusive_ptr<ReadStatsCB> cb) override;
       virtual int complete_flush_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
       virtual int read_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch, uint64_t end_epoch, uint32_t max_entries,
           bool* is_truncated, RGWUsageIter& usage_iter,
@@ -155,7 +155,7 @@ protected:
           std::map<RGWObjCategory, RGWStorageStats>& stats,
           std::string *max_marker = nullptr,
           bool *syncstopped = nullptr) override;
-      virtual int read_stats_async(const DoutPrefixProvider *dpp, const bucket_index_layout_generation& idx_layout, int shard_id, RGWGetBucketStats_CB* ctx) override;
+      virtual int read_stats_async(const DoutPrefixProvider *dpp, const bucket_index_layout_generation& idx_layout, int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx) override;
       int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y,
                           RGWBucketEnt* ent) override;
       int check_bucket_shards(const DoutPrefixProvider *dpp,
index b49c6887b62ec1589abc41e78b6f5a7f730565e3..decd648adb0fe0c40e6f541803e67edf615f8fd1 100644 (file)
@@ -508,7 +508,7 @@ int FilterUser::read_stats(const DoutPrefixProvider *dpp,
   return next->read_stats(dpp, y, stats, last_stats_sync, last_stats_update);
 }
 
-int FilterUser::read_stats_async(const DoutPrefixProvider *dpp, RGWGetUserStats_CB* cb)
+int FilterUser::read_stats_async(const DoutPrefixProvider *dpp, boost::intrusive_ptr<ReadStatsCB> cb)
 {
   return next->read_stats_async(dpp, cb);
 }
@@ -613,7 +613,7 @@ int FilterBucket::read_stats(const DoutPrefixProvider *dpp,
 
 int FilterBucket::read_stats_async(const DoutPrefixProvider *dpp,
                                   const bucket_index_layout_generation& idx_layout,
-                                  int shard_id, RGWGetBucketStats_CB* ctx)
+                                  int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx)
 {
   return next->read_stats_async(dpp, idx_layout, shard_id, ctx);
 }
index 239a80a646531a089bac43160e659f13330785f0..aebbe383714d7ba986bbdcf8f800138688a66150 100644 (file)
@@ -338,7 +338,7 @@ public:
                         ceph::real_time* last_stats_sync = nullptr,
                         ceph::real_time* last_stats_update = nullptr) override;
   virtual int read_stats_async(const DoutPrefixProvider *dpp,
-                              RGWGetUserStats_CB* cb) override;
+                              boost::intrusive_ptr<ReadStatsCB> cb) override;
   virtual int complete_flush_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
   virtual int read_usage(const DoutPrefixProvider *dpp, uint64_t start_epoch,
                         uint64_t end_epoch, uint32_t max_entries,
@@ -397,7 +397,7 @@ public:
                         bool* syncstopped = nullptr) override;
   virtual int read_stats_async(const DoutPrefixProvider *dpp,
                               const bucket_index_layout_generation& idx_layout,
-                              int shard_id, RGWGetBucketStats_CB* ctx) override;
+                              int shard_id, boost::intrusive_ptr<ReadStatsCB> ctx) override;
   int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y,
                       RGWBucketEnt* ent) override;
   int check_bucket_shards(const DoutPrefixProvider* dpp,
index 08866c2bea287153054fb95bbd432f60377180b6..ee7c100080b52f8c17451f996dfe6b782f44082c 100644 (file)
@@ -32,6 +32,9 @@ namespace rgw { namespace sal {
   class Zone;
   class LuaManager;
   struct RGWRoleInfo;
+  class DataProcessor;
+  class ObjectProcessor;
+  class ReadStatsCB;
 
   class ConfigStore;
   class RealmWriter;
index 1cb459d31cb212cf404b135bfeee3a05282c9713..f53ec49f2595a421219d5c46eedfb8adf4a2bd6b 100644 (file)
@@ -20,9 +20,9 @@
 #include "svc_meta_be.h"
 
 #include "rgw_service.h"
+#include "rgw_sal_fwd.h"
 
 class RGWUserBuckets;
-class RGWGetUserStats_CB;
 
 class RGWSI_User : public RGWServiceInstance
 {
@@ -122,6 +122,7 @@ public:
                          optional_yield y) = 0;  /* last time a stats update was done */
 
   virtual int read_stats_async(const DoutPrefixProvider *dpp,
-                              const rgw_user& user, RGWGetUserStats_CB *cb) = 0;
+                              const rgw_user& user,
+                              boost::intrusive_ptr<rgw::sal::ReadStatsCB> cb) = 0;
 };
 
index 1b23dad53fbd8f8777458396289cb9b06d5e3139..b9dd8cd155354d2dcc15b1346910275baf76be48 100644 (file)
@@ -927,11 +927,11 @@ int RGWSI_User_RADOS::read_stats(const DoutPrefixProvider *dpp,
 }
 
 class RGWGetUserStatsContext : public RGWGetUserHeader_CB {
-  RGWGetUserStats_CB *cb;
+  boost::intrusive_ptr<rgw::sal::ReadStatsCB> cb;
 
 public:
-  explicit RGWGetUserStatsContext(RGWGetUserStats_CB * const cb)
-    : cb(cb) {}
+  explicit RGWGetUserStatsContext(boost::intrusive_ptr<rgw::sal::ReadStatsCB> cb)
+    : cb(std::move(cb)) {}
 
   void handle_response(int r, cls_user_header& header) override {
     const cls_user_stats& hs = header.stats;
@@ -942,17 +942,17 @@ public:
     stats.num_objects = hs.total_entries;
 
     cb->handle_response(r, stats);
-
-    cb->put();
+    cb.reset();
   }
 };
 
 int RGWSI_User_RADOS::read_stats_async(const DoutPrefixProvider *dpp,
-                                       const rgw_user& user, RGWGetUserStats_CB *_cb)
+                                       const rgw_user& user,
+                                       boost::intrusive_ptr<rgw::sal::ReadStatsCB> _cb)
 {
   string user_str = user.to_str();
 
-  RGWGetUserStatsContext *cb = new RGWGetUserStatsContext(_cb);
+  RGWGetUserStatsContext *cb = new RGWGetUserStatsContext(std::move(_cb));
   int r = cls_user_get_header_async(dpp, user_str, cb);
   if (r < 0) {
     delete cb;
index 4712d1fdafd4108ef50b50d017b467e0dc9f2d8c..01d8a8eb1ccb3cf68e470c7c256b74c5a9f29ec2 100644 (file)
@@ -34,7 +34,6 @@ class RGWSI_MetaBackend_Handler;
 struct rgw_cache_entry_info;
 
 class RGWGetUserHeader_CB;
-class RGWGetUserStats_CB;
 
 template <class T>
 class RGWChainedCacheImpl;
@@ -207,6 +206,6 @@ public:
                  optional_yield y) override;  /* last time a stats update was done */
 
   int read_stats_async(const DoutPrefixProvider *dpp, const rgw_user& user,
-                       RGWGetUserStats_CB *cb) override;
+                       boost::intrusive_ptr<rgw::sal::ReadStatsCB> cb) override;
 };
 
index be9fa6aed1622dc6bb7915e585006eca97f95a68..dfd2767f5503f5a8860f70c5c39b1eaa623034b6 100644 (file)
@@ -86,7 +86,7 @@ public:
     return 0;
   }
 
-  virtual int read_stats_async(const DoutPrefixProvider *dpp, RGWGetUserStats_CB *cb) override {
+  virtual int read_stats_async(const DoutPrefixProvider *dpp, boost::intrusive_ptr<sal::ReadStatsCB> cb) override {
     return 0;
   }