]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: support writesame op
authorKefu Chai <kchai@redhat.com>
Wed, 19 Aug 2020 16:59:37 +0000 (00:59 +0800)
committerKefu Chai <kchai@redhat.com>
Wed, 19 Aug 2020 17:07:34 +0000 (01:07 +0800)
it is tested by TestIoctx.test_aio_writesame. so let's implement it as
well.

Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 5ad56d0c4a14149e449ec41627744565f44b267d..26aa9377e4007a55309ffbad07d09eefdf9a1b6c 100644 (file)
@@ -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);
index eb3defaacec204bf039a1837cd4752cbd3865234..7bb866011258131158c86211fb23ffe0036b47d7 100644 (file)
@@ -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,
index 39516a7f04ac9a76289b45c08aaf0838993ad7c7..5f7399d4ad7aebe6bae67e096dff80b746460daf 100644 (file)
@@ -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,