From: Yehuda Sadeh Date: Thu, 30 May 2013 19:58:11 +0000 (-0700) Subject: rgw: only append prefetched data if reading from head X-Git-Tag: v0.64~28 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=c5fc52ae0fc851444226abd54a202af227d7cf17;p=ceph.git 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 Reviewed-by: Greg Farnum --- diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 12ed006c0cc7..b22217994bac 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2693,31 +2693,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; + } } }