From 0869ade24f63036e0ad3d37e07673a142a27b6c5 Mon Sep 17 00:00:00 2001 From: Radoslaw Zarzynski Date: Tue, 10 Sep 2019 14:31:57 +0200 Subject: [PATCH] crimson/osd: apply errorator along the read path, part 4. Signed-off-by: Radoslaw Zarzynski --- src/crimson/common/errorator.h | 4 +++- src/crimson/osd/ops_executer.cc | 4 ++-- src/crimson/osd/pg_backend.cc | 19 ++++++++++--------- src/crimson/osd/pg_backend.h | 18 ++++++++++-------- 4 files changed, 25 insertions(+), 20 deletions(-) diff --git a/src/crimson/common/errorator.h b/src/crimson/common/errorator.h index 410d69176d1e4..003c9e3ef04a4 100644 --- a/src/crimson/common/errorator.h +++ b/src/crimson/common/errorator.h @@ -12,7 +12,8 @@ namespace _impl { enoent, invarg, enodata, - input_output_error + input_output_error, + object_corrupted }; } @@ -418,6 +419,7 @@ namespace ct_error { using enodata = unthrowable_wrapper<_impl::ct_error::enodata>; using invarg = unthrowable_wrapper<_impl::ct_error::invarg>; using input_output_error = unthrowable_wrapper<_impl::ct_error::input_output_error>; + using object_corrupted = unthrowable_wrapper<_impl::ct_error::object_corrupted>; } } // namespace crimson diff --git a/src/crimson/osd/ops_executer.cc b/src/crimson/osd/ops_executer.cc index 385fcb0a8b959..3e7519dfb6432 100644 --- a/src/crimson/osd/ops_executer.cc +++ b/src/crimson/osd/ops_executer.cc @@ -365,12 +365,12 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op) osd_op.op.extent.length, osd_op.op.extent.truncate_size, osd_op.op.extent.truncate_seq, - osd_op.op.flags).then( + osd_op.op.flags).safe_then( [&osd_op](bufferlist bl) { osd_op.rval = bl.length(); osd_op.outdata = std::move(bl); return seastar::now(); - }); + }, PGBackend::read_errorator::discard_all{}); }); case CEPH_OSD_OP_GETXATTR: return do_read_op([&osd_op] (auto& backend, const auto& os) { diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 43614732c292b..81b47f70f4008 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -226,12 +226,13 @@ static inline bool _read_verify_data( return true; } -seastar::future PGBackend::read(const object_info_t& oi, - size_t offset, - size_t length, - size_t truncate_size, - uint32_t truncate_seq, - uint32_t flags) +PGBackend::read_errorator::future +PGBackend::read(const object_info_t& oi, + const size_t offset, + size_t length, + const size_t truncate_size, + const uint32_t truncate_seq, + const uint32_t flags) { logger().trace("read: {} {}~{}", oi.soid, offset, length); // are we beyond truncate_size? @@ -250,13 +251,13 @@ seastar::future PGBackend::read(const object_info_t& oi, return seastar::make_ready_future(); } return _read(oi.soid, offset, length, flags).safe_then( - [&oi](auto&& bl) { + [&oi](auto&& bl) -> read_errorator::future { if (const bool is_fine = _read_verify_data(oi, bl); is_fine) { return seastar::make_ready_future(std::move(bl)); } else { - throw crimson::osd::object_corrupted{}; + return crimson::make_error(); } - }, ll_read_errorator::throw_as_runtime_error{}); + }, ll_read_errorator::pass_further{}); } seastar::future<> PGBackend::stat( diff --git a/src/crimson/osd/pg_backend.h b/src/crimson/osd/pg_backend.h index 4c26c568a7c17..2ea325032cbf8 100644 --- a/src/crimson/osd/pg_backend.h +++ b/src/crimson/osd/pg_backend.h @@ -47,14 +47,16 @@ public: seastar::future get_object_state(const hobject_t& oid); seastar::future<> evict_object_state(const hobject_t& oid); - using read_errorator = \ - ll_read_errorator::extend; - seastar::future read(const object_info_t& oi, - uint64_t off, - uint64_t len, - size_t truncate_size, - uint32_t truncate_seq, - uint32_t flags); + using read_errorator = ll_read_errorator::extend< + crimson::ct_error::input_output_error, + crimson::ct_error::object_corrupted>; + read_errorator::future read( + const object_info_t& oi, + uint64_t off, + uint64_t len, + size_t truncate_size, + uint32_t truncate_seq, + uint32_t flags); seastar::future<> stat( const ObjectState& os, OSDOp& osd_op); -- 2.39.5