]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
rgw/rgw_rados: do not omap_getvals with (u64)-1 max
authorSage Weil <sage@redhat.com>
Mon, 21 Nov 2016 23:37:39 +0000 (18:37 -0500)
committerNathan Cutler <ncutler@suse.com>
Fri, 9 Dec 2016 14:20:38 +0000 (15:20 +0100)
Fixes: http://tracker.ceph.com/issues/17985
This will make the OSD fall over if the object is big
and the OSD doesn't impose it's own fail-safe limit.

Signed-off-by: Sage Weil <sage@redhat.com>
(cherry picked from commit 7cd123ec0dd5951628e4f8ddd4e044a0fbb82f2f)

src/rgw/rgw_rados.cc

index 68d3345546105ac8f7fd7ca013d5133a311d4c59..8902557a1a5fcb07388c5d2955e83acad859750c 100644 (file)
@@ -7608,11 +7608,32 @@ int RGWRados::omap_get_vals(rgw_obj& obj, bufferlist& header, const string& mark
  
 }
 
-int RGWRados::omap_get_all(rgw_obj& obj, bufferlist& header, std::map<string, bufferlist>& m)
+int RGWRados::omap_get_all(rgw_obj& obj, bufferlist& header,
+                          std::map<string, bufferlist>& m)
 {
+  rgw_rados_ref ref;
+  rgw_bucket bucket;
+  int r = get_obj_ref(obj, &ref, &bucket);
+  if (r < 0) {
+    return r;
+  }
+
+  const int count = 1024;  // ?
   string start_after;
 
-  return omap_get_vals(obj, header, start_after, (uint64_t)-1, m);
+  while (true) {
+    std::map<string, bufferlist> t;
+    r = ref.ioctx.omap_get_vals(ref.oid, start_after, count, &m);
+    if (r < 0) {
+      return r;
+    }
+    if (t.empty()) {
+      break;
+    }
+    start_after = t.rbegin()->first;
+    m.insert(t.begin(), t.end());
+  }
+  return 0;
 }
 
 int RGWRados::omap_set(rgw_obj& obj, std::string& key, bufferlist& bl)