From: Daniel Gryniewicz Date: Tue, 11 Jan 2022 15:50:00 +0000 (-0500) Subject: RGW Zipper - don't load stats for every bucket load X-Git-Tag: v17.1.0~71^2 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=661cda66d728ec7dbf542d494d693c57564aee44;p=ceph.git RGW Zipper - don't load stats for every bucket load This was a side-effect of consolidating the Zipper API, and resulted in a large performance hit. Stats are only needed if they are requested, so don't load them every time. Signed-off-by: Daniel Gryniewicz --- diff --git a/src/rgw/rgw_op.cc b/src/rgw/rgw_op.cc index fcda234ab12..bc0ee9189be 100644 --- a/src/rgw/rgw_op.cc +++ b/src/rgw/rgw_op.cc @@ -2838,6 +2838,7 @@ void RGWStatBucket::execute(optional_yield y) if (op_ret) { return; } + op_ret = bucket->update_container_stats(s); } int RGWListBucket::verify_permission(optional_yield y) diff --git a/src/rgw/rgw_sal.h b/src/rgw/rgw_sal.h index f138dea6a31..602c9cc8b39 100644 --- a/src/rgw/rgw_sal.h +++ b/src/rgw/rgw_sal.h @@ -644,8 +644,9 @@ class Bucket { owner = _owner; } - /** Load this bucket from the backing store. Requires the key to be set, fills other fields */ - virtual int load_bucket(const DoutPrefixProvider* dpp, optional_yield y) = 0; + /** Load this bucket from the backing store. Requires the key to be set, fills other fields. + * If @a get_stats is true, then statistics on the bucket are also looked up. */ + virtual int load_bucket(const DoutPrefixProvider* dpp, optional_yield y, bool get_stats = false) = 0; /** Read the bucket stats from the backing Store, synchronous */ virtual int read_stats(const DoutPrefixProvider *dpp, int shard_id, std::string* bucket_ver, std::string* master_ver, diff --git a/src/rgw/rgw_sal_dbstore.cc b/src/rgw/rgw_sal_dbstore.cc index a81fc94685b..58a912e0c63 100644 --- a/src/rgw/rgw_sal_dbstore.cc +++ b/src/rgw/rgw_sal_dbstore.cc @@ -240,7 +240,7 @@ namespace rgw::sal { return 0; } - int DBBucket::load_bucket(const DoutPrefixProvider *dpp, optional_yield y) + int DBBucket::load_bucket(const DoutPrefixProvider *dpp, optional_yield y, bool get_stats) { int ret = 0; diff --git a/src/rgw/rgw_sal_dbstore.h b/src/rgw/rgw_sal_dbstore.h index 30da100d108..ff1ee4ad553 100644 --- a/src/rgw/rgw_sal_dbstore.h +++ b/src/rgw/rgw_sal_dbstore.h @@ -185,7 +185,7 @@ protected: DoutPrefixProvider *dpp) override; virtual RGWAccessControlPolicy& get_acl(void) override { return acls; } virtual int set_acl(const DoutPrefixProvider *dpp, RGWAccessControlPolicy& acl, optional_yield y) override; - virtual int load_bucket(const DoutPrefixProvider *dpp, optional_yield y) override; + virtual int load_bucket(const DoutPrefixProvider *dpp, optional_yield y, bool get_stats = false) override; virtual int read_stats(const DoutPrefixProvider *dpp, int shard_id, std::string *bucket_ver, std::string *master_ver, std::map& stats, diff --git a/src/rgw/rgw_sal_rados.cc b/src/rgw/rgw_sal_rados.cc index 85cf83b8f05..8bb0f330e10 100644 --- a/src/rgw/rgw_sal_rados.cc +++ b/src/rgw/rgw_sal_rados.cc @@ -567,7 +567,7 @@ int RadosBucket::remove_bucket_bypass_gc(int concurrent_max, bool return ret; } -int RadosBucket::load_bucket(const DoutPrefixProvider* dpp, optional_yield y) +int RadosBucket::load_bucket(const DoutPrefixProvider* dpp, optional_yield y, bool get_stats) { auto obj_ctx = store->svc()->sysobj->init_obj_ctx(); int ret; @@ -594,7 +594,9 @@ int RadosBucket::load_bucket(const DoutPrefixProvider* dpp, optional_yield y) bucket_version = ep_ot.read_version; - ret = store->ctl()->bucket->read_bucket_stats(info.bucket, &ent, y, dpp); + if (get_stats) { + ret = store->ctl()->bucket->read_bucket_stats(info.bucket, &ent, y, dpp); + } return ret; } diff --git a/src/rgw/rgw_sal_rados.h b/src/rgw/rgw_sal_rados.h index 34ed1aeecf4..4343dea7083 100644 --- a/src/rgw/rgw_sal_rados.h +++ b/src/rgw/rgw_sal_rados.h @@ -289,7 +289,7 @@ class RadosBucket : public Bucket { DoutPrefixProvider *dpp) override; virtual RGWAccessControlPolicy& get_acl(void) override { return acls; } virtual int set_acl(const DoutPrefixProvider* dpp, RGWAccessControlPolicy& acl, optional_yield y) override; - virtual int load_bucket(const DoutPrefixProvider* dpp, optional_yield y) override; + virtual int load_bucket(const DoutPrefixProvider* dpp, optional_yield y, bool get_stats = false) override; virtual int read_stats(const DoutPrefixProvider *dpp, int shard_id, std::string* bucket_ver, std::string* master_ver, std::map& stats, diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index e475a16e50d..3db58af7e95 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -118,7 +118,7 @@ int rgw_user_get_all_buckets_stats(const DoutPrefixProvider *dpp, marker = i.first; auto& bucket_ent = i.second; - ret = bucket_ent->load_bucket(dpp, y); + ret = bucket_ent->load_bucket(dpp, y, true /* load user stats */); if (ret < 0) { ldpp_dout(dpp, 0) << "ERROR: could not get bucket stats: ret=" << ret << dendl; return ret;