]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: add support for CEPH_OSD_OP_OMAPGETVALSBYKEYS.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Aug 2019 14:43:14 +0000 (16:43 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 13 Sep 2019 18:28:08 +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 2d4f0f57970430482fcf784f6c22f33a88ac9472..e238b7107a89d1fba95de381d77fa79587eab1b7 100644 (file)
@@ -290,7 +290,29 @@ int cls_cxx_map_get_val(cls_method_context_t hctx,
                         const string &key,
                         bufferlist *outbl)
 {
-  return 0;
+  OSDOp op{ CEPH_OSD_OP_OMAPGETVALSBYKEYS };
+  {
+    std::set<std::string> k{key};
+    encode(k, op.indata);
+  }
+  try {
+    reinterpret_cast<ceph::osd::OpsExecuter*>(hctx)->do_osd_op(op).get();
+  } catch (ceph::osd::error& e) {
+    return -e.code().value();
+  }
+  std::map<std::string, ceph::bufferlist> m;
+  try {
+    auto iter = op.outdata.cbegin();
+    decode(m, iter);
+  } catch (buffer::error&) {
+    return -EIO;
+  }
+  if (auto iter = std::begin(m); iter != std::end(m)) {
+    *outbl = std::move(iter->second);
+    return 0;
+  } else {
+    return -ENOENT;
+  }
 }
 
 int cls_cxx_map_set_val(cls_method_context_t hctx,
index ccbbf343257e2acbc8246d3a94e7d830c5d61430..387b521503e59cd4acb38474c82f6ca591bc1e35 100644 (file)
@@ -410,6 +410,12 @@ OpsExecuter::do_osd_op(OSDOp& osd_op)
     // @dzafman this isn't possible yet. Maybe it could be accomplished
     // before crimson's readiness and we'd luckily don't need to carry.
     return dont_do_legacy_op();
+
+  // OMAP
+  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);
+    });
   default:
     logger().warn("unknown op {}", ceph_osd_op_name(op.op));
     throw std::runtime_error(
index 144fb7d05c81bf3017f555ddd0269170f5ace0d6..8291fa416b64136ae2a89875ae90f357988b74c8 100644 (file)
@@ -484,3 +484,41 @@ seastar::future<ceph::bufferptr> PGBackend::getxattr(
 {
   return store->get_attr(coll, ghobject_t{soid}, key);
 }
+
+static seastar::future<ceph::os::FuturizedStore::omap_values_t>
+maybe_get_omap_vals_by_keys(
+  auto& store,
+  const auto& coll,
+  const auto& oi,
+  const auto& keys_to_get)
+{
+  if (oi.is_omap()) {
+    return store->omap_get_values(coll, ghobject_t{oi.soid}, keys_to_get);
+  } else {
+    return seastar::make_ready_future<ceph::os::FuturizedStore::omap_values_t>(
+      ceph::os::FuturizedStore::omap_values_t{});
+  }
+}
+
+seastar::future<> PGBackend::omap_get_vals_by_keys(
+  const ObjectState& os,
+  OSDOp& osd_op) const
+{
+  std::set<std::string> keys_to_get;
+  try {
+    auto p = osd_op.indata.cbegin();
+    decode(keys_to_get, p);
+  } catch (buffer::error&) {
+    throw ceph::osd::invalid_argument();
+  }
+
+  return maybe_get_omap_vals_by_keys(store, coll, os.oi, keys_to_get).then(
+    [&osd_op] (ceph::os::FuturizedStore::omap_values_t vals) {
+      encode(vals, 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++;
+}
index 837c3ed1aae22a7e7737d831f662e4108260a100..b4553157f98a2aae091752f0176fc7e75524d5e0 100644 (file)
@@ -88,6 +88,11 @@ public:
     const hobject_t& soid,
     std::string_view key) const;
 
+  // OMAP
+  seastar::future<> omap_get_vals_by_keys(
+    const ObjectState& os,
+    OSDOp& osd_op) const;
+
   virtual void got_rep_op_reply(const MOSDRepOpReply&) {}
 
 protected: