]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson: implement CEPH_OSD_OP_NOTIFY.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Wed, 27 Nov 2019 21:47:47 +0000 (22:47 +0100)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Thu, 13 Feb 2020 23:11:38 +0000 (00:11 +0100)
Signed-off-by: Radoslaw Zarzynski <rzarzyns@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/ops_executer.h

index 7d7cc400453ee1a480e6b0856bdf853e78bd5dc3..b3dfbe294d355daa293e2227f752124fc0f6e53f 100644 (file)
@@ -263,6 +263,40 @@ OpsExecuter::watch_errorator::future<> OpsExecuter::do_op_watch(
   return crimson::ct_error::invarg::make();
 }
 
+OpsExecuter::watch_errorator::future<> OpsExecuter::do_op_notify(
+  OSDOp& osd_op,
+  const ObjectState& os)
+{
+  if (!os.exists) {
+    return crimson::ct_error::enoent::make();
+  }
+  return with_effect_on_obc(notify_info_t{},
+    [&] (auto& ctx) {
+      try {
+        auto bp = osd_op.indata.cbegin();
+        uint32_t ver; // obsolete
+        ceph::decode(ver, bp);
+        ceph::decode(ctx.timeout, bp);
+        ceph::decode(ctx.bl, bp);
+      } catch (const buffer::error&) {
+        ctx.timeout = 0;
+      }
+      if (!ctx.timeout) {
+        using crimson::common::local_conf;
+        ctx.timeout = local_conf()->osd_default_notify_timeout;
+      }
+      // FIXME
+      ctx.notify_id = 42; //osd->get_next_id(get_osdmap_epoch());
+      ctx.cookie = osd_op.op.notify.cookie;
+      // return our unique notify id to the client
+      ceph::encode(ctx.notify_id, osd_op.outdata);
+      return seastar::now();
+    },
+    [] (auto&& ctx, ObjectContextRef obc) {
+      return seastar::now();
+  });
+}
+
 static inline std::unique_ptr<const PGLSFilter> get_pgls_filter(
   const std::string& type,
   bufferlist::const_iterator& iter)
@@ -598,6 +632,10 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op)
     return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) {
       return do_op_watch(osd_op, os, txn);
     });
+  case CEPH_OSD_OP_NOTIFY:
+    return do_read_op([this, &osd_op] (auto&, const auto& os) {
+      return do_op_notify(osd_op, os);
+    });
 
   default:
     logger().warn("unknown op {}", ceph_osd_op_name(op.op));
index 8f286262550fad80683b4771ef092633c2d4861d..617db0ac42739c61cf96019fe9b6a47fd0ca40cc 100644 (file)
@@ -120,6 +120,9 @@ private:
     class OSDOp& osd_op,
     class ObjectState& os,
     ceph::os::Transaction& txn);
+  watch_errorator::future<> do_op_notify(
+    class OSDOp& osd_op,
+    const class ObjectState& os);
 
   hobject_t &get_target() const {
     return obc->obs.oi.soid;