From: Radoslaw Zarzynski Date: Tue, 27 Aug 2019 14:01:49 +0000 (+0200) Subject: crimson/osd: add support for CEPH_OSD_OP_CREATE. X-Git-Tag: v15.1.0~1553^2~12 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=ce67b3a2d92ea8eeb30653c40d8ae9b489520e17;p=ceph.git crimson/osd: add support for CEPH_OSD_OP_CREATE. Signed-off-by: Radoslaw Zarzynski --- diff --git a/src/crimson/osd/objclass.cc b/src/crimson/osd/objclass.cc index bfaf406d8b22..2d4f0f579704 100644 --- a/src/crimson/osd/objclass.cc +++ b/src/crimson/osd/objclass.cc @@ -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(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) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index f3fe175cb3b2..ccbbf343257e 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -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); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 7287099f03b1..144fb7d05c81 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -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) { diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index e698ebe77fcd..837c3ed1aae2 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -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);