From 9b93b0aeee3a1e63ca354e2cc0f8df659f815561 Mon Sep 17 00:00:00 2001 From: Samuel Just Date: Tue, 13 Apr 2021 21:51:50 -0700 Subject: [PATCH] crimson/os/seastore: wire in object_data_handler Signed-off-by: Samuel Just --- src/crimson/os/seastore/seastore.cc | 53 +++++++++-- src/test/crimson/seastore/test_seastore.cc | 101 +++++++++++++++++++++ 2 files changed, 146 insertions(+), 8 deletions(-) diff --git a/src/crimson/os/seastore/seastore.cc b/src/crimson/os/seastore/seastore.cc index a2c74a68ae0..211eb5a1f86 100644 --- a/src/crimson/os/seastore/seastore.cc +++ b/src/crimson/os/seastore/seastore.cc @@ -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 SeaStore::read( size_t len, uint32_t op_flags) { - return read_errorator::make_ready_future(); + return repeat_with_onode( + ch, + oid, + [=](auto &t, auto &onode) { + return ObjectDataHandler().read( + ObjectDataHandler::context_t{ + *transaction_manager, + t, + onode, + }, + offset, + len); + }); } SeaStore::read_errorator::future SeaStore::readv( @@ -213,10 +226,10 @@ seastar::future 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(); + return seastar::make_ready_future(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( + 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( diff --git a/src/test/crimson/seastore/test_seastore.cc b/src/test/crimson/seastore/test_seastore.cc index 6dc9f4b5d1d..33837bdbb9e 100644 --- a/src/test/crimson/seastore/test_seastore.cc +++ b/src/test/crimson/seastore/test_seastore.cc @@ -59,6 +59,7 @@ struct seastore_test_t : const ghobject_t oid; std::map 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(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); + }); +} -- 2.39.5