From e197ec0312cb07d576c0bf045b803454702ccc81 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 (cherry picked from commit 47f422a4e0382d53023af6f651433011606b8625) See: http://tracker.ceph.com/issues/17556 See: https://github.com/ceph/ceph/pull/11368 Signed-off-by: Robin H. Johnson --- 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 89e531ace9495..58247b54ee3f0 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -2333,6 +2333,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()); @@ -2514,7 +2517,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) + 1; /* one extra entry for identifying truncation */ 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; @@ -2529,12 +2532,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