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-Tag: v21.0.0~3^2~91 X-Git-Url: http://git-server-git.apps.pok.os.sepia.ceph.com/?a=commitdiff_plain;h=4366bfc6cb124a8c913bdb19f15c1a118cc91c5f;p=ceph.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 09d0516fd121..bb1b9889ba95 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, @@ -11,9 +18,13 @@ ECBackend::ECBackend(shard_id_t shard, store_index_t store_index, const ec_profile_t&, uint64_t stripe_width, + bool fast_read, + bool allows_ecoverwrites, DoutPrefixProvider &dpp) : PGBackend{shard, coll, shard_services, store_index, 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 @@ -121,17 +132,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 cce9384b766c..0c14c109011d 100644 --- a/src/crimson/osd/ec_backend.h +++ b/src/crimson/osd/ec_backend.h @@ -26,6 +26,8 @@ public: store_index_t store_index, 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(); @@ -64,6 +66,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 22c645aa458b..baa5dffa37b8 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, pg.get_store_index(), std::move(ec_profile), pool.stripe_width, + pool.fast_read, + pool.allows_ecoverwrites(), dpp); default: throw runtime_error(seastar::format("unsupported pool type '{}'",