]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw: read large bucket directory correctly
authorYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 20 Jan 2012 18:46:31 +0000 (10:46 -0800)
committerYehuda Sadeh <yehuda@hq.newdream.net>
Fri, 20 Jan 2012 18:50:36 +0000 (10:50 -0800)
Issue #1955. When there wre too many buckets, we failed reading
the bucket directory.

Signed-off-by: Yehuda Sadeh <yehuda@hq.newdream.net>
src/rgw/rgw_user.cc

index 517a98b1a6bf9bde0ce1785d636f83d38b049c5d..340cd32c4aec7ddb5dd6304d544eeb6287d1b768 100644 (file)
@@ -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();