diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-30 12:58:11 -0700 |
---|---|---|
committer | Greg Farnum <greg@inktank.com> | 2013-05-31 10:35:18 -0700 |
commit | 8c6a912ae46c4d3aeb7c1000d221f67e158ec5c8 (patch) | |
tree | 75ffea447f65e2aacf58119cfb6e093f10490aa5 | |
parent | f42e84ee3148dcc59a05c8a12ce39996eb854e26 (diff) | |
download | ceph-8c6a912ae46c4d3aeb7c1000d221f67e158ec5c8.tar.gz |
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 <yehuda@inktank.com>
Reviewed-by: Greg Farnum <greg@inktank.com>
(cherry picked from commit c5fc52ae0fc851444226abd54a202af227d7cf17)
-rw-r--r-- | src/rgw/rgw_rados.cc | 34 |
1 files changed, 17 insertions, 17 deletions
diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 27f996ccdf5..1fed42f5dd5 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -2640,31 +2640,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; + } } } |