From: Sage Weil Date: Thu, 17 Nov 2016 22:45:53 +0000 (-0600) Subject: osd/ReplicatedPG: limit omap request by bytes X-Git-Tag: v11.1.0~195^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=41d46e4921c6cb7fc792c9c1eb3da51f0554b163;p=ceph.git osd/ReplicatedPG: limit omap request by bytes Signed-off-by: Sage Weil --- diff --git a/src/common/config_opts.h b/src/common/config_opts.h index d8936bfde4a1..448b401290c7 100644 --- a/src/common/config_opts.h +++ b/src/common/config_opts.h @@ -930,6 +930,7 @@ OPTION(osd_max_attr_name_len, OPT_U32, 100) // max rados attr name len; canno OPTION(osd_max_attr_size, OPT_U64, 0) OPTION(osd_max_omap_entries_per_request, OPT_U64, 131072) +OPTION(osd_max_omap_bytes_per_request, OPT_U64, 4<<20) OPTION(osd_objectstore, OPT_STR, "filestore") // ObjectStore backend type OPTION(osd_objectstore_tracing, OPT_BOOL, false) // true if LTTng-UST tracepoints should be enabled diff --git a/src/osd/ReplicatedPG.cc b/src/osd/ReplicatedPG.cc index 7a0c351bf6da..0586f8a79e5c 100644 --- a/src/osd/ReplicatedPG.cc +++ b/src/osd/ReplicatedPG.cc @@ -5826,21 +5826,25 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) max_return = g_conf->osd_max_omap_entries_per_request; } tracepoint(osd, do_osd_op_pre_omapgetkeys, soid.oid.name.c_str(), soid.snap.val, start_after.c_str(), max_return); - set out_set; + bufferlist bl; + uint32_t num = 0; if (oi.is_omap()) { ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator( coll, ghobject_t(soid) ); assert(iter); iter->upper_bound(start_after); - for (uint64_t i = 0; - i < max_return && iter->valid(); - ++i, iter->next(false)) { - out_set.insert(iter->key()); + for (num = 0; + num < max_return && + bl.length() < g_conf->osd_max_omap_bytes_per_request && + iter->valid(); + ++num, iter->next(false)) { + ::encode(iter->key(), bl); } } // else return empty out_set - ::encode(out_set, osd_op.outdata); + ::encode(num, osd_op.outdata); + osd_op.outdata.claim_append(bl); ctx->delta_stats.num_rd_kb += SHIFT_ROUND_UP(osd_op.outdata.length(), 10); ctx->delta_stats.num_rd++; } @@ -5866,8 +5870,9 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) max_return = g_conf->osd_max_omap_entries_per_request; } tracepoint(osd, do_osd_op_pre_omapgetvals, soid.oid.name.c_str(), soid.snap.val, start_after.c_str(), max_return, filter_prefix.c_str()); - map out_set; + uint32_t num = 0; + bufferlist bl; if (oi.is_omap()) { ObjectMap::ObjectMapIterator iter = osd->store->get_omap_iterator( coll, ghobject_t(soid) @@ -5878,15 +5883,19 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector& ops) } iter->upper_bound(start_after); if (filter_prefix > start_after) iter->lower_bound(filter_prefix); - for (uint64_t i = 0; - i < max_return && iter->valid() && + for (num = 0; + num < max_return && + bl.length() < g_conf->osd_max_omap_bytes_per_request && + iter->valid() && iter->key().substr(0, filter_prefix.size()) == filter_prefix; - ++i, iter->next(false)) { + ++num, iter->next(false)) { dout(20) << "Found key " << iter->key() << dendl; - out_set.insert(make_pair(iter->key(), iter->value())); + ::encode(iter->key(), bl); + ::encode(iter->value(), bl); } } // else return empty out_set - ::encode(out_set, osd_op.outdata); + ::encode(num, osd_op.outdata); + osd_op.outdata.claim_append(bl); ctx->delta_stats.num_rd_kb += SHIFT_ROUND_UP(osd_op.outdata.length(), 10); ctx->delta_stats.num_rd++; }