extent_len_t len,
paddr_t addr)
{
+ ceph_assert(is_aligned(hint, (uint64_t)segment_manager.get_block_size()));
struct state_t {
laddr_t last_end;
virtual onode_layout_t &get_mutable_layout(Transaction &t) = 0;
virtual ~Onode() = default;
- laddr_t get_metadata_hint() const {
+ laddr_t get_metadata_hint(uint64_t block_size) const {
assert(default_metadata_offset);
assert(default_metadata_range);
+ uint64_t range_blocks = default_metadata_range / block_size;
return get_hint() + default_metadata_offset +
- ((uint32_t)std::rand() % default_metadata_range);
+ (((uint32_t)std::rand() % range_blocks) * block_size);
}
laddr_t get_data_hint() const {
return get_hint();
static KVPool create_range(
const std::pair<index_t, index_t>& range_i,
- const std::vector<size_t>& value_sizes) {
+ const std::vector<size_t>& value_sizes,
+ const uint64_t block_size) {
kv_vector_t kvs;
std::random_device rd;
for (index_t i = range_i.first; i < range_i.second; ++i) {
auto value_size = value_sizes[rd() % value_sizes.size()];
kvs.emplace_back(
- kv_t{make_oid(i), ValueItem::create(value_size, i)}
+ kv_t{make_oid(i), ValueItem::create(value_size, i, block_size)}
);
}
return KVPool(std::move(kvs));
}
return _omap_get_value(
t,
- layout.xattr_root.get(onode.get_metadata_hint()),
+ layout.xattr_root.get(
+ onode.get_metadata_hint(segment_manager->get_block_size())),
name);
}
).handle_error(crimson::ct_error::input_output_error::handle([FNAME] {
op_type_t::OMAP_GET_VALUES,
[this, keys](auto &t, auto &onode) {
omap_root_t omap_root = onode.get_layout().omap_root.get(
- onode.get_metadata_hint());
+ onode.get_metadata_hint(segment_manager->get_block_size()));
return _omap_get_values(
t,
std::move(omap_root),
const std::optional<std::string>& start,
OMapManager::omap_list_config_t config) const
{
- auto root = omap_root.get(onode.get_metadata_hint());
+ auto root = omap_root.get(
+ onode.get_metadata_hint(segment_manager->get_block_size()));
if (root.is_null()) {
return seastar::make_ready_future<_omap_list_bare_ret>(
true, omap_values_t{}
{
return seastar::do_with(
BtreeOMapManager(*transaction_manager),
- omap_root.get(onode->get_metadata_hint()),
+ omap_root.get(onode->get_metadata_hint(segment_manager->get_block_size())),
[&, keys=std::move(kvs)](auto &omap_manager, auto &root) {
tm_iertr::future<> maybe_create_root =
!root.is_null() ?
tm_iertr::now() :
omap_manager.initialize_omap(
- t, onode->get_metadata_hint()
+ t, onode->get_metadata_hint(segment_manager->get_block_size())
).si_then([&root](auto new_root) {
root = new_root;
});
{
LOG_PREFIX(SeaStore::_omap_rmkeys);
DEBUGT("{} {} keys", *ctx.transaction, *onode, keys.size());
- auto omap_root = onode->get_layout().omap_root.get(onode->get_metadata_hint());
+ auto omap_root = onode->get_layout().omap_root.get(
+ onode->get_metadata_hint(segment_manager->get_block_size()));
if (omap_root.is_null()) {
return seastar::now();
} else {
return seastar::do_with(
BtreeOMapManager(*transaction_manager),
- onode->get_layout().omap_root.get(onode->get_metadata_hint()),
+ onode->get_layout().omap_root.get(
+ onode->get_metadata_hint(segment_manager->get_block_size())),
std::move(keys),
[&ctx, &onode](
auto &omap_manager,
namespace crimson::os::seastore {
+bool is_aligned(uint64_t offset, uint64_t alignment)
+{
+ return (offset % alignment) == 0;
+}
+
std::ostream& operator<<(std::ostream& out, const seastore_meta_t& meta)
{
return out << meta.seastore_id;
}
};
+bool is_aligned(uint64_t offset, uint64_t alignment);
+
std::ostream& operator<<(std::ostream& out, const seastore_meta_t& meta);
// identifies a specific physical device within seastore
struct onode_item_t {
uint32_t size;
uint64_t id;
+ uint64_t block_size;
uint32_t cnt_modify = 0;
void initialize(Transaction& t, Onode& value) const {
auto& layout = value.get_mutable_layout(t);
layout.size = size;
- layout.omap_root.update(omap_root_t(id, cnt_modify, value.get_metadata_hint()));
+ layout.omap_root.update(omap_root_t(id, cnt_modify,
+ value.get_metadata_hint(block_size)));
validate(value);
}
void validate(Onode& value) const {
auto& layout = value.get_layout();
ceph_assert(laddr_t(layout.size) == laddr_t{size});
- ceph_assert(layout.omap_root.get(value.get_metadata_hint()).addr == id);
- ceph_assert(layout.omap_root.get(value.get_metadata_hint()).depth == cnt_modify);
+ ceph_assert(layout.omap_root.get(value.get_metadata_hint(block_size)).addr == id);
+ ceph_assert(layout.omap_root.get(value.get_metadata_hint(block_size)).depth == cnt_modify);
}
void modify(Transaction& t, Onode& value) {
initialize(t, value);
}
- static onode_item_t create(std::size_t size, std::size_t id) {
+ static onode_item_t create(std::size_t size, std::size_t id, uint64_t block_size) {
ceph_assert(size <= std::numeric_limits<uint32_t>::max());
- return {(uint32_t)size, id};
+ return {(uint32_t)size, id, block_size};
}
};
TEST_F(fltree_onode_manager_test_t, 1_single)
{
run_async([this] {
- auto pool = KVPool<onode_item_t>::create_range({0, 1}, {128, 256});
+ uint64_t block_size = tm->get_block_size();
+ auto pool = KVPool<onode_item_t>::create_range({0, 1}, {128, 256}, block_size);
auto iter = pool.begin();
with_onode_write(iter, [](auto& t, auto& onode, auto& item) {
item.initialize(t, onode);
TEST_F(fltree_onode_manager_test_t, 2_synthetic)
{
run_async([this] {
+ uint64_t block_size = tm->get_block_size();
auto pool = KVPool<onode_item_t>::create_range(
- {0, 100}, {32, 64, 128, 256, 512});
+ {0, 100}, {32, 64, 128, 256, 512}, block_size);
auto start = pool.begin();
auto end = pool.end();
with_onodes_write(start, end,