]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: fix rgw_tools get_obj()
authorYehuda Sadeh <yehuda@inktank.com>
Thu, 29 Nov 2012 21:39:22 +0000 (13:39 -0800)
committerYehuda Sadeh <yehuda@inktank.com>
Tue, 4 Dec 2012 00:02:33 +0000 (16:02 -0800)
The original implementation broke whenever data exceeded
the chunk size. Also don't keep cache for objects that
exceed the chunk size as cache is not designed for
it. Increased chunk size to 512k.

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

index 1cc319b1fa3f8ab0eb8a1c3bd2998a8585fb2522..71f139c15414076b6dd42463d0a238b5d924210e 100644 (file)
@@ -262,6 +262,11 @@ int RGWCache<T>::get_obj(void *ctx, void **handle, rgw_obj& obj, bufferlist& obl
     return r;
   }
 
+  if (obl.length() == end + 1) {
+    /* in this case, most likely object contains more data, we can't cache it */
+    return r;
+  }
+
   bufferptr p(r);
   bufferlist& bl = info.data;
   bl.clear();
index 3b8264058fb1c2125a7fb6396d3671b78db80620..14f984bcf361f994b2971d301d3eb7888fa9f167 100644 (file)
@@ -10,7 +10,7 @@
 
 #define dout_subsys ceph_subsys_rgw
 
-#define READ_CHUNK_LEN (16 * 1024)
+#define READ_CHUNK_LEN (512 * 1024)
 
 static map<string, string> ext_mime_map;
 
@@ -41,25 +41,24 @@ int rgw_get_obj(void *ctx, rgw_bucket& bucket, string& key, bufferlist& bl, map<
   bufferlist::iterator iter;
   int request_len = READ_CHUNK_LEN;
   rgw_obj obj(bucket, key);
-  ret = rgwstore->prepare_get_obj(ctx, obj, NULL, NULL, pattrs, NULL,
+  do {
+    ret = rgwstore->prepare_get_obj(ctx, obj, NULL, NULL, pattrs, NULL,
                                   NULL, NULL, NULL, NULL, NULL, NULL, &handle, &err);
-  if (ret < 0)
-    return ret;
+    if (ret < 0)
+      return ret;
 
-  do {
     ret = rgwstore->get_obj(ctx, &handle, obj, bl, 0, request_len - 1);
+    rgwstore->finish_get_obj(&handle);
     if (ret < 0)
-      goto done;
+      return ret;
+
     if (ret < request_len)
       break;
     bl.clear();
     request_len *= 2;
   } while (true);
 
-  ret = 0;
-done:
-  rgwstore->finish_get_obj(&handle);
-  return ret;
+  return 0;
 }
 
 void parse_mime_map_line(const char *start, const char *end)