From 3da6b0d7754d3445a2c8072bd9db0b4650d38991 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 17 Jun 2019 19:18:05 -0700 Subject: [PATCH] svc: add ctl.user->read_stats_async() and use it instead of old api Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_quota.cc | 2 +- src/rgw/rgw_rados.cc | 59 ----------------------------- src/rgw/rgw_rados.h | 3 -- src/rgw/rgw_user.cc | 7 ++++ src/rgw/rgw_user.h | 3 ++ src/rgw/services/svc_user.h | 4 ++ src/rgw/services/svc_user_rados.cc | 60 ++++++++++++++++++++++++++++++ src/rgw/services/svc_user_rados.h | 7 ++++ 8 files changed, 82 insertions(+), 63 deletions(-) diff --git a/src/rgw/rgw_quota.cc b/src/rgw/rgw_quota.cc index e78e8a095e6..c9ea52dbfb5 100644 --- a/src/rgw/rgw_quota.cc +++ b/src/rgw/rgw_quota.cc @@ -417,7 +417,7 @@ public: int UserAsyncRefreshHandler::init_fetch() { ldout(store->ctx(), 20) << "initiating async quota refresh for user=" << user << dendl; - int r = store->get_user_stats_async(user, this); + int r = store->ctl.user->read_stats_async(user, this); if (r < 0) { ldout(store->ctx(), 0) << "could not get bucket info for user=" << user << dendl; diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 52a9b5d74e0..cb8fb692476 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -7269,46 +7269,6 @@ int RGWRados::get_bucket_stats_async(RGWBucketInfo& bucket_info, int shard_id, R return r; } -class RGWGetUserStatsContext : public RGWGetUserHeader_CB { - RGWGetUserStats_CB *cb; - -public: - explicit RGWGetUserStatsContext(RGWGetUserStats_CB * const cb) - : cb(cb) {} - - void handle_response(int r, cls_user_header& header) override { - const cls_user_stats& hs = header.stats; - if (r >= 0) { - RGWStorageStats stats; - - stats.size = hs.total_bytes; - stats.size_rounded = hs.total_bytes_rounded; - stats.num_objects = hs.total_entries; - - cb->set_response(stats); - } - - cb->handle_response(r); - - cb->put(); - } -}; - -int RGWRados::get_user_stats_async(const rgw_user& user, RGWGetUserStats_CB *ctx) -{ - string user_str = user.to_str(); - - RGWGetUserStatsContext *get_ctx = new RGWGetUserStatsContext(ctx); - int r = cls_user_get_header_async(user_str, get_ctx); - if (r < 0) { - ctx->put(); - delete get_ctx; - return r; - } - - return 0; -} - int RGWRados::get_bucket_instance_info(RGWSysObjectCtx& obj_ctx, const string& meta_key, RGWBucketInfo& info, real_time *pmtime, map *pattrs, optional_yield y) { @@ -8447,25 +8407,6 @@ int RGWRados::cls_bucket_head_async(const RGWBucketInfo& bucket_info, int shard_ return r; } -int RGWRados::cls_user_get_header_async(const string& user_id, RGWGetUserHeader_CB *ctx) -{ - string buckets_obj_id; - rgw_get_buckets_obj(user_id, buckets_obj_id); - rgw_raw_obj obj(svc.zone->get_zone_params().user_uid_pool, buckets_obj_id); - - rgw_rados_ref ref; - int r = get_raw_obj_ref(obj, &ref); - if (r < 0) { - return r; - } - - r = ::cls_user_get_header_async(ref.pool.ioctx(), ref.obj.oid, ctx); - if (r < 0) - return r; - - return 0; -} - int RGWRados::check_bucket_shards(const RGWBucketInfo& bucket_info, const rgw_bucket& bucket, RGWQuotaInfo& bucket_quota) { diff --git a/src/rgw/rgw_rados.h b/src/rgw/rgw_rados.h index e90739819b8..dcb97c9a9c6 100644 --- a/src/rgw/rgw_rados.h +++ b/src/rgw/rgw_rados.h @@ -1303,7 +1303,6 @@ public: int get_bucket_stats(RGWBucketInfo& bucket_info, int shard_id, string *bucket_ver, string *master_ver, map& stats, string *max_marker, bool* syncstopped = NULL); int get_bucket_stats_async(RGWBucketInfo& bucket_info, int shard_id, RGWGetBucketStats_CB *cb); - int get_user_stats_async(const rgw_user& user, RGWGetUserStats_CB *cb); int put_bucket_instance_info(RGWBucketInfo& info, bool exclusive, ceph::real_time mtime, map *pattrs); int get_bucket_instance_info(RGWSysObjectCtx& obj_ctx, const string& meta_key, RGWBucketInfo& info, ceph::real_time *pmtime, map *pattrs, optional_yield y); @@ -1408,8 +1407,6 @@ public: int fix_head_obj_locator(const RGWBucketInfo& bucket_info, bool copy_obj, bool remove_bad, rgw_obj_key& key); int fix_tail_obj_locator(const RGWBucketInfo& bucket_info, rgw_obj_key& key, bool fix, bool *need_fix, optional_yield y); - int cls_user_get_header_async(const string& user_id, RGWGetUserHeader_CB *ctx); - int check_quota(const rgw_user& bucket_owner, rgw_bucket& bucket, RGWQuotaInfo& user_quota, RGWQuotaInfo& bucket_quota, uint64_t obj_size, bool check_size_only = false); diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 9e19ccdab2e..0b8600ea043 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -2733,6 +2733,13 @@ int RGWUserCtl::read_stats(const rgw_user& user, RGWStorageStats *stats, }); } +int RGWUserCtl::read_stats_async(const rgw_user& user, RGWGetUserStats_CB *cb) +{ + return be_handler->call([&](RGWSI_MetaBackend_Handler::Op *op) { + return svc.user->read_stats_async(op->ctx(), user, cb); + }); +} + RGWMetadataHandler *RGWUserMetaHandlerAllocator::alloc(RGWSI_User *user_svc) { return new RGWUserMetadataHandler(user_svc); } diff --git a/src/rgw/rgw_user.h b/src/rgw/rgw_user.h index a17be948239..58de7e77c14 100644 --- a/src/rgw/rgw_user.h +++ b/src/rgw/rgw_user.h @@ -33,6 +33,8 @@ 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 @@ -939,6 +941,7 @@ public: int read_stats(const rgw_user& user, RGWStorageStats *stats, ceph::real_time *last_stats_sync = nullptr, /* last time a full stats sync completed */ ceph::real_time *last_stats_update = nullptr); /* last time a stats update was done */ + int read_stats_async(const rgw_user& user, RGWGetUserStats_CB *ctx); }; class RGWUserMetaHandlerAllocator { diff --git a/src/rgw/services/svc_user.h b/src/rgw/services/svc_user.h index ac164b26f20..1407989f16b 100644 --- a/src/rgw/services/svc_user.h +++ b/src/rgw/services/svc_user.h @@ -22,6 +22,7 @@ #include "rgw/rgw_service.h" class RGWUserBuckets; +class RGWGetUserStats_CB; class RGWSI_User : public RGWServiceInstance { @@ -113,5 +114,8 @@ public: const rgw_user& user, RGWStorageStats *stats, ceph::real_time *last_stats_sync, /* last time a full stats sync completed */ ceph::real_time *last_stats_update) = 0; /* last time a stats update was done */ + + virtual int read_stats_async(RGWSI_MetaBackend::Context *ctx, + const rgw_user& user, RGWGetUserStats_CB *cb) = 0; }; diff --git a/src/rgw/services/svc_user_rados.cc b/src/rgw/services/svc_user_rados.cc index 737b3824678..d6d29b881b7 100644 --- a/src/rgw/services/svc_user_rados.cc +++ b/src/rgw/services/svc_user_rados.cc @@ -814,6 +814,25 @@ int RGWSI_User_RADOS::cls_user_get_header(const rgw_user& user, cls_user_header return rados_obj.operate(&op, &ibl, null_yield); } +int RGWSI_User_RADOS::cls_user_get_header_async(const string& user, RGWGetUserHeader_CB *cb) +{ + rgw_raw_obj obj = get_buckets_obj(user); + auto rados_obj = svc.rados->obj(obj); + int r = rados_obj.open(); + if (r < 0) { + return r; + } + + auto& ref = rados_obj.get_ref(); + + r = ::cls_user_get_header_async(ref.pool.ioctx(), ref.obj.oid, cb); + if (r < 0) { + return r; + } + + return 0; +} + int RGWSI_User_RADOS::read_stats(RGWSI_MetaBackend::Context *ctx, const rgw_user& user, RGWStorageStats *stats, ceph::real_time *last_stats_sync, @@ -843,3 +862,44 @@ int RGWSI_User_RADOS::read_stats(RGWSI_MetaBackend::Context *ctx, return 0; } +class RGWGetUserStatsContext : public RGWGetUserHeader_CB { + RGWGetUserStats_CB *cb; + +public: + explicit RGWGetUserStatsContext(RGWGetUserStats_CB * const cb) + : cb(cb) {} + + void handle_response(int r, cls_user_header& header) override { + const cls_user_stats& hs = header.stats; + if (r >= 0) { + RGWStorageStats stats; + + stats.size = hs.total_bytes; + stats.size_rounded = hs.total_bytes_rounded; + stats.num_objects = hs.total_entries; + + cb->set_response(stats); + } + + cb->handle_response(r); + + cb->put(); + } +}; + +int RGWSI_User_RADOS::read_stats_async(RGWSI_MetaBackend::Context *ctx, + const rgw_user& user, RGWGetUserStats_CB *_cb) +{ + string user_str = user.to_str(); + + RGWGetUserStatsContext *cb = new RGWGetUserStatsContext(_cb); + int r = cls_user_get_header_async(user_str, cb); + if (r < 0) { + _cb->put(); + delete cb; + return r; + } + + return 0; +} + diff --git a/src/rgw/services/svc_user_rados.h b/src/rgw/services/svc_user_rados.h index d717d707b37..393d287daab 100644 --- a/src/rgw/services/svc_user_rados.h +++ b/src/rgw/services/svc_user_rados.h @@ -34,6 +34,9 @@ struct rgw_cache_entry_info; class RGWUserBuckets; +class RGWGetUserHeader_CB; +class RGWGetUserStats_CB; + template class RGWChainedCacheImpl; @@ -88,6 +91,7 @@ class RGWSI_User_RADOS : public RGWSI_User int cls_user_reset_stats(const rgw_user& user); int cls_user_get_header(const rgw_user& user, cls_user_header *header); + int cls_user_get_header_async(const string& user, RGWGetUserHeader_CB *cb); int do_start() override; public: @@ -183,5 +187,8 @@ public: const rgw_user& user, RGWStorageStats *stats, ceph::real_time *last_stats_sync, /* last time a full stats sync completed */ ceph::real_time *last_stats_update) override; /* last time a stats update was done */ + + int read_stats_async(RGWSI_MetaBackend::Context *ctx, + const rgw_user& user, RGWGetUserStats_CB *cb) override; }; -- 2.39.5