]> git-server-git.apps.pok.os.sepia.ceph.com Git - ceph.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, 24 Mar 2026 16:06:23 +0000 (16:06 +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 09d0516fd1210963a5742ae5b9f3bf39468613bd..bb1b9889ba95a6fa53daa22c669ccae4829c445b 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,
@@ -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<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 cce9384b766c170dce7016b8c7ae0738f5abd2ef..0c14c109011d5c47fdf4a1d7fed8691589b21d97 100644 (file)
@@ -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;
 };
 
 }
index 22c645aa458b249ce1d3baf8eb9644dbf9adea53..baa5dffa37b817a3b658dbf4930ec2df457c3809 100644 (file)
@@ -64,6 +64,8 @@ PGBackend::create(pg_t pgid,
     return std::make_unique<ECBackend>( 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 '{}'",