From: Kefu Chai Date: Wed, 19 Aug 2020 16:59:37 +0000 (+0800) Subject: crimson/osd: support writesame op X-Git-Tag: v16.1.0~1388^2~1 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=6f7d1a435c1e80ee7ad6a9fca898d686255cc206;p=ceph.git crimson/osd: support writesame op it is tested by TestIoctx.test_aio_writesame. so let's implement it as well. Signed-off-by: Kefu Chai --- diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 5ad56d0c4a14..26aa9377e400 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -471,6 +471,10 @@ OpsExecuter::execute_op(OSDOp& osd_op) return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { return backend.write(os, osd_op, txn, *osd_op_params); }, true); + case CEPH_OSD_OP_WRITESAME: + return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { + return backend.write_same(os, osd_op, txn, *osd_op_params); + }, true); case CEPH_OSD_OP_WRITEFULL: return do_write_op([this, &osd_op] (auto& backend, auto& os, auto& txn) { return backend.writefull(os, osd_op, txn, *osd_op_params); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index eb3defaacec2..7bb866011258 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -455,6 +455,34 @@ seastar::future<> PGBackend::write( return seastar::now(); } +seastar::future<> PGBackend::write_same( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& txn, + osd_op_params_t& osd_op_params) +{ + const ceph_osd_op& op = osd_op.op; + const uint64_t len = op.writesame.length; + if (len == 0) { + return seastar::now(); + } + if (op.writesame.data_length == 0 || + len % op.writesame.data_length != 0 || + op.writesame.data_length != osd_op.indata.length()) { + throw crimson::osd::invalid_argument(); + } + ceph::bufferlist repeated_indata; + for (uint64_t size; size < len; size += op.writesame.data_length) { + repeated_indata.append(osd_op.indata); + } + maybe_create_new_object(os, txn); + txn.write(coll->get_cid(), ghobject_t{os.oi.soid}, + op.writesame.offset, op.writesame.length, + std::move(repeated_indata), op.flags); + osd_op_params.clean_regions.mark_data_region_dirty(op.writesame.offset, len); + return seastar::now(); +} + seastar::future<> PGBackend::writefull( ObjectState& os, const OSDOp& osd_op, diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 39516a7f04ac..5f7399d4ad7a 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -93,6 +93,11 @@ public: const OSDOp& osd_op, ceph::os::Transaction& trans, osd_op_params_t& osd_op_params); + seastar::future<> write_same( + ObjectState& os, + const OSDOp& osd_op, + ceph::os::Transaction& trans, + osd_op_params_t& osd_op_params); seastar::future<> writefull( ObjectState& os, const OSDOp& osd_op,