]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: handle negative quota as non-assigned values
authorYehuda Sadeh <yehuda@inktank.com>
Wed, 2 Oct 2013 23:29:23 +0000 (16:29 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Wed, 2 Oct 2013 23:29:23 +0000 (16:29 -0700)
This means that we can have a 0 as a quota value.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_quota.cc
src/rgw/rgw_quota.h

index 8dfd52f6cb8eab20503e650a2d1d61a76d9e7e0b..569b2fa74a62464936874813219e2835e43b0ae7 100644 (file)
@@ -95,9 +95,10 @@ void RGWBucketStatsCache::adjust_bucket_stats(rgw_bucket& bucket, int objs_delta
 
 
 class RGWQuotaHandlerImpl : public RGWQuotaHandler {
+  RGWRados *store;
   RGWBucketStatsCache stats_cache;
 public:
-  RGWQuotaHandlerImpl(RGWRados *store) : stats_cache(store) {}
+  RGWQuotaHandlerImpl(RGWRados *_store) : store(_store), stats_cache(_store) {}
   virtual int check_quota(rgw_bucket& bucket, RGWQuotaInfo& bucket_quota,
                          uint64_t num_objs, uint64_t size) {
     uint64_t size_kb = rgw_rounded_kb(size);
@@ -111,12 +112,20 @@ public:
     if (ret < 0)
       return ret;
 
-    if (bucket_quota.max_objects &&
-        stats.num_objects + num_objs > bucket_quota.max_objects) {
+    ldout(store->ctx(), 20) << "bucket quota: max_objects=" << bucket_quota.max_objects
+                            << " max_size_kb=" << bucket_quota.max_size_kb << dendl;
+
+    if (bucket_quota.max_objects >= 0 &&
+        stats.num_objects + num_objs > (uint64_t)bucket_quota.max_objects) {
+      ldout(store->ctx(), 10) << "quota exceeded: stats.num_objects=" << stats.num_objects
+                              << " bucket_quota.max_objects=" << bucket_quota.max_objects << dendl;
+
       return -ERR_QUOTA_EXCEEDED;
     }
-    if (bucket_quota.max_size_kb &&
-               stats.num_kb_rounded + size_kb > bucket_quota.max_size_kb) {
+    if (bucket_quota.max_size_kb >= 0 &&
+               stats.num_kb_rounded + size_kb > (uint64_t)bucket_quota.max_size_kb) {
+      ldout(store->ctx(), 10) << "quota exceeded: stats.num_kb_rounded=" << stats.num_kb_rounded << " size_kb=" << size_kb
+                              << " bucket_quota.max_size_kb=" << bucket_quota.max_size_kb << dendl;
       return -ERR_QUOTA_EXCEEDED;
     }
 
index 8b0404795b8172d3adea257e72e3dafe88a3efad..39cfc62de5579937309d42ff27d975c5ca9ea817 100644 (file)
@@ -9,11 +9,11 @@ class RGWRados;
 class JSONObj;
 
 struct RGWQuotaInfo {
-  uint64_t max_size_kb;
-  uint64_t max_objects;
+  int64_t max_size_kb;
+  int64_t max_objects;
   bool enabled;
 
-  RGWQuotaInfo() : max_size_kb(0), max_objects(0), enabled(false) {}
+  RGWQuotaInfo() : max_size_kb(-1), max_objects(-1), enabled(false) {}
 
   void encode(bufferlist& bl) const {
     ENCODE_START(1, 1, bl);