]> git.proxmox.com Git - ceph.git/blame - ceph/src/test/crimson/seastore/test_randomblock_manager.cc
bump version to 18.2.4-pve3
[ceph.git] / ceph / src / test / crimson / seastore / test_randomblock_manager.cc
CommitLineData
20effc67
TL
1// -*- mode:C++; tab-width:8; c-basic-offset:2; indent-tabs-mode:t -*-
2// vim: ts=8 sw=2 smarttab
3
4#include "test/crimson/gtest_seastar.h"
5
6#include <random>
7
8#include "crimson/common/log.h"
1e59de90
TL
9#include "crimson/os/seastore/random_block_manager/block_rb_manager.h"
10#include "crimson/os/seastore/random_block_manager/rbm_device.h"
20effc67
TL
11
12using namespace crimson;
13using namespace crimson::os;
14using namespace crimson::os::seastore;
15
16namespace {
17 [[maybe_unused]] seastar::logger& logger() {
18 return crimson::get_logger(ceph_subsys_test);
19 }
20}
21
22constexpr uint64_t DEFAULT_TEST_SIZE = 1 << 20;
20effc67
TL
23
24struct rbm_test_t :
1e59de90
TL
25 public seastar_test_suite_t {
26 std::unique_ptr<BlockRBManager> rbm_manager;
27 std::unique_ptr<random_block_device::RBMDevice> device;
20effc67
TL
28
29 struct rbm_transaction {
1e59de90 30 void add_rbm_allocated_blocks(alloc_delta_t &d) {
20effc67
TL
31 allocated_blocks.push_back(d);
32 }
33 void clear_rbm_allocated_blocks() {
34 if (!allocated_blocks.empty()) {
35 allocated_blocks.clear();
36 }
37 }
38 const auto &get_rbm_allocated_blocks() {
39 return allocated_blocks;
40 }
1e59de90 41 std::vector<alloc_delta_t> allocated_blocks;
20effc67
TL
42 };
43
44 std::default_random_engine generator;
45
1e59de90
TL
46 uint64_t block_size = 0;
47 uint64_t size = 0;
20effc67 48
1e59de90 49 device_config_t config;
20effc67
TL
50
51 rbm_test_t() = default;
52
53 seastar::future<> set_up_fut() final {
1e59de90
TL
54 device = random_block_device::create_test_ephemeral(
55 random_block_device::DEFAULT_TEST_CBJOURNAL_SIZE, DEFAULT_TEST_SIZE);
56 block_size = device->get_block_size();
57 size = device->get_available_size();
58 rbm_manager.reset(new BlockRBManager(device.get(), std::string(), false));
59 config = get_rbm_ephemeral_device_config(0, 1);
60 return device->mkfs(config).handle_error(crimson::ct_error::assert_all{}
61 ).then([this] {
62 return device->mount().handle_error(crimson::ct_error::assert_all{}
63 ).then([this] {
64 return rbm_manager->open().handle_error(crimson::ct_error::assert_all{});
65 });
66 });
20effc67
TL
67 }
68
69 seastar::future<> tear_down_fut() final {
1e59de90
TL
70 rbm_manager->close().unsafe_get0();
71 device->close().unsafe_get0();
20effc67
TL
72 rbm_manager.reset();
73 device.reset();
1e59de90 74 return seastar::now();
20effc67
TL
75 }
76
77 auto mkfs() {
1e59de90 78 return device->mkfs(config).unsafe_get0();
20effc67
TL
79 }
80
81 auto read_rbm_header() {
1e59de90 82 return device->read_rbm_header(RBM_START_ADDRESS).unsafe_get0();
20effc67
TL
83 }
84
85 auto open() {
1e59de90
TL
86 device->mount().unsafe_get0();
87 return rbm_manager->open().unsafe_get0();
20effc67
TL
88 }
89
90 auto write(uint64_t addr, bufferptr &ptr) {
1e59de90
TL
91 paddr_t paddr = convert_abs_addr_to_paddr(
92 addr,
93 rbm_manager->get_device_id());
94 return rbm_manager->write(paddr, ptr).unsafe_get0();
20effc67
TL
95 }
96
97 auto read(uint64_t addr, bufferptr &ptr) {
1e59de90
TL
98 paddr_t paddr = convert_abs_addr_to_paddr(
99 addr,
100 rbm_manager->get_device_id());
101 return rbm_manager->read(paddr, ptr).unsafe_get0();
20effc67
TL
102 }
103
104 bufferptr generate_extent(size_t blocks) {
105 std::uniform_int_distribution<char> distribution(
106 std::numeric_limits<char>::min(),
107 std::numeric_limits<char>::max()
108 );
109 char contents = distribution(generator);
110 return buffer::ptr(buffer::create(blocks * block_size, contents));
111 }
112
1e59de90
TL
113 void close() {
114 rbm_manager->close().unsafe_get0();
115 return;
116 }
117
20effc67
TL
118};
119
120TEST_F(rbm_test_t, mkfs_test)
121{
122 run_async([this] {
20effc67
TL
123 auto super = read_rbm_header();
124 ASSERT_TRUE(
1e59de90
TL
125 super.block_size == block_size &&
126 super.size == size
20effc67 127 );
1e59de90 128 config.spec.id = DEVICE_ID_NULL;
20effc67 129 mkfs();
1e59de90
TL
130 super = read_rbm_header();
131 ASSERT_TRUE(
132 super.config.spec.id == DEVICE_ID_NULL &&
133 super.size == size
134 );
20effc67
TL
135 });
136}
137
1e59de90 138TEST_F(rbm_test_t, open_read_write_test)
20effc67
TL
139{
140 run_async([this] {
1e59de90
TL
141 auto content = generate_extent(1);
142 {
143 write(
144 block_size,
145 content
146 );
147 auto bp = bufferptr(ceph::buffer::create_page_aligned(block_size));
148 read(
149 block_size,
150 bp
151 );
152 bufferlist bl;
153 bufferlist block;
154 bl.append(bp);
155 block.append(content);
156 ASSERT_EQ(
157 bl.begin().crc32c(bl.length(), 1),
158 block.begin().crc32c(block.length(), 1));
159 }
160 close();
20effc67 161 open();
1e59de90
TL
162 {
163 auto bp = bufferptr(ceph::buffer::create_page_aligned(block_size));
164 read(
165 block_size,
166 bp
167 );
168 bufferlist bl;
169 bufferlist block;
170 bl.append(bp);
171 block.append(content);
172 ASSERT_EQ(
173 bl.begin().crc32c(bl.length(), 1),
174 block.begin().crc32c(block.length(), 1));
175 }
20effc67
TL
176 });
177}
178