]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: use prefetched buffer even when ofs != 0
authorYehuda Sadeh <yehuda@inktank.com>
Mon, 27 Aug 2012 20:52:40 +0000 (13:52 -0700)
committerYehuda Sadeh <yehuda@inktank.com>
Tue, 4 Sep 2012 21:37:25 +0000 (14:37 -0700)
Beforehand we only used the prefetched buffer if read ofs
was 0.

Signed-off-by: Yehuda Sadeh <yehuda@inktank.com>
src/rgw/rgw_rados.cc

index 9b105b87fbd3835d547ecc90b5057ecdb1717a9a..a0fe01d680390c2eea52ae98af8ee007fb1de0f6 100644 (file)
@@ -2239,7 +2239,7 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj,
   std::string oid, key;
   rgw_obj read_obj = obj;
   uint64_t read_ofs = ofs;
-  uint64_t len;
+  uint64_t len, read_len;
   RGWRadosCtx *rctx = (RGWRadosCtx *)ctx;
   RGWRadosCtx *new_ctx = NULL;
   bool reading_from_head = true;
@@ -2248,6 +2248,10 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj,
   GetObjState *state = *(GetObjState **)handle;
   RGWObjState *astate = NULL;
 
+  bool merge_bl = false;
+  bufferlist *pbl = &bl;
+  bufferlist read_bl;
+
   get_obj_bucket_and_oid_key(obj, bucket, oid, key);
 
   if (!rctx) {
@@ -2298,13 +2302,29 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj,
       goto done_ret;
   }
 
-  if (!ofs && astate && astate->data.length() >= len) {
-    bl = astate->data;
-    goto done;
+  read_len = len;
+
+  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;
+
+      merge_bl = true;
+      pbl = &read_bl;
+    }
   }
 
-  ldout(cct, 20) << "rados->read obj-ofs=" << ofs << " read_ofs=" << read_ofs << " read_len=" << len << dendl;
-  op.read(read_ofs, len, &bl, NULL);
+  ldout(cct, 20) << "rados->read obj-ofs=" << ofs << " read_ofs=" << read_ofs << " read_len=" << read_len << dendl;
+  op.read(read_ofs, read_len, pbl, NULL);
 
   r = state->io_ctx.operate(oid, &op, NULL);
   ldout(cct, 20) << "rados->read r=" << r << " bl.length=" << bl.length() << dendl;
@@ -2318,6 +2338,9 @@ int RGWRados::get_obj(void *ctx, void **handle, rgw_obj& obj,
     goto done_ret;
   }
 
+  if (merge_bl)
+    bl.append(read_bl);
+
 done:
   if (bl.length() > 0) {
     r = bl.length();