summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-10-04 10:36:41 -0700
committerYehuda Sadeh <yehuda@inktank.com>2013-10-04 10:36:41 -0700
commit10a1e9b371a02d69e617677b80ed34c264c2d2dc (patch)
treed63f16eadb61c4f89377abcf1c37ac0c1f4149fe
parent6ce762f6412d2855e8e7f328fc75bf3463ba1fae (diff)
downloadceph-10a1e9b371a02d69e617677b80ed34c264c2d2dc.tar.gz
rgw: update cache atomically
Use new lru_map::find_and_update() to update internal cache state. Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
-rw-r--r--src/rgw/rgw_quota.cc32
1 files changed, 19 insertions, 13 deletions
diff --git a/src/rgw/rgw_quota.cc b/src/rgw/rgw_quota.cc
index 569b2fa74a6..70ab0762ce6 100644
--- a/src/rgw/rgw_quota.cc
+++ b/src/rgw/rgw_quota.cc
@@ -75,22 +75,28 @@ int RGWBucketStatsCache::get_bucket_stats(rgw_bucket& bucket, RGWBucketStats& st
}
-void RGWBucketStatsCache::adjust_bucket_stats(rgw_bucket& bucket, int objs_delta, uint64_t added_bytes, uint64_t removed_bytes)
-{
- RGWQuotaBucketStats qs;
- if (!stats_map.find(bucket, qs)) {
- /* not have cached info, can't update anything */
- return;
+class RGWBucketStatsUpdate : public lru_map<rgw_bucket, RGWQuotaBucketStats>::UpdateContext {
+ int objs_delta;
+ uint64_t added_bytes;
+ uint64_t removed_bytes;
+public:
+ RGWBucketStatsUpdate(int _objs_delta, uint64_t _added_bytes, uint64_t _removed_bytes) :
+ objs_delta(_objs_delta), added_bytes(_added_bytes), removed_bytes(_removed_bytes) {}
+ void update(RGWQuotaBucketStats& entry) {
+ uint64_t rounded_kb_added = rgw_rounded_kb(added_bytes);
+ uint64_t rounded_kb_removed = rgw_rounded_kb(removed_bytes);
+
+ entry.stats.num_kb_rounded += (rounded_kb_added - rounded_kb_removed);
+ entry.stats.num_kb += (added_bytes - removed_bytes) / 1024;
+ entry.stats.num_objects += objs_delta;
}
+};
- uint64_t rounded_kb_added = rgw_rounded_kb(added_bytes);
- uint64_t rounded_kb_removed = rgw_rounded_kb(removed_bytes);
-
- qs.stats.num_kb_rounded += (rounded_kb_added - rounded_kb_removed);
- qs.stats.num_kb += (added_bytes - removed_bytes) / 1024;
- qs.stats.num_objects += objs_delta;
- stats_map.add(bucket, qs);
+void RGWBucketStatsCache::adjust_bucket_stats(rgw_bucket& bucket, int objs_delta, uint64_t added_bytes, uint64_t removed_bytes)
+{
+ RGWBucketStatsUpdate update(objs_delta, added_bytes, removed_bytes);
+ stats_map.find_and_update(bucket, NULL, &update);
}