rgw: fix rgw_tools get_obj()

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>
This commit is contained in:
Yehuda Sadeh 2012-11-29 13:39:22 -08:00
parent cb19e994f2
commit 2779325596
2 changed files with 16 additions and 12 deletions

View File

@ -268,6 +268,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();

View 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(RGWRados *rgwstore, void *ctx, rgw_bucket& bucket, string& key,
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,
NULL, NULL, NULL, NULL, NULL, NULL, &handle, &err);
if (ret < 0)
return ret;
do {
ret = rgwstore->get_obj(ctx, &handle, obj, bl, 0, request_len - 1);
ret = rgwstore->prepare_get_obj(ctx, obj, NULL, NULL, pattrs, NULL,
NULL, NULL, NULL, NULL, NULL, NULL, &handle, &err);
if (ret < 0)
goto done;
return ret;
ret = rgwstore->get_obj(ctx, &handle, obj, bl, 0, request_len - 1);
rgwstore->finish_get_obj(&handle);
if (ret < 0)
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)