From fd76083d3a3fac8e726172f97b969e9029718d7a Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Mon, 27 Aug 2012 13:52:40 -0700 Subject: [PATCH] rgw: use prefetched buffer even when ofs != 0 Beforehand we only used the prefetched buffer if read ofs was 0. Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_rados.cc | 35 +++++++++++++++++++++++++++++------ 1 file changed, 29 insertions(+), 6 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 9b105b87fbd38..a0fe01d680390 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2239,7 +2239,7 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj, std::string oid, key; rgw_obj read_obj = obj; uint64_t read_ofs = ofs; - uint64_t len; + uint64_t len, read_len; RGWRadosCtx *rctx = (RGWRadosCtx *)ctx; RGWRadosCtx *new_ctx = NULL; bool reading_from_head = true; @@ -2248,6 +2248,10 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj, GetObjState *state = *(GetObjState **)handle; RGWObjState *astate = NULL; + bool merge_bl = false; + bufferlist *pbl = &bl; + bufferlist read_bl; + get_obj_bucket_and_oid_key(obj, bucket, oid, key); if (!rctx) { @@ -2298,13 +2302,29 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj, goto done_ret; } - if (!ofs && astate && astate->data.length() >= len) { - bl = astate->data; - goto done; + read_len = len; + + if (astate) { + if (!ofs && astate->data.length() >= len) { + bl = astate->data; + goto done; + } + + if (ofs < astate->data.length()) { + unsigned copy_len = min((uint64_t)astate->data.length(), len); + astate->data.copy(ofs, copy_len, bl); + read_len -= copy_len; + read_ofs += copy_len; + if (!read_len) + goto done; + + merge_bl = true; + pbl = &read_bl; + } } - ldout(cct, 20) << "rados->read obj-ofs=" << ofs << " read_ofs=" << read_ofs << " read_len=" << len << dendl; - op.read(read_ofs, len, &bl, NULL); + ldout(cct, 20) << "rados->read obj-ofs=" << ofs << " read_ofs=" << read_ofs << " read_len=" << read_len << dendl; + op.read(read_ofs, read_len, pbl, NULL); r = state->io_ctx.operate(oid, &op, NULL); ldout(cct, 20) << "rados->read r=" << r << " bl.length=" << bl.length() << dendl; @@ -2318,6 +2338,9 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj, goto done_ret; } + if (merge_bl) + bl.append(read_bl); + done: if (bl.length() > 0) { r = bl.length(); -- 2.39.5