]> git.apps.os.sepia.ceph.com Git - ceph.git/commitdiff
crimson/os/seastore: wire in object_data_handler 40846/head
authorSamuel Just <sjust@redhat.com>
Wed, 14 Apr 2021 04:51:50 +0000 (21:51 -0700)
committerSamuel Just <sjust@redhat.com>
Sun, 18 Apr 2021 07:36:03 +0000 (00:36 -0700)
Signed-off-by: Samuel Just <sjust@redhat.com>
src/crimson/os/seastore/seastore.cc
src/test/crimson/seastore/test_seastore.cc

index a2c74a68ae0dcf5aaf09afb35eddb9bd82f99627..211eb5a1f8608a94dd48bda49d34130323232a99 100644 (file)
@@ -19,6 +19,7 @@
 #include "crimson/os/seastore/omap_manager/btree/btree_omap_manager.h"
 #include "crimson/os/seastore/segment_manager/ephemeral.h"
 #include "crimson/os/seastore/onode_manager.h"
+#include "crimson/os/seastore/object_data_handler.h"
 
 namespace {
   seastar::logger& logger() {
@@ -169,7 +170,19 @@ SeaStore::read_errorator::future<ceph::bufferlist> SeaStore::read(
   size_t len,
   uint32_t op_flags)
 {
-  return read_errorator::make_ready_future<ceph::bufferlist>();
+  return repeat_with_onode<ceph::bufferlist>(
+    ch,
+    oid,
+    [=](auto &t, auto &onode) {
+      return ObjectDataHandler().read(
+       ObjectDataHandler::context_t{
+         *transaction_manager,
+         t,
+         onode,
+       },
+       offset,
+       len);
+    });
 }
 
 SeaStore::read_errorator::future<ceph::bufferlist> SeaStore::readv(
@@ -213,10 +226,10 @@ seastar::future<struct stat> SeaStore::stat(
       struct stat st;
       auto &olayout = onode.get_layout();
       st.st_size = olayout.size;
-      st.st_blksize = 4096;
+      st.st_blksize = transaction_manager->get_block_size();
       st.st_blocks = (st.st_size + st.st_blksize - 1) / st.st_blksize;
       st.st_nlink = 1;
-      return seastar::make_ready_future<struct stat>();
+      return seastar::make_ready_future<struct stat>(st);
     }).handle_error(
       crimson::ct_error::assert_all{
        "Invalid error in SeaStore::stat"
@@ -631,12 +644,29 @@ SeaStore::tm_ret SeaStore::_write(
   internal_context_t &ctx,
   OnodeRef &onode,
   uint64_t offset, size_t len,
-  ceph::bufferlist &&bl,
+  ceph::bufferlist &&_bl,
   uint32_t fadvise_flags)
 {
-  logger().debug("{}: {} {} ~ {}",
+  logger().debug("SeaStore::{}: {} {} ~ {}",
                 __func__, *onode, offset, len);
-  return tm_ertr::now();
+  {
+    auto &object_size = onode->get_mutable_layout(*ctx.transaction).size;
+    object_size = std::max<uint64_t>(
+      offset + len,
+      object_size);
+  }
+  return seastar::do_with(
+    std::move(_bl),
+    [=, &ctx, &onode](auto &bl) {
+      return ObjectDataHandler().write(
+       ObjectDataHandler::context_t{
+         *transaction_manager,
+         *ctx.transaction,
+         *onode,
+       },
+       offset,
+       bl);
+    });
 }
 
 SeaStore::tm_ret SeaStore::_omap_set_values(
@@ -754,9 +784,16 @@ SeaStore::tm_ret SeaStore::_truncate(
   OnodeRef &onode,
   uint64_t size)
 {
-  logger().debug("{} onode={} size={}",
+  logger().debug("SeaStore::{} onode={} size={}",
                 __func__, *onode, size);
-  return tm_ertr::now();
+  onode->get_mutable_layout(*ctx.transaction).size = size;
+  return ObjectDataHandler().truncate(
+    ObjectDataHandler::context_t{
+      *transaction_manager,
+      *ctx.transaction,
+      *onode
+    },
+    size);
 }
 
 SeaStore::tm_ret SeaStore::_setattrs(
index 6dc9f4b5d1dd107a1efcc3e05f81a747b327a124..33837bdbb9e6941073ca43b6389469a34a7a7fd7 100644 (file)
@@ -59,6 +59,7 @@ struct seastore_test_t :
     const ghobject_t oid;
 
     std::map<string, bufferlist> omap;
+    bufferlist contents;
 
     void set_omap(
       CTransaction &t,
@@ -84,6 +85,88 @@ struct seastore_test_t :
        std::move(t)).get0();
     }
 
+    void write(
+      SeaStore &seastore,
+      CTransaction &t,
+      uint64_t offset,
+      bufferlist bl)  {
+      bufferlist new_contents;
+      if (offset > 0 && contents.length()) {
+       new_contents.substr_of(
+         contents,
+         0,
+         std::min<size_t>(offset, contents.length())
+       );
+      }
+      new_contents.append_zero(offset - new_contents.length());
+      new_contents.append(bl);
+
+      auto tail_offset = offset + bl.length();
+      if (contents.length() > tail_offset) {
+       bufferlist tail;
+       tail.substr_of(
+         contents,
+         tail_offset,
+         contents.length() - tail_offset);
+       new_contents.append(tail);
+      }
+      contents.swap(new_contents);
+
+      t.write(
+       cid,
+       oid,
+       offset,
+       bl.length(),
+       bl);
+    }
+    void write(
+      SeaStore &seastore,
+      uint64_t offset,
+      bufferlist bl)  {
+      CTransaction t;
+      write(seastore, t, offset, bl);
+      seastore.do_transaction(
+       coll,
+       std::move(t)).get0();
+    }
+    void write(
+      SeaStore &seastore,
+      uint64_t offset,
+      size_t len,
+      char fill)  {
+      auto buffer = bufferptr(buffer::create(len));
+      ::memset(buffer.c_str(), fill, len);
+      bufferlist bl;
+      bl.append(buffer);
+      write(seastore, offset, bl);
+    }
+
+    void read(
+      SeaStore &seastore,
+      uint64_t offset,
+      uint64_t len) {
+      bufferlist to_check;
+      to_check.substr_of(
+       contents,
+       offset,
+       len);
+      auto ret = seastore.read(
+       coll,
+       oid,
+       offset,
+       len).unsafe_get0();
+      EXPECT_EQ(ret.length(), to_check.length());
+      EXPECT_EQ(ret, to_check);
+    }
+
+    void check_size(SeaStore &seastore) {
+      auto st = seastore.stat(
+       coll,
+       oid).get0();
+      EXPECT_EQ(contents.length(), st.st_size);
+    }
+
+
     void check_omap_key(
       SeaStore &seastore,
       const string &key) {
@@ -241,3 +324,21 @@ TEST_F(seastore_test_t, omap_test_iterator)
     test_obj.check_omap(*seastore);
   });
 }
+
+
+TEST_F(seastore_test_t, simple_extent_test)
+{
+  run_async([this] {
+    auto &test_obj = get_object(make_oid(0));
+    test_obj.write(
+      *seastore,
+      1024,
+      1024,
+      'a');
+    test_obj.read(
+      *seastore,
+      1024,
+      1024);
+    test_obj.check_size(*seastore);
+  });
+}