]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: implement append op
authorKefu Chai <kchai@redhat.com>
Thu, 20 Aug 2020 11:40:41 +0000 (19:40 +0800)
committerKefu Chai <kchai@redhat.com>
Mon, 24 Aug 2020 09:49:41 +0000 (17:49 +0800)
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 <kchai@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 26aa9377e4007a55309ffbad07d09eefdf9a1b6c..a9e27b39c8546ea95cff21940ea4ca2bd4b9103d 100644 (file)
@@ -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
index 6b9e353eae8ee018d4e267110406d04a56cfc75e..b87fdba6ee54644fb751f01bc8b206f8981b8d09 100644 (file)
@@ -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,
index 5f7399d4ad7aebe6bae67e096dff80b746460daf..b650f9095b496e45b30bb2b0e1cdbd4c256af99d 100644 (file)
@@ -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,