]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: add support for CEPH_OSD_OP_CREATE.
authorRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Aug 2019 14:01:49 +0000 (16:01 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Fri, 13 Sep 2019 17:35:04 +0000 (19:35 +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 bfaf406d8b22760962d0e9e45dc41e9b24e4e728..2d4f0f57970430482fcf784f6c22f33a88ac9472 100644 (file)
@@ -56,9 +56,16 @@ int cls_get_request_origin(cls_method_context_t hctx, entity_inst_t *origin)
   return 0;
 }
 
-int cls_cxx_create(cls_method_context_t hctx, bool exclusive)
+int cls_cxx_create(cls_method_context_t hctx, const bool exclusive)
 {
-  return 0;
+  OSDOp op{CEPH_OSD_OP_CREATE};
+  op.op.flags = (exclusive ? CEPH_OSD_OP_FLAG_EXCL : 0);
+  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_remove(cls_method_context_t hctx)
index f3fe175cb3b2747754a24bafb534cd86b1a1da0e..ccbbf343257e2acbc8246d3a94e7d830c5d61430 100644 (file)
@@ -368,6 +368,10 @@ OpsExecuter::do_osd_op(OSDOp& osd_op)
     return do_read_op([&osd_op] (auto& backend, const auto& os) {
       return backend.getxattr(os, osd_op);
     });
+  case CEPH_OSD_OP_CREATE:
+    return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
+      return backend.create(os, osd_op, txn);
+    });
   case CEPH_OSD_OP_WRITE:
     return do_write_op([&osd_op] (auto& backend, auto& os, auto& txn) {
       return backend.write(os, osd_op, txn);
index 7287099f03b1043f0c25c9b4e7333c9858163758..144fb7d05c81bf3017f555ddd0269170f5ace0d6 100644 (file)
@@ -350,6 +350,32 @@ seastar::future<> PGBackend::writefull(
   return seastar::now();
 }
 
+seastar::future<> PGBackend::create(
+  ObjectState& os,
+  const OSDOp& osd_op,
+  ceph::os::Transaction& txn)
+{
+  const int flags = le32_to_cpu(osd_op.op.flags);
+  if (os.exists && !os.oi.is_whiteout() && (flags & CEPH_OSD_OP_FLAG_EXCL)) {
+    // this is an exclusive create
+    throw ceph::osd::make_error(-EEXIST);
+  }
+
+  if (osd_op.indata.length()) {
+    // handle the legacy. `category` is no longer implemented.
+    try {
+      auto p = osd_op.indata.cbegin();
+      std::string category;
+      decode(category, p);
+    } catch (buffer::error&) {
+      throw ceph::osd::invalid_argument();
+    }
+  }
+  maybe_create_new_object(os, txn);
+  txn.nop();
+  return seastar::now();
+}
+
 seastar::future<> PGBackend::remove(ObjectState& os,
                                     ceph::os::Transaction& txn)
 {
index e698ebe77fcd9cfb356ac148d96b839830be6c78..837c3ed1aae22a7e7737d831f662e4108260a100 100644 (file)
@@ -50,6 +50,11 @@ public:
   seastar::future<> stat(
     const ObjectState& os,
     OSDOp& osd_op);
+
+  seastar::future<> create(
+    ObjectState& os,
+    const OSDOp& osd_op,
+    ceph::os::Transaction& trans);
   seastar::future<> remove(
     ObjectState& os,
     ceph::os::Transaction& txn);