From ce67b3a2d92ea8eeb30653c40d8ae9b489520e17 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 27 Aug 2019 16:01:49 +0200 Subject: [PATCH] crimson/osd: add support for CEPH_OSD_OP_CREATE. Signed-off-by: Radoslaw Zarzynski --- src/crimson/osd/objclass.cc | 11 +++++++++-- src/crimson/osd/ops_executer.cc | 4 ++++ src/crimson/osd/pg_backend.cc | 26 ++++++++++++++++++++++++++ src/crimson/osd/pg_backend.h | 5 +++++ 4 files changed, 44 insertions(+), 2 deletions(-) diff --git a/src/crimson/osd/objclass.cc b/src/crimson/osd/objclass.cc index bfaf406d8b227..2d4f0f5797043 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 f3fe175cb3b27..ccbbf343257e2 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 7287099f03b10..144fb7d05c81b 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 e698ebe77fcd9..837c3ed1aae22 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); -- 2.39.5