From 6503430d1b47630b12164f46702bbb42dd7bb453 Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Wed, 28 Sep 2016 10:41:45 -0700 Subject: [PATCH] cls/rgw: bi_list() fix is_truncated returned param is_truncated was never set. Also, make sure that we don't return more entries than requested. Signed-off-by: Yehuda Sadeh --- src/cls/rgw/cls_rgw.cc | 15 ++++++++++++++- 1 file changed, 14 insertions(+), 1 deletion(-) diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index 57e09ece49d2e..b4d09da587e44 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -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; -- 2.39.5