]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: add support for CEPH_OSD_OP_OMAPGETKEYS.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Aug 2019 19:33:30 +0000 (21:33 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 13 Sep 2019 18:28:10 +0000 (20:28 +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 417d69135a84fcdf45b7cdcddeb4c69087d22804..994cc93b5efbf066d2f31a0c32c9d3ce1466084c 100644 (file)
@@ -273,12 +273,27 @@ int cls_cxx_map_get_all_vals(cls_method_context_t hctx,
 }
 
 int cls_cxx_map_get_keys(cls_method_context_t hctx,
-                         const string &start_obj,
-                        uint64_t max_to_get,
-                         set<string> *keys,
-                         bool *more)
-{
-  return 0;
+                         const std::string& start_obj,
+                         const uint64_t max_to_get,
+                         std::set<std::string>* const keys,
+                         bool* const more)
+{
+  OSDOp op{ CEPH_OSD_OP_OMAPGETKEYS };
+  encode(start_obj, op.indata);
+  encode(max_to_get, 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(*keys, iter);
+    decode(*more, iter);
+  } catch (buffer::error&) {
+    return -EIO;
+  }
+  return keys->size();
 }
 
 int cls_cxx_map_get_vals(cls_method_context_t hctx,
index d2cae201fb38fd8f5235f9f14260350b263a6b63..25c5c88734d858802de88287937db37bdefc4675 100644 (file)
@@ -412,6 +412,10 @@ OpsExecuter::do_osd_op(OSDOp& osd_op)
     return dont_do_legacy_op();
 
   // OMAP
+  case CEPH_OSD_OP_OMAPGETKEYS:
+    return do_read_op([&osd_op] (auto& backend, const auto& os) {
+      return backend.omap_get_keys(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 1308c2b7415970e9ac4d917b707d7399655af2fc..b0af08417973a3b12096fb6ab236503aedfd2337 100644 (file)
@@ -505,6 +505,62 @@ maybe_get_omap_vals_by_keys(
   }
 }
 
+static seastar::future<bool, ceph::os::FuturizedStore::omap_values_t>
+maybe_get_omap_vals(
+  auto& store,
+  const auto& coll,
+  const auto& oi,
+  const auto& start_after)
+{
+  if (oi.is_omap()) {
+    return store->omap_get_values(coll, ghobject_t{oi.soid}, start_after);
+  } else {
+    return seastar::make_ready_future<bool, ceph::os::FuturizedStore::omap_values_t>(
+      true, ceph::os::FuturizedStore::omap_values_t{});
+  }
+}
+
+seastar::future<> PGBackend::omap_get_keys(
+  const ObjectState& os,
+  OSDOp& osd_op) const
+{
+  std::string start_after;
+  uint64_t max_return;
+  try {
+    auto p = osd_op.indata.cbegin();
+    decode(start_after, p);
+    decode(max_return, 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] (bool, ceph::os::FuturizedStore::omap_values_t vals) {
+      ceph::bufferlist result;
+      bool truncated = false;
+      uint32_t num = 0;
+      for (auto& [key, val] : vals) {
+        if (num++ >= max_return ||
+            result.length() >= local_conf()->osd_max_omap_bytes_per_request) {
+          truncated = true;
+          break;
+        }
+        encode(key, 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 9fdfb0f1b81a6c14c901435fff09589825d6fee8..d5c8cbfe54b7f3b7b0634d5d83e820804a48542f 100644 (file)
@@ -89,6 +89,9 @@ public:
     std::string_view key) const;
 
   // OMAP
+  seastar::future<> omap_get_keys(
+    const ObjectState& os,
+    OSDOp& osd_op) const;
   seastar::future<> omap_get_vals_by_keys(
     const ObjectState& os,
     OSDOp& osd_op) const;