]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/osd: support sparse_read op 36500/head
authorKefu Chai <kchai@redhat.com>
Fri, 7 Aug 2020 10:47:52 +0000 (18:47 +0800)
committerKefu Chai <kchai@redhat.com>
Fri, 7 Aug 2020 11:15:24 +0000 (19:15 +0800)
Signed-off-by: Kefu Chai <kchai@redhat.com>
src/crimson/osd/ops_executer.cc
src/crimson/osd/pg_backend.cc
src/crimson/osd/pg_backend.h

index 810c557252a94867ca837a62e856fc165eed88da..5d0eaa21a1a968612b1551632ae9b7336c44cec4 100644 (file)
@@ -691,6 +691,10 @@ OpsExecuter::execute_osd_op(OSDOp& osd_op)
           return osd_op_errorator::now();
         });
     });
+  case CEPH_OSD_OP_SPARSE_READ:
+    return do_read_op([&osd_op] (auto& backend, const auto& os) {
+      return backend.sparse_read(os, osd_op);
+    });
   case CEPH_OSD_OP_CHECKSUM:
     return do_read_op([&osd_op] (auto& backend, const auto& os) {
       return backend.checksum(os, osd_op);
index e8ad54e29dc0b88e072ee39390402934fd9db73a..72e49451946c6aafa8779b96541646c76b42a18d 100644 (file)
@@ -216,6 +216,37 @@ PGBackend::read(const object_info_t& oi,
     });
 }
 
+PGBackend::read_errorator::future<>
+PGBackend::sparse_read(const ObjectState& os, OSDOp& osd_op)
+{
+  const auto& op = osd_op.op;
+  logger().trace("sparse_read: {} {}~{}",
+                 os.oi.soid, op.extent.offset, op.extent.length);
+  return store->fiemap(coll, ghobject_t{os.oi.soid},
+                      op.extent.offset,
+                      op.extent.length).then([&os, &osd_op, this](auto&& m) {
+    return seastar::do_with(interval_set<uint64_t>{std::move(m)},
+                           [&os, &osd_op, this](auto&& extents) {
+      return store->readv(coll, ghobject_t{os.oi.soid},
+                          extents, osd_op.op.flags).safe_then(
+        [&os, &osd_op, &extents, this](auto&& bl) -> read_errorator::future<> {
+        if (_read_verify_data(os.oi, bl)) {
+          osd_op.op.extent.length = bl.length();
+          // re-encode since it might be modified
+          ceph::encode(extents, osd_op.outdata);
+          encode_destructively(bl, osd_op.outdata);
+          logger().trace("sparse_read got {} bytes from object {}",
+                         osd_op.op.extent.length, os.oi.soid);
+          return read_errorator::make_ready_future<>();
+        } else {
+          // TODO: repair it if crc mismatches
+          return crimson::ct_error::object_corrupted::make();
+        }
+      });
+    });
+  });
+}
+
 namespace {
 
   template<class CSum>
index 67fa12b871658676094980e4ffa02bcd5ccfd496..dab750dde17ff525cf9d1d5ab5ffa16e37dce0e1 100644 (file)
@@ -62,6 +62,9 @@ public:
     size_t truncate_size,
     uint32_t truncate_seq,
     uint32_t flags);
+  read_errorator::future<> sparse_read(
+    const ObjectState& os,
+    OSDOp& osd_op);
 
   using checksum_errorator = ll_read_errorator::extend<
     crimson::ct_error::object_corrupted,