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);
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;
}
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);