From 3bf735b4ab78f64e434feec7f11b84a2d9aa1a01 Mon Sep 17 00:00:00 2001 From: Casey Bodley Date: Wed, 22 Nov 2023 11:20:26 -0500 Subject: [PATCH] rgw/sal: unify ReadStatsCB for async user/bucket stats `rgw::sal::Bucket::read_stats_async()` had returned stats as `map`, 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 --- src/rgw/driver/daos/rgw_sal_daos.cc | 4 +-- src/rgw/driver/daos/rgw_sal_daos.h | 4 +-- src/rgw/driver/motr/rgw_sal_motr.cc | 4 +-- src/rgw/driver/motr/rgw_sal_motr.h | 4 +-- src/rgw/driver/posix/rgw_sal_posix.cc | 2 +- src/rgw/driver/posix/rgw_sal_posix.h | 2 +- src/rgw/driver/rados/rgw_rados.cc | 29 +++++++++++----------- src/rgw/driver/rados/rgw_rados.h | 2 +- src/rgw/driver/rados/rgw_sal_rados.cc | 4 +-- src/rgw/driver/rados/rgw_sal_rados.h | 4 +-- src/rgw/driver/rados/rgw_user.h | 2 -- src/rgw/rgw_quota.cc | 35 ++++++++++++--------------- src/rgw/rgw_sal.h | 34 +++++++++++--------------- src/rgw/rgw_sal_dbstore.cc | 4 +-- src/rgw/rgw_sal_dbstore.h | 4 +-- src/rgw/rgw_sal_filter.cc | 4 +-- src/rgw/rgw_sal_filter.h | 4 +-- src/rgw/rgw_sal_fwd.h | 3 +++ src/rgw/services/svc_user.h | 5 ++-- src/rgw/services/svc_user_rados.cc | 14 +++++------ src/rgw/services/svc_user_rados.h | 3 +-- src/test/rgw/test_rgw_lua.cc | 2 +- 22 files changed, 82 insertions(+), 91 deletions(-) diff --git a/src/rgw/driver/daos/rgw_sal_daos.cc b/src/rgw/driver/daos/rgw_sal_daos.cc index 3687f57b8c8..69432056579 100644 --- a/src/rgw/driver/daos/rgw_sal_daos.cc +++ b/src/rgw/driver/daos/rgw_sal_daos.cc @@ -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 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 ctx) { return DAOS_NOT_IMPLEMENTED_LOG(dpp); } diff --git a/src/rgw/driver/daos/rgw_sal_daos.h b/src/rgw/driver/daos/rgw_sal_daos.h index 66f57006463..146ba7077a4 100644 --- a/src/rgw/driver/daos/rgw_sal_daos.h +++ b/src/rgw/driver/daos/rgw_sal_daos.h @@ -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 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 ctx) override; virtual int sync_user_stats(const DoutPrefixProvider* dpp, optional_yield y) override; virtual int check_bucket_shards(const DoutPrefixProvider* dpp) override; diff --git a/src/rgw/driver/motr/rgw_sal_motr.cc b/src/rgw/driver/motr/rgw_sal_motr.cc index 8cc8df987d2..a352e9c9c13 100644 --- a/src/rgw/driver/motr/rgw_sal_motr.cc +++ b/src/rgw/driver/motr/rgw_sal_motr.cc @@ -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 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 ctx) { return 0; } diff --git a/src/rgw/driver/motr/rgw_sal_motr.h b/src/rgw/driver/motr/rgw_sal_motr.h index 3a110e36f17..dad8ff8f4bd 100644 --- a/src/rgw/driver/motr/rgw_sal_motr.h +++ b/src/rgw/driver/motr/rgw_sal_motr.h @@ -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 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 ctx) override; int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y, RGWBucketEnt* ent) override; int check_bucket_shards(const DoutPrefixProvider *dpp, diff --git a/src/rgw/driver/posix/rgw_sal_posix.cc b/src/rgw/driver/posix/rgw_sal_posix.cc index fc48c4f8fa8..6afa731d8e3 100644 --- a/src/rgw/driver/posix/rgw_sal_posix.cc +++ b/src/rgw/driver/posix/rgw_sal_posix.cc @@ -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 ctx) { return 0; } diff --git a/src/rgw/driver/posix/rgw_sal_posix.h b/src/rgw/driver/posix/rgw_sal_posix.h index 1599808beff..3b76295b0c4 100644 --- a/src/rgw/driver/posix/rgw_sal_posix.h +++ b/src/rgw/driver/posix/rgw_sal_posix.h @@ -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 ctx) override; virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y, RGWBucketEnt* ent) override; virtual int check_bucket_shards(const DoutPrefixProvider* dpp, diff --git a/src/rgw/driver/rados/rgw_rados.cc b/src/rgw/driver/rados/rgw_rados.cc index 3632e66af59..06ddda41227 100644 --- a/src/rgw/driver/rados/rgw_rados.cc +++ b/src/rgw/driver/rados/rgw_rados.cc @@ -8467,34 +8467,36 @@ int RGWRados::get_bucket_stats(const DoutPrefixProvider *dpp, } class RGWGetBucketStatsContext : public RGWGetDirHeader_CB { - RGWGetBucketStats_CB *cb; + boost::intrusive_ptr cb; uint32_t pendings; - map 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 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 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(); } diff --git a/src/rgw/driver/rados/rgw_rados.h b/src/rgw/driver/rados/rgw_rados.h index 77a08c068a6..19916992b9d 100644 --- a/src/rgw/driver/rados/rgw_rados.h +++ b/src/rgw/driver/rados/rgw_rados.h @@ -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& 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 cb); int put_bucket_instance_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, const std::map *pattrs, const DoutPrefixProvider *dpp, optional_yield y); /* xxx dang obj_ctx -> svc */ diff --git a/src/rgw/driver/rados/rgw_sal_rados.cc b/src/rgw/driver/rados/rgw_sal_rados.cc index ed6e2525ac2..194c2bcd6ae 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.cc +++ b/src/rgw/driver/rados/rgw_sal_rados.cc @@ -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 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 ctx) { return store->getRados()->get_bucket_stats_async(dpp, get_info(), idx_layout, shard_id, ctx); } diff --git a/src/rgw/driver/rados/rgw_sal_rados.h b/src/rgw/driver/rados/rgw_sal_rados.h index 7efd7757c3c..fbf14410c17 100644 --- a/src/rgw/driver/rados/rgw_sal_rados.h +++ b/src/rgw/driver/rados/rgw_sal_rados.h @@ -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 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 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, diff --git a/src/rgw/driver/rados/rgw_user.h b/src/rgw/driver/rados/rgw_user.h index d5eb167daa3..a0cd7ed84fe 100644 --- a/src/rgw/driver/rados/rgw_user.h +++ b/src/rgw/driver/rados/rgw_user.h @@ -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 diff --git a/src/rgw/rgw_quota.cc b/src/rgw/rgw_quota.cc index b245f7a9721..6c76ce2367b 100644 --- a/src/rgw/rgw_quota.cc +++ b/src/rgw/rgw_quota.cc @@ -247,16 +247,19 @@ void RGWQuotaCache::adjust_stats(const rgw_user& user, rgw_bucket& bucket, in } class BucketAsyncRefreshHandler : public RGWQuotaCache::AsyncRefreshHandler, - public RGWGetBucketStats_CB { + public rgw::sal::ReadStatsCB { rgw_user user; + rgw_bucket bucket; public: BucketAsyncRefreshHandler(rgw::sal::Driver* _driver, RGWQuotaCache *_cache, - const rgw_user& _user, const rgw_bucket& _bucket) : - RGWQuotaCache::AsyncRefreshHandler(_driver, _cache), - RGWGetBucketStats_CB(_bucket), user(_user) {} + const rgw_user& _user, const rgw_bucket& _bucket) + : RGWQuotaCache::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 { @@ -377,7 +370,7 @@ int RGWBucketStatsCache::fetch_stats_from_storage(const rgw_user& _u, const rgw_ } class UserAsyncRefreshHandler : public RGWQuotaCache::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::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; }; diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index 73ba1e18fd1..38072f2c013 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -15,6 +15,9 @@ #pragma once +#include +#include + #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* 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* _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 { + 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 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 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; diff --git a/src/rgw/rgw_sal_dbstore.cc b/src/rgw/rgw_sal_dbstore.cc index 6c8778b8723..2305b217f88 100644 --- a/src/rgw/rgw_sal_dbstore.cc +++ b/src/rgw/rgw_sal_dbstore.cc @@ -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 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 ctx) { return 0; } diff --git a/src/rgw/rgw_sal_dbstore.h b/src/rgw/rgw_sal_dbstore.h index 646ee23f887..bfa424e269f 100644 --- a/src/rgw/rgw_sal_dbstore.h +++ b/src/rgw/rgw_sal_dbstore.h @@ -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 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& 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 ctx) override; int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y, RGWBucketEnt* ent) override; int check_bucket_shards(const DoutPrefixProvider *dpp, diff --git a/src/rgw/rgw_sal_filter.cc b/src/rgw/rgw_sal_filter.cc index b49c6887b62..decd648adb0 100644 --- a/src/rgw/rgw_sal_filter.cc +++ b/src/rgw/rgw_sal_filter.cc @@ -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 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 ctx) { return next->read_stats_async(dpp, idx_layout, shard_id, ctx); } diff --git a/src/rgw/rgw_sal_filter.h b/src/rgw/rgw_sal_filter.h index 239a80a6465..aebbe383714 100644 --- a/src/rgw/rgw_sal_filter.h +++ b/src/rgw/rgw_sal_filter.h @@ -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 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 ctx) override; int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y, RGWBucketEnt* ent) override; int check_bucket_shards(const DoutPrefixProvider* dpp, diff --git a/src/rgw/rgw_sal_fwd.h b/src/rgw/rgw_sal_fwd.h index 08866c2bea2..ee7c100080b 100644 --- a/src/rgw/rgw_sal_fwd.h +++ b/src/rgw/rgw_sal_fwd.h @@ -32,6 +32,9 @@ namespace rgw { namespace sal { class Zone; class LuaManager; struct RGWRoleInfo; + class DataProcessor; + class ObjectProcessor; + class ReadStatsCB; class ConfigStore; class RealmWriter; diff --git a/src/rgw/services/svc_user.h b/src/rgw/services/svc_user.h index 1cb459d31cb..f53ec49f259 100644 --- a/src/rgw/services/svc_user.h +++ b/src/rgw/services/svc_user.h @@ -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 cb) = 0; }; diff --git a/src/rgw/services/svc_user_rados.cc b/src/rgw/services/svc_user_rados.cc index 1b23dad53fb..b9dd8cd1553 100644 --- a/src/rgw/services/svc_user_rados.cc +++ b/src/rgw/services/svc_user_rados.cc @@ -927,11 +927,11 @@ int RGWSI_User_RADOS::read_stats(const DoutPrefixProvider *dpp, } class RGWGetUserStatsContext : public RGWGetUserHeader_CB { - RGWGetUserStats_CB *cb; + boost::intrusive_ptr cb; public: - explicit RGWGetUserStatsContext(RGWGetUserStats_CB * const cb) - : cb(cb) {} + explicit RGWGetUserStatsContext(boost::intrusive_ptr 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 _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; diff --git a/src/rgw/services/svc_user_rados.h b/src/rgw/services/svc_user_rados.h index 4712d1fdafd..01d8a8eb1cc 100644 --- a/src/rgw/services/svc_user_rados.h +++ b/src/rgw/services/svc_user_rados.h @@ -34,7 +34,6 @@ class RGWSI_MetaBackend_Handler; struct rgw_cache_entry_info; class RGWGetUserHeader_CB; -class RGWGetUserStats_CB; template 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 cb) override; }; diff --git a/src/test/rgw/test_rgw_lua.cc b/src/test/rgw/test_rgw_lua.cc index be9fa6aed16..dfd2767f550 100644 --- a/src/test/rgw/test_rgw_lua.cc +++ b/src/test/rgw/test_rgw_lua.cc @@ -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 cb) override { return 0; } -- 2.39.5