From 38ab892201ce9ca95010e5f33277be2b0213e96d Mon Sep 17 00:00:00 2001 From: Sage Weil Date: Mon, 21 Nov 2016 18:37:39 -0500 Subject: [PATCH] rgw/rgw_rados: do not omap_getvals with (u64)-1 max 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 (cherry picked from commit 7cd123ec0dd5951628e4f8ddd4e044a0fbb82f2f) --- src/rgw/rgw_rados.cc | 25 +++++++++++++++++++++++-- 1 file changed, 23 insertions(+), 2 deletions(-) diff --git a/src/rgw/rgw_rados.cc b/src/rgw/rgw_rados.cc index 68d3345546105..8902557a1a5fc 100644 --- a/src/rgw/rgw_rados.cc +++ b/src/rgw/rgw_rados.cc @@ -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& m) +int RGWRados::omap_get_all(rgw_obj& obj, bufferlist& header, + std::map& 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 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) -- 2.39.5