From: Yehuda Sadeh Date: Wed, 28 Sep 2016 17:41:45 +0000 (-0700) Subject: cls/rgw: bi_list() fix is_truncated returned param X-Git-Tag: v11.1.0~548^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=47f422a4e0382d53023af6f651433011606b8625;p=ceph.git 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 --- diff --git a/src/cls/rgw/cls_rgw.cc b/src/cls/rgw/cls_rgw.cc index 3da8a4436818..063476754479 100644 --- a/src/cls/rgw/cls_rgw.cc +++ b/src/cls/rgw/cls_rgw.cc @@ -2334,6 +2334,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()); @@ -2515,7 +2518,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; @@ -2530,12 +2533,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;