From ee5df9b37a0cdc7d8fda39fd15eca716002f01e6 Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Thu, 20 Aug 2020 19:40:41 +0800 Subject: [PATCH] crimson/osd: implement append op it is tested by test_rados.py:TestIoctx.test_append, so let's support this op in crimson as well. Signed-off-by: Kefu Chai --- src/crimson/osd/ops_executer.cc | 4 ++++ src/crimson/osd/pg_backend.cc | 22 ++++++++++++++++++++++ src/crimson/osd/pg_backend.h | 7 +++++++ 3 files changed, 33 insertions(+) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 26aa9377e4007..a9e27b39c8546 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -479,6 +479,10 @@ OpsExecuter::execute_op(OSDOp& osd_op) return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { return backend.writefull(os, osd_op, txn, *osd_op_params); }, true); + case CEPH_OSD_OP_APPEND: + return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { + return backend.append(os, osd_op, txn, *osd_op_params); + }, true); case CEPH_OSD_OP_TRUNCATE: return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { // FIXME: rework needed. Move this out to do_write_op(), introduce diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 6b9e353eae8ee..b87fdba6ee546 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -511,6 +511,28 @@ seastar::future<> PGBackend::writefull( return seastar::now(); } +PGBackend::append_errorator::future<> PGBackend::append( + ObjectState& os, + OSDOp& osd_op, + ceph::os::Transaction& txn, + osd_op_params_t& osd_op_params) +{ + const ceph_osd_op& op = osd_op.op; + if (op.extent.length != osd_op.indata.length()) { + return crimson::ct_error::invarg::make(); + } + maybe_create_new_object(os, txn); + if (op.extent.length) { + txn.write(coll->get_cid(), ghobject_t{os.oi.soid}, + os.oi.size /* offset */, op.extent.length, + std::move(osd_op.indata), op.flags); + os.oi.size += op.extent.length; + osd_op_params.clean_regions.mark_data_region_dirty(os.oi.size, + op.extent.length); + } + return seastar::now(); +} + PGBackend::write_ertr::future<> PGBackend::truncate( ObjectState& os, const OSDOp& osd_op, diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 5f7399d4ad7ae..b650f9095b496 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -103,6 +103,13 @@ public: const OSDOp& osd_op, ceph::os::Transaction& trans, osd_op_params_t& osd_op_params); + using append_errorator = crimson::errorator< + crimson::ct_error::invarg>; + append_errorator::future<> append( + ObjectState& os, + OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); write_ertr::future<> truncate( ObjectState& os, const OSDOp& osd_op, -- 2.39.5