]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
RGW Zipper - don't load stats for every bucket load 44538/head
authorDaniel Gryniewicz <dang@redhat.com>
Tue, 11 Jan 2022 15:50:00 +0000 (10:50 -0500)
committerDaniel Gryniewicz <dang@redhat.com>
Wed, 12 Jan 2022 17:47:40 +0000 (12:47 -0500)
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 <dang@redhat.com>
src/rgw/rgw_op.cc
src/rgw/rgw_sal.h
src/rgw/rgw_sal_dbstore.cc
src/rgw/rgw_sal_dbstore.h
src/rgw/rgw_sal_rados.cc
src/rgw/rgw_sal_rados.h
src/rgw/rgw_user.cc

index fcda234ab1253b495765bb3e2fea7f6d96df3a46..bc0ee9189bebd39847e2d006eab45f00567b63d3 100644 (file)
@@ -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)
index f138dea6a3137a174b5517c21fc407d717eed1f5..602c9cc8b39abd0eb28a98afb162b6fcd9b59160 100644 (file)
@@ -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,
index a81fc94685b18ce64da9bcadceddb60ed9f7e3d4..58a912e0c6327beae4dece0cbe7f01c8c4b95e9d 100644 (file)
@@ -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;
 
index 30da100d1084a9a3992bafeb1e9f35677952adce..ff1ee4ad553678c1a5b7452d4f5c5404adf8338c 100644 (file)
@@ -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<RGWObjCategory, RGWStorageStats>& stats,
index 85cf83b8f05be9a22d84c1948d5aa654e4aa74c2..8bb0f330e101cd39e4fde39ddbc4d3f4e583b7ab 100644 (file)
@@ -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;
 }
index 34ed1aeecf4ee6ea867774d66981c70294f67aa0..4343dea708324e0cff0a015060bfaa7ceaa46328 100644 (file)
@@ -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<RGWObjCategory, RGWStorageStats>& stats,
index e475a16e50d7dca7569b5c27f950d36f29372200..3db58af7e9501fc6084ede03601060ad85f0da23 100644 (file)
@@ -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;