]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: add a dedicate code path for WRITE
authorKefu Chai <kchai@redhat.com>
Wed, 10 Jul 2019 12:07:36 +0000 (20:07 +0800)
committerKefu Chai <kchai@redhat.com>
Sat, 13 Jul 2019 13:46:05 +0000 (21:46 +0800)
differentiate WRITE from WRITEALL.
and handles differnt cases of `os.oi.truncate_seq` caused by
`write_trunc` and/or `trunc` ops.

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

index 5041b2d18047e42b5fa400cd05e0b86b1d9f31ce..686313dec70639b7ad6b5b2838e27d30270943be 100644 (file)
@@ -332,9 +332,7 @@ PG::do_osd_op(ObjectState& os, OSDOp& osd_op, ceph::os::Transaction& txn)
       return seastar::now();
     });
   case CEPH_OSD_OP_WRITE:
-    // TODO: handle write separately. For `rados bench write` the fall-
-    // through path somehow works but this is really nasty.
-    [[fallthrough]];
+    return backend->write(os, osd_op, txn);
   case CEPH_OSD_OP_WRITEFULL:
     // XXX: os = backend->write(std::move(os), ...) instead?
     return backend->writefull(os, osd_op, txn);
index 1a0d6fe5f64d59973eeed4751e590d35c05c7c5d..c31e88539667e10b723c0dc265f39eba81c21125 100644 (file)
@@ -256,6 +256,52 @@ bool PGBackend::maybe_create_new_object(
   return true;
 }
 
+seastar::future<> PGBackend::write(
+    ObjectState& os,
+    const OSDOp& osd_op,
+    ceph::os::Transaction& txn)
+{
+  const ceph_osd_op& op = osd_op.op;
+  uint64_t offset = op.extent.offset;
+  uint64_t length = op.extent.length;
+  bufferlist buf = osd_op.indata;
+  if (auto seq = os.oi.truncate_seq;
+      seq != 0 && op.extent.truncate_seq < seq) {
+    // old write, arrived after trimtrunc
+    if (offset + length > os.oi.size) {
+      // no-op
+      if (offset > os.oi.size) {
+       length = 0;
+       buf.clear();
+      } else {
+       // truncate
+       auto len = os.oi.size - offset;
+       buf.splice(len, length);
+       length = len;
+      }
+    }
+  } else if (op.extent.truncate_seq > seq) {
+    // write arrives before trimtrunc
+    if (os.exists && !os.oi.is_whiteout()) {
+      txn.truncate(coll->cid, ghobject_t{os.oi.soid}, op.extent.truncate_size);
+    }
+    os.oi.truncate_seq = op.extent.truncate_seq;
+    os.oi.truncate_size = op.extent.truncate_size;
+  }
+  maybe_create_new_object(os, txn);
+  if (length == 0) {
+    if (offset > os.oi.size) {
+      txn.truncate(coll->cid, ghobject_t{os.oi.soid}, op.extent.offset);
+    } else {
+      txn.nop();
+    }
+  } else {
+    txn.write(coll->cid, ghobject_t{os.oi.soid},
+             offset, length, std::move(buf), op.flags);
+  }
+  return seastar::now();
+}
+
 seastar::future<> PGBackend::writefull(
   ObjectState& os,
   const OSDOp& osd_op,
index 75f5c30334b032049218b0df85c636b880a67fe8..69380a64a4dfe175f058dff25763267fd6e97961 100644 (file)
@@ -43,6 +43,10 @@ public:
   seastar::future<> remove(
     ObjectState& os,
     ceph::os::Transaction& txn);
+  seastar::future<> write(
+    ObjectState& os,
+    const OSDOp& osd_op,
+    ceph::os::Transaction& trans);
   seastar::future<> writefull(
     ObjectState& os,
     const OSDOp& osd_op,