]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/osd: add support for error handling around MOSDECSubOpRead
authorRadosław Zarzyński <rzarzyns@redhat.com>
Wed, 2 Aug 2023 14:43:56 +0000 (16:43 +0200)
committerRadoslaw Zarzynski <rzarzyns@redhat.com>
Tue, 27 Jan 2026 14:37:36 +0000 (14:37 +0000)
Signed-off-by: Radosław Zarzyński <rzarzyns@redhat.com>
src/crimson/osd/ec_backend.cc
src/crimson/osd/ec_backend.h
src/crimson/osd/pg_backend.cc

index be8e71a5d7e297c8ac2e076ba3bc6ab741c40f95..77b693a6aafbf1dba7f929ab93ee3250b38aed0a 100644 (file)
@@ -1,8 +1,15 @@
 #include <boost/iterator/counting_iterator.hpp>
 
+#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<MOSDECSubOpRead> 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();
     });
   });
 }
index b0afabbeb9ab569f1cfc4e99f0027db869ca07f6..0b5e14439105a579b91f400d17dc3a2711c1fc0b 100644 (file)
@@ -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;
 };
 
 }
index 4a66f72d421bdc1310e187776dd6c9cba3db0735..ca2b0aed06d4c99b7efc51683134d3cb6ec975c6 100644 (file)
@@ -64,6 +64,8 @@ PGBackend::create(pg_t pgid,
     return std::make_unique<ECBackend>(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 '{}'",