]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: add support for CEPH_OSD_OP_OMAPSETVALS.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Aug 2019 15:23:37 +0000 (17:23 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 13 Sep 2019 18:28:09 +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 e238b7107a89d1fba95de381d77fa79587eab1b7..a3fdb5e43d84f657eff83de763132e7a72af1736 100644 (file)
@@ -323,10 +323,17 @@ int cls_cxx_map_set_val(cls_method_context_t hctx,
 }
 
 int cls_cxx_map_set_vals(cls_method_context_t hctx,
-                         const std::map<string,
-                         bufferlist> *map)
+                         const std::map<string, ceph::bufferlist> *map)
 {
-  return 0;
+  OSDOp op{ CEPH_OSD_OP_OMAPSETVALS };
+  encode(*map, op.indata);
+
+  try {
+    reinterpret_cast<ceph::osd::OpsExecuter*>(hctx)->do_osd_op(op).get();
+    return 0;
+  } catch (ceph::osd::error& e) {
+    return -e.code().value();
+  }
 }
 
 int cls_cxx_map_clear(cls_method_context_t hctx)
index 387b521503e59cd4acb38474c82f6ca591bc1e35..d2cae201fb38fd8f5235f9f14260350b263a6b63 100644 (file)
@@ -416,6 +416,14 @@ OpsExecuter::do_osd_op(OSDOp& osd_op)
     return do_read_op([&osd_op] (auto& backend, const auto& os) {
       return backend.omap_get_vals_by_keys(os, osd_op);
     });
+  case CEPH_OSD_OP_OMAPSETVALS:
+    if (!pg.get_pool().info.supports_omap()) {
+      throw ceph::osd::operation_not_supported{};
+    }
+    return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
+      return backend.omap_set_vals(os, osd_op, txn);
+    });
+
   default:
     logger().warn("unknown op {}", ceph_osd_op_name(op.op));
     throw std::runtime_error(
index 8291fa416b64136ae2a89875ae90f357988b74c8..2d28ab9081567cf8b679fae9d47fc9595d52f7ed 100644 (file)
@@ -522,3 +522,31 @@ seastar::future<> PGBackend::omap_get_vals_by_keys(
   //ctx->delta_stats.num_rd_kb += shift_round_up(osd_op.outdata.length(), 10);
   //ctx->delta_stats.num_rd++;
 }
+
+seastar::future<> PGBackend::omap_set_vals(
+  ObjectState& os,
+  const OSDOp& osd_op,
+  ceph::os::Transaction& txn)
+{
+  maybe_create_new_object(os, txn);
+
+  ceph::bufferlist to_set_bl;
+  try {
+    auto p = osd_op.indata.cbegin();
+    decode_str_str_map_to_bl(p, &to_set_bl);
+  } catch (buffer::error&) {
+    throw ceph::osd::invalid_argument{};
+  }
+
+  txn.omap_setkeys(coll->get_cid(), ghobject_t{os.oi.soid}, to_set_bl);
+
+  // TODO:
+  //ctx->clean_regions.mark_omap_dirty();
+
+  // TODO:
+  //ctx->delta_stats.num_wr++;
+  //ctx->delta_stats.num_wr_kb += shift_round_up(to_set_bl.length(), 10);
+  os.oi.set_flag(object_info_t::FLAG_OMAP);
+  os.oi.clear_omap_digest();
+  return seastar::now();
+}
index b4553157f98a2aae091752f0176fc7e75524d5e0..9fdfb0f1b81a6c14c901435fff09589825d6fee8 100644 (file)
@@ -92,6 +92,10 @@ public:
   seastar::future<> omap_get_vals_by_keys(
     const ObjectState& os,
     OSDOp& osd_op) const;
+  seastar::future<> omap_set_vals(
+    ObjectState& os,
+    const OSDOp& osd_op,
+    ceph::os::Transaction& trans);
 
   virtual void got_rep_op_reply(const MOSDRepOpReply&) {}