]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
osd/ReplicatedPG: limit omap request by bytes
authorSage Weil <sage@redhat.com>
Thu, 17 Nov 2016 22:45:53 +0000 (16:45 -0600)
committerSage Weil <sage@redhat.com>
Thu, 17 Nov 2016 23:00:37 +0000 (17:00 -0600)
Signed-off-by: Sage Weil <sage@redhat.com>
src/common/config_opts.h
src/osd/ReplicatedPG.cc

index d8936bfde4a16a8cf284a58c975bca3fb337535f..448b401290c78b641d6da9b5003ba6c26ab0cd54 100644 (file)
@@ -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
index 7a0c351bf6da64680ab32a60f210abe9c421b54a..0586f8a79e5cd38cc4366ead81ed95c46ceab6fe 100644 (file)
@@ -5826,21 +5826,25 @@ int ReplicatedPG::do_osd_ops(OpContext *ctx, vector<OSDOp>& 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<string> 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<OSDOp>& 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<string, bufferlist> 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<OSDOp>& 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++;
       }