]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: remove Bucket::update_container_stats()
authorCasey Bodley <cbodley@redhat.com>
Mon, 20 Mar 2023 22:40:05 +0000 (18:40 -0400)
committerCasey Bodley <cbodley@redhat.com>
Thu, 21 Sep 2023 17:37:16 +0000 (13:37 -0400)
callers use Bucket::read_stats() to load bucket stats

Signed-off-by: Casey Bodley <cbodley@redhat.com>
19 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/rgw_file_int.h
src/rgw/rgw_op.cc
src/rgw/rgw_op.h
src/rgw/rgw_rest_swift.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

index 862eb86315cfd81bbc90865befc3a614d7190cde..e25977c1068ef951134868b13aba34923de2a525 100644 (file)
@@ -509,10 +509,6 @@ int DaosBucket::sync_user_stats(const DoutPrefixProvider* dpp,
   return DAOS_NOT_IMPLEMENTED_LOG(dpp);
 }
 
-int DaosBucket::update_container_stats(const DoutPrefixProvider* dpp) {
-  return DAOS_NOT_IMPLEMENTED_LOG(dpp);
-}
-
 int DaosBucket::check_bucket_shards(const DoutPrefixProvider* dpp) {
   return DAOS_NOT_IMPLEMENTED_LOG(dpp);
 }
index 3a8f34ce91c9a4a11bfe0f3066ee3354c0befd31..e27cc02cb6c86cd59b7ea5cd1fd7a25822ea1147 100644 (file)
@@ -314,7 +314,6 @@ class DaosBucket : public StoreBucket {
                                RGWGetBucketStats_CB* ctx) override;
   virtual int sync_user_stats(const DoutPrefixProvider* dpp,
                               optional_yield y) override;
-  virtual int update_container_stats(const DoutPrefixProvider* dpp) override;
   virtual int check_bucket_shards(const DoutPrefixProvider* dpp) override;
   virtual int chown(const DoutPrefixProvider* dpp, User& new_user,
                     optional_yield y) override;
index b951d0080e4decb2776c52e4810e902f249fdc16..bd0fce07ff722eb0696fac1ea8457d9705e38488 100644 (file)
@@ -830,11 +830,6 @@ int MotrBucket::sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y)
   return 0;
 }
 
-int MotrBucket::update_container_stats(const DoutPrefixProvider *dpp)
-{
-  return 0;
-}
-
 int MotrBucket::check_bucket_shards(const DoutPrefixProvider *dpp)
 {
   return 0;
index a14f8e30f8ba6b8b6d6593adf10eb88bba246eb4..79a22cc7d828065fb67e874b90c0483ccbff495e 100644 (file)
@@ -374,7 +374,6 @@ class MotrBucket : public StoreBucket {
                                  const bucket_index_layout_generation& idx_layout,
                                  int shard_id, RGWGetBucketStats_CB* ctx) override;
     virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
-    virtual int update_container_stats(const DoutPrefixProvider *dpp) override;
     virtual int check_bucket_shards(const DoutPrefixProvider *dpp) override;
     virtual int chown(const DoutPrefixProvider *dpp, User& new_user, optional_yield y) override;
     virtual int put_info(const DoutPrefixProvider *dpp, bool exclusive, ceph::real_time mtime) override;
index 036d02cf58dcd7cccc2d4333f15c8616a2f5acc4..bb7617e8b9b401669b1f349e68542f0df99ae58d 100644 (file)
@@ -1049,46 +1049,17 @@ int POSIXBucket::read_stats(const DoutPrefixProvider *dpp,
                            std::map<RGWObjCategory, RGWStorageStats>& stats,
                            std::string* max_marker, bool* syncstopped)
 {
-  return 0;
-}
-
-int POSIXBucket::read_stats_async(const DoutPrefixProvider *dpp,
-                                 const bucket_index_layout_generation& idx_layout,
-                                 int shard_id, RGWGetBucketStats_CB* ctx)
-{
-  return 0;
-}
-
-int POSIXBucket::sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y)
-{
-  return 0;
-}
-
-int POSIXBucket::update_container_stats(const DoutPrefixProvider* dpp, optional_yield y)
-{
-  /* Force re-stat */
-  stat_done = false;
-  int ret = stat(dpp);
-  if (ret < 0) {
-    return ret;
-  }
-
-  bucket_statx_save(stx, ent, mtime);
-  info.creation_time = ent.creation_time;
-  ent.count = 0;
-  ent.size = 0;
-
-  // TODO dang: store size/count in attributes
-  ret = for_each(dpp, [this, &dpp](const char* name) {
-    int ret;
-    struct statx lstx;
+  auto& main = stats[RGWObjCategory::Main];
 
+  // TODO: bucket stats shouldn't have to list all objects
+  return for_each(dpp, [this, dpp, &main] (const char* name) {
     if (name[0] == '.') {
       /* Skip dotfiles */
       return 0;
     }
 
-    ret = statx(dir_fd, name, AT_SYMLINK_NOFOLLOW, STATX_ALL, &lstx);
+    struct statx lstx;
+    int ret = statx(dir_fd, name, AT_SYMLINK_NOFOLLOW, STATX_ALL, &lstx);
     if (ret < 0) {
       ret = errno;
       ldpp_dout(dpp, 0) << "ERROR: could not stat object " << name << ": "
@@ -1097,13 +1068,25 @@ int POSIXBucket::update_container_stats(const DoutPrefixProvider* dpp, optional_
     }
 
     if (S_ISREG(lstx.stx_mode) || S_ISDIR(lstx.stx_mode)) {
-      ent.count++;
-      ent.size += lstx.stx_size;
+      main.num_objects++;
+      main.size += lstx.stx_size;
+      main.size_rounded += lstx.stx_size;
+      main.size_utilized += lstx.stx_size;
     }
 
     return 0;
   });
+}
 
+int POSIXBucket::read_stats_async(const DoutPrefixProvider *dpp,
+                                 const bucket_index_layout_generation& idx_layout,
+                                 int shard_id, RGWGetBucketStats_CB* ctx)
+{
+  return 0;
+}
+
+int POSIXBucket::sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y)
+{
   return 0;
 }
 
@@ -1199,14 +1182,9 @@ int POSIXBucket::check_quota(const DoutPrefixProvider *dpp, RGWQuota& quota, uin
 
 int POSIXBucket::try_refresh_info(const DoutPrefixProvider* dpp, ceph::real_time* pmtime, optional_yield y)
 {
-  int ret = update_container_stats(dpp, y);
-  if (ret < 0) {
-    return ret;
-  }
-
   *pmtime = mtime;
 
-  ret = open(dpp);
+  int ret = open(dpp);
   if (ret < 0) {
     return ret;
   }
index bd1285c3551a8bf142409080fe4b3f4ae524aef9..34f415bb18fe08467f044f55fa3debcb5a3a6901 100644 (file)
@@ -224,7 +224,6 @@ public:
                               const bucket_index_layout_generation& idx_layout,
                               int shard_id, RGWGetBucketStats_CB* ctx) override;
   virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
-  virtual int update_container_stats(const DoutPrefixProvider* dpp, optional_yield y) override;
   virtual int check_bucket_shards(const DoutPrefixProvider* dpp, optional_yield y) override;
   virtual int chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) override;
   virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive,
index 207ab44380a4d4dd724865306da46cf498744b1a..bd505e3b0bdae8a46d697c90ee5e103d954663c3 100644 (file)
@@ -8602,48 +8602,6 @@ int RGWRados::put_linked_bucket_info(RGWBucketInfo& info, bool exclusive, real_t
   return 0;
 }
 
-int RGWRados::update_containers_stats(map<string, RGWBucketEnt>& m, const DoutPrefixProvider *dpp, optional_yield y)
-{
-  map<string, RGWBucketEnt>::iterator iter;
-  for (iter = m.begin(); iter != m.end(); ++iter) {
-    RGWBucketEnt& ent = iter->second;
-    rgw_bucket& bucket = ent.bucket;
-    ent.count = 0;
-    ent.size = 0;
-    ent.size_rounded = 0;
-
-    vector<rgw_bucket_dir_header> headers;
-
-    RGWBucketInfo bucket_info;
-    int ret = get_bucket_instance_info(bucket, bucket_info, NULL, NULL, y, dpp);
-    if (ret < 0) {
-      return ret;
-    }
-
-    int r = cls_bucket_head(dpp, bucket_info, bucket_info.layout.current_index, RGW_NO_SHARD, headers);
-    if (r < 0)
-      return r;
-
-    auto hiter = headers.begin();
-    for (; hiter != headers.end(); ++hiter) {
-      RGWObjCategory category = main_category;
-      auto iter = (hiter->stats).find(category);
-      if (iter != hiter->stats.end()) {
-        struct rgw_bucket_category_stats& stats = iter->second;
-        ent.count += stats.num_entries;
-        ent.size += stats.total_size;
-        ent.size_rounded += stats.total_size_rounded;
-      }
-    }
-
-    // fill in placement_rule from the bucket instance for use in swift's
-    // per-storage policy statistics
-    ent.placement_rule = std::move(bucket_info.placement_rule);
-  }
-
-  return m.size();
-}
-
 int RGWRados::append_async(const DoutPrefixProvider *dpp, rgw_raw_obj& obj, size_t size, bufferlist& bl)
 {
   rgw_rados_ref ref;
index 95ee0374db535dcca78ecb186ff0f92f412d81f1..23b69a8259f896bcd8b41840e8d49d4349409dfd 100644 (file)
@@ -1376,7 +1376,6 @@ public:
   void gen_rand_obj_instance_name(rgw_obj_key *target_key);
   void gen_rand_obj_instance_name(rgw_obj *target);
 
-  int update_containers_stats(std::map<std::string, RGWBucketEnt>& m, const DoutPrefixProvider *dpp, optional_yield y);
   int append_async(const DoutPrefixProvider *dpp, rgw_raw_obj& obj, size_t size, bufferlist& bl);
 
 public:
index ebac3bb8cf9ba474edb5125fcc066b9ff7f3c9f2..8eafadc905c3dc0f3cab464980afcc99119769ab 100644 (file)
@@ -690,34 +690,6 @@ int RadosBucket::sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y
   return store->ctl()->bucket->sync_user_stats(dpp, owner->get_id(), info, y, &ent);
 }
 
-int RadosBucket::update_container_stats(const DoutPrefixProvider* dpp, optional_yield y)
-{
-  int ret;
-  map<std::string, RGWBucketEnt> m;
-
-  m[info.bucket.name] = ent;
-  ret = store->getRados()->update_containers_stats(m, dpp, y);
-  if (!ret)
-    return -EEXIST;
-  if (ret < 0)
-    return ret;
-
-  map<std::string, RGWBucketEnt>::iterator iter = m.find(info.bucket.name);
-  if (iter == m.end())
-    return -EINVAL;
-
-  ent.count = iter->second.count;
-  ent.size = iter->second.size;
-  ent.size_rounded = iter->second.size_rounded;
-  ent.creation_time = iter->second.creation_time;
-  ent.placement_rule = std::move(iter->second.placement_rule);
-
-  info.creation_time = ent.creation_time;
-  info.placement_rule = ent.placement_rule;
-
-  return 0;
-}
-
 int RadosBucket::check_bucket_shards(const DoutPrefixProvider* dpp, optional_yield y)
 {
       return store->getRados()->check_bucket_shards(info, info.bucket, get_count(), dpp, y);
index c84a18ee45f3de1e175e10b61bebf9ba5f16260b..750460460e75fab15f23b219383345d04343bebb 100644 (file)
@@ -567,7 +567,6 @@ class RadosBucket : public StoreBucket {
                                  const bucket_index_layout_generation& idx_layout,
                                  int shard_id, RGWGetBucketStats_CB* ctx) override;
     virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
-    virtual int update_container_stats(const DoutPrefixProvider* dpp, optional_yield y) override;
     virtual int check_bucket_shards(const DoutPrefixProvider* dpp, optional_yield y) override;
     virtual int chown(const DoutPrefixProvider* dpp, User& new_user, optional_yield y) override;
     virtual int put_info(const DoutPrefixProvider* dpp, bool exclusive, ceph::real_time mtime, optional_yield y) override;
index 65ec3dd15d3395347636773899da1b4901f5be89..6f71f754ebe488e9b8729ef25ccc07a61ea3daa3 100644 (file)
@@ -2352,10 +2352,10 @@ public:
 
   void send_response() override {
     bucket->get_creation_time() = get_state()->bucket->get_info().creation_time;
-    bs.size = bucket->get_size();
-    bs.size_rounded = bucket->get_size_rounded();
+    bs.size = stats.size;
+    bs.size_rounded = stats.size_rounded;
     bs.creation_time = bucket->get_creation_time();
-    bs.num_entries = bucket->get_count();
+    bs.num_entries = stats.num_objects;
     std::swap(attrs, get_state()->bucket_attrs);
   }
 
index 5de07969deb21add62a1b6bed0019011db8576e7..585c37f3ab535168c4c4dac18921b83876576655 100644 (file)
@@ -2955,6 +2955,22 @@ void RGWStatBucket::pre_exec()
   rgw_bucket_object_pre_exec(s);
 }
 
+// read the bucket's stats for RGWObjCategory::Main
+static int load_bucket_stats(const DoutPrefixProvider* dpp, optional_yield y,
+                             rgw::sal::Bucket& bucket, RGWStorageStats& stats)
+{
+  const auto& index = bucket.get_info().layout.current_index;
+  std::string bver, mver; // ignored
+  std::map<RGWObjCategory, RGWStorageStats> categories;
+
+  int r = bucket.read_stats(dpp, index, -1, &bver, &mver, categories);
+  if (r < 0) {
+    return r;
+  }
+  stats = categories[RGWObjCategory::Main];
+  return 0;
+}
+
 void RGWStatBucket::execute(optional_yield y)
 {
   if (!s->bucket_exists) {
@@ -2966,7 +2982,8 @@ void RGWStatBucket::execute(optional_yield y)
   if (op_ret) {
     return;
   }
-  op_ret = bucket->update_container_stats(s, y);
+
+  op_ret = load_bucket_stats(this, y, *s->bucket, stats);
 }
 
 int RGWListBucket::verify_permission(optional_yield y)
@@ -3029,7 +3046,10 @@ void RGWListBucket::execute(optional_yield y)
   }
 
   if (need_container_stats()) {
-    op_ret = s->bucket->update_container_stats(s, y);
+    stats.emplace();
+    if (int ret = load_bucket_stats(this, y, *s->bucket, *stats); ret < 0) {
+      stats = std::nullopt; // just don't return stats
+    }
   }
 
   rgw::sal::Bucket::ListParams params;
index 63d5f673ac1dd9567a7a924cd948947edabc81d2..0dcdd456d7d97c398d79c0f455fd9d1ccc738293 100644 (file)
@@ -910,23 +910,21 @@ protected:
   std::string max_keys;
   std::string delimiter;
   std::string encoding_type;
-  bool list_versions;
-  int max;
+  bool list_versions{false};
+  int max{0};
   std::vector<rgw_bucket_dir_entry> objs;
   std::map<std::string, bool> common_prefixes;
+  std::optional<RGWStorageStats> stats; // initialized if need_container_stats()
 
-  int default_max;
-  bool is_truncated;
-  bool allow_unordered;
+  int default_max{0};
+  bool is_truncated{false};
+  bool allow_unordered{false};
 
-  int shard_id;
+  int shard_id{-1};
 
   int parse_max_keys();
 
 public:
-  RGWListBucket() : list_versions(false), max(0),
-                    default_max(0), is_truncated(false),
-                   allow_unordered(false), shard_id(-1) {}
   int verify_permission(optional_yield y) override;
   void pre_exec() override;
   void execute(optional_yield y) override;
@@ -1063,6 +1061,7 @@ public:
 class RGWStatBucket : public RGWOp {
 protected:
   std::unique_ptr<rgw::sal::Bucket> bucket;
+  RGWStorageStats stats;
 
 public:
   int verify_permission(optional_yield y) override;
index ba2099f38ad2d76f59b3e0a8e170f3bfa4703192..ff04b98a9934f4606a5e202de0d7686250df327a 100644 (file)
@@ -353,6 +353,7 @@ int RGWListBucket_ObjStore_SWIFT::get_params(optional_yield y)
 
 static void dump_container_metadata(req_state *,
                                     const rgw::sal::Bucket*,
+                                    const std::optional<RGWStorageStats>& stats,
                                     const RGWQuotaInfo&,
                                     const RGWBucketWebsiteConf&);
 
@@ -362,7 +363,7 @@ void RGWListBucket_ObjStore_SWIFT::send_response()
   map<string, bool>::iterator pref_iter = common_prefixes.begin();
 
   dump_start(s);
-  dump_container_metadata(s, s->bucket.get(), quota.bucket_quota,
+  dump_container_metadata(s, s->bucket.get(), stats, quota.bucket_quota,
                           s->bucket->get_info().website_conf);
 
   s->formatter->open_array_section_with_attrs("container",
@@ -463,15 +464,18 @@ next:
 
 static void dump_container_metadata(req_state *s,
                                     const rgw::sal::Bucket* bucket,
+                                    const std::optional<RGWStorageStats>& stats,
                                     const RGWQuotaInfo& quota,
                                     const RGWBucketWebsiteConf& ws_conf)
 {
   /* Adding X-Timestamp to keep align with Swift API */
   dump_header(s, "X-Timestamp", utime_t(s->bucket->get_info().creation_time));
 
-  dump_header(s, "X-Container-Object-Count", bucket->get_count());
-  dump_header(s, "X-Container-Bytes-Used", bucket->get_size());
-  dump_header(s, "X-Container-Bytes-Used-Actual", bucket->get_size_rounded());
+  if (stats) {
+    dump_header(s, "X-Container-Object-Count", stats->num_objects);
+    dump_header(s, "X-Container-Bytes-Used", stats->size);
+    dump_header(s, "X-Container-Bytes-Used-Actual", stats->size_rounded);
+  }
 
   if (rgw::sal::Object::empty(s->object.get())) {
     auto swift_policy = \
@@ -586,7 +590,7 @@ void RGWStatBucket_ObjStore_SWIFT::send_response()
 {
   if (op_ret >= 0) {
     op_ret = STATUS_NO_CONTENT;
-    dump_container_metadata(s, bucket.get(), quota.bucket_quota,
+    dump_container_metadata(s, bucket.get(), stats, quota.bucket_quota,
                             s->bucket->get_info().website_conf);
   }
 
@@ -2509,7 +2513,7 @@ RGWOp* RGWSwiftWebsiteHandler::get_ws_listing_op()
       /* Generate the header now. */
       set_req_state_err(s, op_ret);
       dump_errno(s);
-      dump_container_metadata(s, s->bucket.get(), quota.bucket_quota,
+      dump_container_metadata(s, s->bucket.get(), stats, quota.bucket_quota,
                               s->bucket->get_info().website_conf);
       end_header(s, this, "text/html");
       if (op_ret < 0) {
index 253d36cb3b28c3237fcb75d0673ab1de7b018592..6754324ea7e4451a6c16e7df4facf336aa7e3931 100644 (file)
@@ -23,6 +23,7 @@
 #include "rgw_datalog_notify.h"
 #include "include/random.h"
 
+struct RGWBucketEnt;
 class RGWRESTMgr;
 class RGWAccessListFilter;
 class RGWLC;
@@ -676,8 +677,6 @@ class Bucket {
                                 int shard_id, RGWGetBucketStats_CB* ctx) = 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) = 0;
-    /** Refresh the metadata stats (size, count, and so on) from the backing store */
-    virtual int update_container_stats(const DoutPrefixProvider* dpp, optional_yield y) = 0;
     /** Check if this bucket needs resharding, and schedule it if it does */
     virtual int check_bucket_shards(const DoutPrefixProvider* dpp, optional_yield y) = 0;
     /** Change the owner of this bucket in the backing store.  Current owner must be set.  Does not
index 143830fda51a4a82c2a1afa316d98dfff81f39af..2465b03e58681a29e414f1153d136f844a2023e7 100644 (file)
@@ -311,11 +311,6 @@ namespace rgw::sal {
     return 0;
   }
 
-  int DBBucket::update_container_stats(const DoutPrefixProvider *dpp, optional_yield y)
-  {
-    return 0;
-  }
-
   int DBBucket::check_bucket_shards(const DoutPrefixProvider *dpp, optional_yield y)
   {
     return 0;
index a6e140380e5cb2944ef4b79e4d04c6809e471e07..274dd6e032f47843d7c3efa7ae43ddd8e58e66e4 100644 (file)
@@ -200,7 +200,6 @@ protected:
           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 sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
-      virtual int update_container_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
       virtual int check_bucket_shards(const DoutPrefixProvider *dpp, optional_yield y) override;
       virtual int chown(const DoutPrefixProvider *dpp, User& new_user, optional_yield y) override;
       virtual int put_info(const DoutPrefixProvider *dpp, bool exclusive, ceph::real_time mtime, optional_yield y) override;
index 923f9990a28dea620ee3cdd82c9e801f74f783fd..7860477400387f36a6dd43f8712739b2d4aaf1ff 100644 (file)
@@ -711,11 +711,6 @@ int FilterBucket::sync_user_stats(const DoutPrefixProvider *dpp, optional_yield
   return next->sync_user_stats(dpp, y);
 }
 
-int FilterBucket::update_container_stats(const DoutPrefixProvider* dpp, optional_yield y)
-{
-  return next->update_container_stats(dpp, y);
-}
-
 int FilterBucket::check_bucket_shards(const DoutPrefixProvider* dpp, optional_yield y)
 {
   return next->check_bucket_shards(dpp, y);
index 9776cd5c228d0f32bb6099730969a5a20f41b8ac..3076d7d30d88e5a8397e6e9fd942b4a725b5e421 100644 (file)
@@ -436,7 +436,6 @@ public:
                               const bucket_index_layout_generation& idx_layout,
                               int shard_id, RGWGetBucketStats_CB* ctx) override;
   virtual int sync_user_stats(const DoutPrefixProvider *dpp, optional_yield y) override;
-  virtual int update_container_stats(const DoutPrefixProvider* dpp, optional_yield y) override;
   virtual int check_bucket_shards(const DoutPrefixProvider* dpp, optional_yield y) override;
   virtual int chown(const DoutPrefixProvider* dpp, User& new_user,
                    optional_yield y) override;