]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: add support for CEPH_OSD_OP_OMAPGETVALS.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 28 Aug 2019 11:41:50 +0000 (13:41 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 13 Sep 2019 20:12:31 +0000 (22:12 +0200)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/objclass.cc
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 994cc93b5efbf066d2f31a0c32c9d3ce1466084c..22690b5f7f342775ec31107a54c8fcacba824ae3 100644 (file)
@@ -297,13 +297,29 @@ int cls_cxx_map_get_keys(cls_method_context_t hctx,
 }
 
 int cls_cxx_map_get_vals(cls_method_context_t hctx,
-                         const string &start_obj,
-                         const string &filter_prefix,
-                         uint64_t max_to_get,
-                         map<string, bufferlist> *vals,
-                         bool *more)
+                         const std::string& start_obj,
+                         const std::string& filter_prefix,
+                         const uint64_t max_to_get,
+                         std::map<std::string, ceph::bufferlist> *vals,
+                         bool* const more)
 {
-  return 0;
+  OSDOp op{ CEPH_OSD_OP_OMAPGETVALS };
+  encode(start_obj, op.indata);
+  encode(max_to_get, op.indata);
+  encode(filter_prefix, op.indata);
+  try {
+    reinterpret_cast<ceph::osd::OpsExecuter*>(hctx)->do_osd_op(op).get();
+  } catch (ceph::osd::error& e) {
+    return -e.code().value();
+  }
+  try {
+    auto iter = op.outdata.cbegin();
+    decode(*vals, iter);
+    decode(*more, iter);
+  } catch (buffer::error&) {
+    return -EIO;
+  }
+  return vals->size();
 }
 
 int cls_cxx_map_read_header(cls_method_context_t hctx, bufferlist *outbl)
index 25c5c88734d858802de88287937db37bdefc4675..9db3da1cb70aa8b5e51b1b9e3a1a03f69cc1b3ce 100644 (file)
@@ -416,6 +416,10 @@ OpsExecuter::do_osd_op(OSDOp& osd_op)
     return do_read_op([&osd_op] (auto& backend, const auto& os) {
       return backend.omap_get_keys(os, osd_op);
     });
+  case CEPH_OSD_OP_OMAPGETVALS:
+    return do_read_op([&osd_op] (auto& backend, const auto& os) {
+      return backend.omap_get_vals(os, osd_op);
+    });
   case CEPH_OSD_OP_OMAPGETVALSBYKEYS:
     return do_read_op([&osd_op] (auto& backend, const auto& os) {
       return backend.omap_get_vals_by_keys(os, osd_op);
index 40d109d448ce4a4e472b48109ea96a03130434c4..211151f7739cf946bdb8760c9f696b3ec3884888 100644 (file)
@@ -566,6 +566,57 @@ seastar::future<> PGBackend::omap_get_keys(
   //ctx->delta_stats.num_rd++;
 }
 
+seastar::future<> PGBackend::omap_get_vals(
+  const ObjectState& os,
+  OSDOp& osd_op) const
+{
+  std::string start_after;
+  uint64_t max_return;
+  std::string filter_prefix;
+  try {
+    auto p = osd_op.indata.cbegin();
+    decode(start_after, p);
+    decode(max_return, p);
+    decode(filter_prefix, p);
+  } catch (buffer::error&) {
+    throw ceph::osd::invalid_argument{};
+  }
+
+  max_return = \
+    std::min(max_return, local_conf()->osd_max_omap_entries_per_request);
+
+  // TODO: truly chunk the reading
+  return maybe_get_omap_vals(store, coll, os.oi, start_after).then(
+    [=, &osd_op] (const bool done,
+                  ceph::os::FuturizedStore::omap_values_t vals) {
+      assert(done);
+      ceph::bufferlist result;
+      bool truncated = false;
+      uint32_t num = 0;
+      auto iter = filter_prefix > start_after ? vals.lower_bound(filter_prefix)
+                                              : std::begin(vals);
+      for (; iter != std::end(vals); ++iter) {
+        const auto& [key, value] = *iter;
+        if (key.substr(0, filter_prefix.size()) != filter_prefix) {
+          break;
+        } else if (num++ >= max_return ||
+            result.length() >= local_conf()->osd_max_omap_bytes_per_request) {
+          truncated = true;
+          break;
+        }
+        encode(key, result);
+        encode(value, result);
+      }
+      encode(num, osd_op.outdata);
+      osd_op.outdata.claim_append(result);
+      encode(truncated, osd_op.outdata);
+      return seastar::now();
+    });
+
+  // TODO:
+  //ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
+  //ctx->delta_stats.num_rd++;
+}
 seastar::future<> PGBackend::omap_get_vals_by_keys(
   const ObjectState& os,
   OSDOp& osd_op) const
index d5c8cbfe54b7f3b7b0634d5d83e820804a48542f..f703b51138a8f852ec66ade3be0a3edc570c763f 100644 (file)
@@ -92,6 +92,9 @@ public:
   seastar::future<> omap_get_keys(
     const ObjectState& os,
     OSDOp& osd_op) const;
+  seastar::future<> omap_get_vals(
+    const ObjectState& os,
+    OSDOp& osd_op) const;
   seastar::future<> omap_get_vals_by_keys(
     const ObjectState& os,
     OSDOp& osd_op) const;