#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() {
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(
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"
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(
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(
const ghobject_t oid;
std::map<string, bufferlist> omap;
+ bufferlist contents;
void set_omap(
CTransaction &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) {
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);
+ });
+}