]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: only append prefetched data if reading from head
authorYehuda Sadeh <yehuda@inktank.com>
Thu, 30 May 2013 19:58:11 +0000 (12:58 -0700)
committerGreg Farnum <greg@inktank.com>
Fri, 31 May 2013 17:10:51 +0000 (10:10 -0700)
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>
src/rgw/rgw_rados.cc

index 12ed006c0cc7eeac5ccfb0bcbc3c2ced48ff3b69..b22217994bacaac730868df00302a80913b1b0c9 100644 (file)
@@ -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;
+      }
     }
   }