ceph/src/rgw/rgw_usage.cc
Danny Al-Gaaf a30017fbb9 rgw/rgw_usage.cc use empty() to check for emptiness
Use !empty() instead of 'size()' to check for emptiness for
performance reasons.

Signed-off-by: Danny Al-Gaaf <danny.al-gaaf@bisect.de>
2013-02-14 10:27:40 -08:00

141 lines
4.3 KiB
C++

#include <string>
#include <map>
#include "rgw_rados.h"
#include "rgw_usage.h"
#include "rgw_formats.h"
using namespace std;
static void dump_usage_categories_info(Formatter *formatter, const rgw_usage_log_entry& entry, map<string, bool> *categories)
{
formatter->open_array_section("categories");
map<string, rgw_usage_data>::const_iterator uiter;
for (uiter = entry.usage_map.begin(); uiter != entry.usage_map.end(); ++uiter) {
if (categories && !categories->empty() && !categories->count(uiter->first))
continue;
const rgw_usage_data& usage = uiter->second;
formatter->open_object_section("entry");
formatter->dump_string("category", uiter->first);
formatter->dump_int("bytes_sent", usage.bytes_sent);
formatter->dump_int("bytes_received", usage.bytes_received);
formatter->dump_int("ops", usage.ops);
formatter->dump_int("successful_ops", usage.successful_ops);
formatter->close_section(); // entry
}
formatter->close_section(); // categories
}
int RGWUsage::show(RGWRados *store, string& uid, uint64_t start_epoch,
uint64_t end_epoch, bool show_log_entries, bool show_log_sum,
map<string, bool> *categories,
RGWFormatterFlusher& flusher)
{
uint32_t max_entries = 1000;
bool is_truncated = true;
RGWUsageIter usage_iter;
Formatter *formatter = flusher.get_formatter();
map<rgw_user_bucket, rgw_usage_log_entry> usage;
flusher.start(0);
formatter->open_object_section("usage");
if (show_log_entries) {
formatter->open_array_section("entries");
}
string last_owner;
bool user_section_open = false;
map<string, rgw_usage_log_entry> summary_map;
while (is_truncated) {
int ret = store->read_usage(uid, start_epoch, end_epoch, max_entries,
&is_truncated, usage_iter, usage);
if (ret == -ENOENT) {
ret = 0;
is_truncated = false;
}
if (ret < 0) {
return ret;
}
map<rgw_user_bucket, rgw_usage_log_entry>::iterator iter;
for (iter = usage.begin(); iter != usage.end(); ++iter) {
const rgw_user_bucket& ub = iter->first;
const rgw_usage_log_entry& entry = iter->second;
if (show_log_entries) {
if (ub.user.compare(last_owner) != 0) {
if (user_section_open) {
formatter->close_section();
formatter->close_section();
}
formatter->open_object_section("user");
formatter->dump_string("owner", ub.user);
formatter->open_array_section("buckets");
user_section_open = true;
last_owner = ub.user;
}
formatter->open_object_section("bucket");
formatter->dump_string("bucket", ub.bucket);
utime_t ut(entry.epoch, 0);
ut.gmtime(formatter->dump_stream("time"));
formatter->dump_int("epoch", entry.epoch);
dump_usage_categories_info(formatter, entry, categories);
formatter->close_section(); // bucket
flusher.flush();
}
summary_map[ub.user].aggregate(entry, categories);
}
}
if (show_log_entries) {
if (user_section_open) {
formatter->close_section(); // buckets
formatter->close_section(); //user
}
formatter->close_section(); // entries
}
if (show_log_sum) {
formatter->open_array_section("summary");
map<string, rgw_usage_log_entry>::iterator siter;
for (siter = summary_map.begin(); siter != summary_map.end(); ++siter) {
const rgw_usage_log_entry& entry = siter->second;
formatter->open_object_section("user");
formatter->dump_string("user", siter->first);
dump_usage_categories_info(formatter, entry, categories);
rgw_usage_data total_usage;
entry.sum(total_usage, *categories);
formatter->open_object_section("total");
formatter->dump_int("bytes_sent", total_usage.bytes_sent);
formatter->dump_int("bytes_received", total_usage.bytes_received);
formatter->dump_int("ops", total_usage.ops);
formatter->dump_int("successful_ops", total_usage.successful_ops);
formatter->close_section(); // total
formatter->close_section(); // user
flusher.flush();
}
formatter->close_section(); // summary
}
formatter->close_section(); // usage
flusher.flush();
return 0;
}
int RGWUsage::trim(RGWRados *store, string& uid, uint64_t start_epoch,
uint64_t end_epoch)
{
return store->trim_usage(uid, start_epoch, end_epoch);
}