diff options
author | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-30 12:58:11 -0700 |
---|---|---|
committer | Yehuda Sadeh <yehuda@inktank.com> | 2013-05-30 13:04:27 -0700 |
commit | 29fa9a1924f9ca272d9293ce09cdde31808659af (patch) | |
tree | f5d63c594d2bb87965f8a5df3889587f71e4f095 | |
parent | d86b9a852b57553448709c2b978ac3a8637cd63f (diff) | |
download | ceph-wip-5209.tar.gz |
rgw: only append prefetched data if reading from headwip-5209
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>
-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 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; + } } } |