summaryrefslogtreecommitdiff
diff options
context:
space:
mode:
authorYehuda Sadeh <yehuda@inktank.com>2013-05-30 12:58:11 -0700
committerGreg Farnum <greg@inktank.com>2013-05-31 10:35:18 -0700
commit8c6a912ae46c4d3aeb7c1000d221f67e158ec5c8 (patch)
tree75ffea447f65e2aacf58119cfb6e093f10490aa5
parentf42e84ee3148dcc59a05c8a12ce39996eb854e26 (diff)
downloadceph-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.cc34
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;
+ }
}
}