From 29fa9a1924f9ca272d9293ce09cdde31808659af Mon Sep 17 00:00:00 2001 From: Yehuda Sadeh Date: Thu, 30 May 2013 12:58:11 -0700 Subject: rgw: only append prefetched data if reading from head Fixes: #5209 Backport: bobtail, cuttlefish If the head object wrongfully contains data, but according to the manifest we don't read from the head, we shouldn't copy the prefetched data. Also fix the length calculation for that data. Signed-off-by: Yehuda Sadeh --- src/rgw/rgw_rados.cc | 34 +++++++++++++++++----------------- 1 file changed, 17 insertions(+), 17 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 31332b5993e..a520bafa730 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2639,31 +2639,31 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj, state->io_ctx.locator_set_key(key); + read_len = len; + if (reading_from_head) { /* only when reading from the head object do we need to do the atomic test */ r = append_atomic_test(rctx, read_obj, op, &astate); if (r < 0) goto done_ret; - } - - read_len = len; - if (astate) { - if (!ofs && astate->data.length() >= len) { - bl = astate->data; - goto done; - } + 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; + if (ofs < astate->data.length()) { + unsigned copy_len = min((uint64_t)astate->data.length() - ofs, 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; + merge_bl = true; + pbl = &read_bl; + } } } -- cgit v1.2.1