From: Yehuda Sadeh Date: Fri, 20 Jan 2012 18:46:31 +0000 (-0800) Subject: rgw: read large bucket directory correctly X-Git-Tag: v0.41~25 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=a52762ac4237437f565c60bb444cc299ce26efb8;p=ceph.git rgw: read large bucket directory correctly Issue #1955. When there wre too many buckets, we failed reading the bucket directory. Signed-off-by: Yehuda Sadeh --- diff --git a/src/rgw/rgw_user.cc b/src/rgw/rgw_user.cc index 517a98b1a6bf..340cd32c4aec 100644 --- a/src/rgw/rgw_user.cc +++ b/src/rgw/rgw_user.cc @@ -219,10 +219,12 @@ int rgw_read_user_buckets(string user_id, RGWUserBuckets& buckets, bool need_sta bufferlist bl; #define LARGE_ENOUGH_LEN (4096 * 1024) size_t len = LARGE_ENOUGH_LEN; + off_t ofs = 0; rgw_obj obj(ui_uid_bucket, buckets_obj_id); do { - ret = rgwstore->read(NULL, obj, 0, len, bl); + bufferlist more; + ret = rgwstore->read(NULL, obj, ofs, len, more); if (ret == -ENOENT) { /* try to read the old format */ ret = rgw_read_buckets_from_attr(user_id, buckets); @@ -237,10 +239,14 @@ int rgw_read_user_buckets(string user_id, RGWUserBuckets& buckets, bool need_sta if (ret < 0) return ret; - if ((size_t)ret != len) + size_t read_len = more.length(); + + bl.claim_append(more); + + if (read_len != len) break; - len *= 2; + ofs += len; } while (1); bufferlist::iterator p = bl.begin();