From: Kefu Chai Date: Wed, 10 Jul 2019 12:07:36 +0000 (+0800) Subject: crimson/osd: add a dedicate code path for WRITE X-Git-Tag: v15.1.0~2186^2~3 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=0df8e57b160b7300bfb71277ceada5e77c6a2eab;p=ceph-ci.git crimson/osd: add a dedicate code path for WRITE 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 --- diff --git a/src/crimson/osd/pg.cc b/src/crimson/osd/pg.cc index 5041b2d1804..686313dec70 100644 --- a/src/crimson/osd/pg.cc +++ b/src/crimson/osd/pg.cc @@ -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); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 1a0d6fe5f64..c31e8853966 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -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, diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 75f5c30334b..69380a64a4d 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -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,