]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: iterate usage entries from correct entry
authorYehuda Sadeh <yehuda@inktank.com>
Thu, 23 May 2013 04:34:52 +0000 (21:34 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Thu, 23 May 2013 20:12:26 +0000 (13:12 -0700)
Fixes: #5152
When iterating through usage entries, and when user id was
provided, we started at the user's first entry and not from
the entry indexed by the request start time.
This commit fixes the issue.

Backport: bobtail

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
(cherry picked from commit 8b3a04dec8be13559716667d4b16cde9e9543feb)

src/cls/rgw/cls_rgw.cc

index ae9e19b84bcffcfba86a81aa913225c92b339f67..6cc6539d101e2db4b85d980cbe3f751d1cf73b6d 100644 (file)
@@ -586,6 +586,13 @@ static void usage_record_prefix_by_time(uint64_t epoch, string& key)
   key = buf;
 }
 
+static void usage_record_prefix_by_user(string& user, uint64_t epoch, string& key)
+{
+  char buf[user.size() + 32];
+  snprintf(buf, sizeof(buf), "%s_%011llu_", user.c_str(), (long long unsigned)epoch);
+  key = buf;
+}
+
 static void usage_record_name_by_time(uint64_t epoch, string& user, string& bucket, string& key)
 {
   char buf[32 + user.size() + bucket.size()];
@@ -695,7 +702,7 @@ static int usage_iterate_range(cls_method_context_t hctx, uint64_t start, uint64
 
   if (key_iter.empty()) {
     if (by_user) {
-      start_key = user;
+      usage_record_prefix_by_user(user, start, start_key);
     } else {
       usage_record_prefix_by_time(start, start_key);
     }
@@ -704,6 +711,7 @@ static int usage_iterate_range(cls_method_context_t hctx, uint64_t start, uint64
   }
 
   do {
+    CLS_LOG(20, "usage_iterate_range start_key=%s", start_key.c_str());
     int ret = cls_cxx_map_get_vals(hctx, start_key, filter_prefix, NUM_KEYS, &keys);
     if (ret < 0)
       return ret;
@@ -717,11 +725,15 @@ static int usage_iterate_range(cls_method_context_t hctx, uint64_t start, uint64
       const string& key = iter->first;
       rgw_usage_log_entry e;
 
-      if (!by_user && key.compare(end_key) >= 0)
+      if (!by_user && key.compare(end_key) >= 0) {
+        CLS_LOG(20, "usage_iterate_range reached key=%s, done", key.c_str());
         return 0;
+      }
 
-      if (by_user && key.compare(0, user_key.size(), user_key) != 0)
+      if (by_user && key.compare(0, user_key.size(), user_key) != 0) {
+        CLS_LOG(20, "usage_iterate_range reached key=%s, done", key.c_str());
         return 0;
+      }
 
       ret = usage_record_decode(iter->second, e);
       if (ret < 0)
@@ -741,6 +753,7 @@ static int usage_iterate_range(cls_method_context_t hctx, uint64_t start, uint64
 
       i++;
       if (max_entries && (i > max_entries)) {
+        CLS_LOG(20, "usage_iterate_range reached max_entries (%d), done", max_entries);
         *truncated = true;
         key_iter = key;
         return 0;