]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
cls/rgw: bi_list() fix is_truncated returned param
authorYehuda Sadeh <yehuda@redhat.com>
Wed, 28 Sep 2016 17:41:45 +0000 (10:41 -0700)
committerYehuda Sadeh <yehuda@redhat.com>
Fri, 30 Sep 2016 17:16:38 +0000 (10:16 -0700)
is_truncated was never set. Also, make sure that we don't return
more entries than requested.

Signed-off-by: Yehuda Sadeh <yehuda@redhat.com>
src/cls/rgw/cls_rgw.cc

index 57e09ece49d2e866c0f879f3de76d0a817823f71..b4d09da587e44bae0aec7a301045d1784f7db8df 100644 (file)
@@ -2193,6 +2193,9 @@ static int list_plain_entries(cls_method_context_t hctx, const string& name, con
 
       entries->push_back(entry);
       count++;
+      if (count >= (int)max) {
+        return count;
+      }
       start_key = entry.idx;
     }
   } while (!keys.empty());
@@ -2374,7 +2377,7 @@ static int rgw_bi_list_op(cls_method_context_t hctx, bufferlist *in, bufferlist
 #define MAX_BI_LIST_ENTRIES 1000
   int32_t max = (op.max < MAX_BI_LIST_ENTRIES ? op.max : MAX_BI_LIST_ENTRIES);
   string start_key = op.marker;
-  int ret = list_plain_entries(hctx, op.name, op.marker, max, &op_ret.entries);
+  int ret = list_plain_entries(hctx, op.name, op.marker, max, &op_ret.entries) + 1; /* one extra entry for identifying truncation */
   if (ret < 0) {
     CLS_LOG(0, "ERROR: %s(): list_plain_entries retured ret=%d", __func__, ret);
     return ret;
@@ -2389,12 +2392,22 @@ static int rgw_bi_list_op(cls_method_context_t hctx, bufferlist *in, bufferlist
     return ret;
   }
 
+  count += ret;
+
   ret = list_olh_entries(hctx, op.name, op.marker, max - count, &op_ret.entries);
   if (ret < 0) {
     CLS_LOG(0, "ERROR: %s(): list_instance_entries retured ret=%d", __func__, ret);
     return ret;
   }
 
+  count += ret;
+
+  op_ret.is_truncated = (count >= max);
+  while (count >= max) {
+    op_ret.entries.pop_back();
+    count--;
+  }
+
   ::encode(op_ret, *out);
 
   return 0;