From: Radosław Zarzyński Date: Wed, 2 Aug 2023 14:43:56 +0000 (+0200) Subject: crimson/osd: add support for error handling around MOSDECSubOpRead X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=76efacff1d99869ab8d5ace7560ed08ae50156e8;p=ceph-ci.git crimson/osd: add support for error handling around MOSDECSubOpRead Signed-off-by: Radosław Zarzyński --- diff --git a/src/crimson/osd/ec_backend.cc b/src/crimson/osd/ec_backend.cc index be8e71a5d7e..77b693a6aaf 100644 --- a/src/crimson/osd/ec_backend.cc +++ b/src/crimson/osd/ec_backend.cc @@ -1,8 +1,15 @@ #include +#include "crimson/common/log.h" #include "crimson/osd/shard_services.h" #include "ec_backend.h" +namespace { + seastar::logger& logger() { + return crimson::get_logger(ceph_subsys_osd); + } +} + namespace crimson::osd { ECBackend::ECBackend(shard_id_t shard, @@ -10,9 +17,13 @@ ECBackend::ECBackend(shard_id_t shard, crimson::osd::ShardServices& shard_services, const ec_profile_t&, uint64_t stripe_width, + bool fast_read, + bool allows_ecoverwrites, DoutPrefixProvider &dpp) : PGBackend{shard, coll, shard_services, dpp}, - sinfo{ec_impl->get_data_chunk_count(), stripe_width} + sinfo{ec_impl->get_data_chunk_count(), stripe_width}, + fast_read{fast_read}, + allows_ecoverwrites{allows_ecoverwrites} { // FIXME: ec_impl // todo @@ -120,17 +131,29 @@ ECBackend::handle_rep_read_op(Ref m) return interruptor::do_for_each(op.to_read, [&op, &reply, this] (auto read_item) { const auto& [obj, op_list] = read_item; return interruptor::do_for_each(op_list, [&op, &reply, obj, this] (auto op_spec) { - using read_errorator = crimson::os::FuturizedStore::Shard::read_errorator; + using read_ertr = crimson::os::FuturizedStore::Shard::read_errorator; const auto& [off, size, flags] = op_spec; return maybe_chunked_read( obj, op, off, size, flags - ).safe_then([&reply] (auto bl) { - return ll_read_ierrorator::now(); - }, read_errorator::all_same_way([] (const auto& e) { - assert(e.value() > 0); - return ll_read_ierrorator::now(); + ).safe_then([&reply, obj, off=off, size=size, FNAME] (auto&& result_bl) { + DEBUG("read requested={} len={}", size, result_bl.length()); + reply.buffers_read[obj].emplace_back(off, std::move(result_bl)); + return read_ertr::now(); + }).handle_error(read_ertr::all_same_way([&reply, obj, FNAME, this] (const auto& e) { + assert(e.value() > 0); + if (e.value() == ENOENT && fast_read) { + INFO("ENOENT reading {}, fast, read, probably ok", obj); + } else { + ERROR("Error {} reading {}", e.value(), obj); + // TODO: clog error logging + reply.buffers_read.erase(obj); + reply.errors[obj] = -e.value(); + } + return read_ertr::now(); })); }); + }).si_then([this] { + return ll_read_ierrorator::now(); }); }); } diff --git a/src/crimson/osd/ec_backend.h b/src/crimson/osd/ec_backend.h index b0afabbeb9a..0b5e1443910 100644 --- a/src/crimson/osd/ec_backend.h +++ b/src/crimson/osd/ec_backend.h @@ -25,6 +25,8 @@ public: crimson::osd::ShardServices& shard_services, const ec_profile_t& ec_profile, uint64_t stripe_width, + bool fast_read, + bool allows_ecoverwrites, DoutPrefixProvider &dpp); seastar::future<> stop() final { return seastar::now(); @@ -63,6 +65,9 @@ private: ceph::ErasureCodeInterfaceRef ec_impl; const ECUtil::stripe_info_t sinfo; + + const bool fast_read; + const bool allows_ecoverwrites; }; } diff --git a/src/crimson/osd/pg_backend.cc b/src/crimson/osd/pg_backend.cc index 4a66f72d421..ca2b0aed06d 100644 --- a/src/crimson/osd/pg_backend.cc +++ b/src/crimson/osd/pg_backend.cc @@ -64,6 +64,8 @@ PGBackend::create(pg_t pgid, return std::make_unique(pg_shard.shard, coll, shard_services, std::move(ec_profile), pool.stripe_width, + pool.fast_read, + pool.allows_ecoverwrites(), dpp); default: throw runtime_error(seastar::format("unsupported pool type '{}'",