const char *cat_name = rgw_obj_category_name(iter->first);
formatter->open_object_section(cat_name);
formatter->dump_int("size_kb", s.num_kb);
+ formatter->dump_int("size_kb_actual", s.num_kb_rounded);
formatter->dump_int("num_objects", s.num_objects);
formatter->close_section();
formatter->flush(cout);
{
RGWObjCategory category;
uint64_t num_kb;
+ uint64_t num_kb_rounded;
uint64_t num_objects;
};
struct RGWBucketEnt {
rgw_bucket bucket;
size_t size;
+ size_t size_rounded;
time_t mtime;
uint64_t count;
void encode(bufferlist& bl) const {
- __u8 struct_v = 3;
+ __u8 struct_v = 4;
::encode(struct_v, bl);
uint64_t s = size;
__u32 mt = mtime;
::encode(mt, bl);
::encode(count, bl);
::encode(bucket, bl);
+ s = size_rounded;
+ ::encode(s, bl);
}
void decode(bufferlist::iterator& bl) {
__u8 struct_v;
::decode(count, bl);
if (struct_v >= 3)
::decode(bucket, bl);
+ if (struct_v >= 4)
+ ::decode(s, bl);
+ size_rounded = s;
}
void clear() {
bucket.clear();
size = 0;
+ size_rounded = 0;
mtime = 0;
count = 0;
}
if (ret < 0)
goto done;
-dout(0) << __FILE__ << ":" << __LINE__ << ": ofs=" << ofs << " end=" << end << " total_len=" << total_len << dendl;
-
obj.init(s->bucket, s->object_str);
rgwstore->set_atomic(s->obj_ctx, obj);
ret = rgwstore->prepare_get_obj(s->obj_ctx, obj, &ofs, &end, &attrs, mod_ptr,
unmod_ptr, &lastmod, if_match, if_nomatch, &total_len, &s->obj_size, &handle, &s->err);
if (ret < 0)
goto done;
-dout(0) << __FILE__ << ":" << __LINE__ << ": ofs=" << ofs << " end=" << end << " total_len=" << total_len << dendl;
start = ofs;
perfcounter->inc(l_rgw_get_b, end - ofs);
while (ofs <= end) {
-dout(0) << __FILE__ << ":" << __LINE__ << ": ofs=" << ofs << " end=" << end << " total_len=" << total_len << dendl;
data = NULL;
ret = rgwstore->get_obj(s->obj_ctx, &handle, obj, &data, ofs, end);
if (ret < 0) {
for (iter = m.begin(); iter != m.end(); ++iter) {
RGWBucketEnt& bucket = iter->second;
buckets_size += bucket.size;
+ buckets_size_rounded += bucket.size_rounded;
buckets_objcount += bucket.count;
}
buckets_count = m.size();
uint32_t buckets_count;
uint64_t buckets_objcount;
uint64_t buckets_size;
+ uint64_t buckets_size_rounded;
public:
virtual void init(struct req_state *s) {
buckets_count = 0;
buckets_objcount = 0;
buckets_size = 0;
+ buckets_size_rounded = 0;
}
RGWStatAccount() {}
RGWBucketStats& s = stats[category];
struct rgw_bucket_category_stats& stats = iter->second;
s.category = (RGWObjCategory)iter->first;
- s.num_kb = ((stats.total_size_rounded + 1023) / 1024);
+ s.num_kb = ((stats.total_size + 1023) / 1024);
+ s.num_kb_rounded = ((stats.total_size_rounded + 1023) / 1024);
s.num_objects = stats.num_entries;
}
if (iter != header.stats.end()) {
struct rgw_bucket_category_stats& stats = iter->second;
ent.count = stats.num_entries;
- ent.size = stats.total_size_rounded;
+ ent.size = stats.total_size;
+ ent.size_rounded = stats.total_size_rounded;
}
}
CGI_PRINTF(s,"X-Container-Object-Count: %s\n", buf);
snprintf(buf, sizeof(buf), "%lld", (long long)bucket.size);
CGI_PRINTF(s,"X-Container-Bytes-Used: %s\n", buf);
+ snprintf(buf, sizeof(buf), "%lld", (long long)bucket.size_rounded);
+ CGI_PRINTF(s,"X-Container-Bytes-Used-Actual: %s\n", buf);
}
static void dump_account_metadata(struct req_state *s, uint32_t buckets_count,
- uint64_t buckets_object_count, uint64_t buckets_size)
+ uint64_t buckets_object_count, uint64_t buckets_size, uint64_t buckets_size_rounded)
{
char buf[32];
snprintf(buf, sizeof(buf), "%lld", (long long)buckets_count);
CGI_PRINTF(s,"X-Account-Object-Count: %s\n", buf);
snprintf(buf, sizeof(buf), "%lld", (long long)buckets_size);
CGI_PRINTF(s,"X-Account-Bytes-Used: %s\n", buf);
+ snprintf(buf, sizeof(buf), "%lld", (long long)buckets_size_rounded);
+ CGI_PRINTF(s,"X-Account-Bytes-Used-Actual: %s\n", buf);
}
void RGWStatAccount_REST_SWIFT::send_response()
{
if (ret >= 0) {
ret = STATUS_NO_CONTENT;
- dump_account_metadata(s, buckets_count, buckets_objcount, buckets_size);
+ dump_account_metadata(s, buckets_count, buckets_objcount, buckets_size, buckets_size_rounded);
}
set_req_state_err(s, ret);