From 413a9572ef0c48a1a34cb3d5dbdd131e1ad37b5e Mon Sep 17 00:00:00 2001 From: Kefu Chai Date: Fri, 7 Aug 2020 18:47:52 +0800 Subject: [PATCH] crimson/osd: support sparse_read op Signed-off-by: Kefu Chai --- src/crimson/osd/ops_executer.cc | 4 ++++ src/crimson/osd/pg_backend.cc | 31 +++++++++++++++++++++++++++++++ src/crimson/osd/pg_backend.h | 3 +++ 3 files changed, 38 insertions(+) diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 810c557252a94..5d0eaa21a1a96 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -691,6 +691,10 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op) return osd_op_errorator::now(); }); }); + case CEPH_OSD_OP_SPARSE_READ: + return do_read_op([&osd_op] (auto& backend, const auto& os) { + return backend.sparse_read(os, osd_op); + }); case CEPH_OSD_OP_CHECKSUM: return do_read_op([&osd_op] (auto& backend, const auto& os) { return backend.checksum(os, osd_op); diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index e8ad54e29dc0b..72e49451946c6 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -216,6 +216,37 @@ PGBackend::read(const object_info_t& oi, }); } +PGBackend::read_errorator::future<> +PGBackend::sparse_read(const ObjectState& os, OSDOp& osd_op) +{ + const auto& op = osd_op.op; + logger().trace("sparse_read: {} {}~{}", + os.oi.soid, op.extent.offset, op.extent.length); + return store->fiemap(coll, ghobject_t{os.oi.soid}, + op.extent.offset, + op.extent.length).then([&os, &osd_op, this](auto&& m) { + return seastar::do_with(interval_set{std::move(m)}, + [&os, &osd_op, this](auto&& extents) { + return store->readv(coll, ghobject_t{os.oi.soid}, + extents, osd_op.op.flags).safe_then( + [&os, &osd_op, &extents, this](auto&& bl) -> read_errorator::future<> { + if (_read_verify_data(os.oi, bl)) { + osd_op.op.extent.length = bl.length(); + // re-encode since it might be modified + ceph::encode(extents, osd_op.outdata); + encode_destructively(bl, osd_op.outdata); + logger().trace("sparse_read got {} bytes from object {}", + osd_op.op.extent.length, os.oi.soid); + return read_errorator::make_ready_future<>(); + } else { + // TODO: repair it if crc mismatches + return crimson::ct_error::object_corrupted::make(); + } + }); + }); + }); +} + namespace { template diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 67fa12b871658..dab750dde17ff 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -62,6 +62,9 @@ public: size_t truncate_size, uint32_t truncate_seq, uint32_t flags); + read_errorator::future<> sparse_read( + const ObjectState& os, + OSDOp& osd_op); using checksum_errorator = ll_read_errorator::extend< crimson::ct_error::object_corrupted, -- 2.39.5