Skip to content

Commit d8eed12

Browse files
committed
crimson/os/seastore/rbm: create a device file if it doesn't exist
Signed-off-by: Myoungwon Oh <[email protected]>
1 parent afa5301 commit d8eed12

File tree

4 files changed

+107
-94
lines changed

4 files changed

+107
-94
lines changed

src/crimson/os/seastore/device.cc

Lines changed: 52 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -7,6 +7,8 @@
77
#include "random_block_manager.h"
88
#include "random_block_manager/rbm_device.h"
99

10+
SET_SUBSYS(seastore);
11+
1012
namespace crimson::os::seastore {
1113

1214
std::ostream& operator<<(std::ostream& out, const device_spec_t& ds)
@@ -48,4 +50,54 @@ Device::make_device(const std::string& device, device_type_t dtype)
4850
});
4951
}
5052

53+
check_create_device_ret check_create_device(
54+
const std::string path,
55+
size_t size)
56+
{
57+
LOG_PREFIX(block_check_create_device);
58+
INFO("path={}, size=0x{:x}", path, size);
59+
return seastar::open_file_dma(
60+
path,
61+
seastar::open_flags::exclusive |
62+
seastar::open_flags::rw |
63+
seastar::open_flags::create
64+
).then([size, FNAME, path](auto file) {
65+
return seastar::do_with(
66+
file,
67+
[size, FNAME, path](auto &f) -> seastar::future<>
68+
{
69+
DEBUG("path={} created, truncating to 0x{:x}", path, size);
70+
ceph_assert(f);
71+
return f.truncate(
72+
size
73+
).then([&f, size] {
74+
return f.allocate(0, size);
75+
}).finally([&f] {
76+
return f.close();
77+
});
78+
});
79+
}).then_wrapped([path, FNAME](auto f) -> check_create_device_ret {
80+
if (f.failed()) {
81+
try {
82+
f.get();
83+
return seastar::now();
84+
} catch (const std::system_error &e) {
85+
if (e.code().value() == EEXIST) {
86+
ERROR("path={} exists", path);
87+
return seastar::now();
88+
} else {
89+
ERROR("path={} creation error -- {}", path, e);
90+
return crimson::ct_error::input_output_error::make();
91+
}
92+
} catch (...) {
93+
ERROR("path={} creation error", path);
94+
return crimson::ct_error::input_output_error::make();
95+
}
96+
}
97+
98+
DEBUG("path={} complete", path);
99+
std::ignore = f.discard_result();
100+
return seastar::now();
101+
});
102+
}
51103
}

src/crimson/os/seastore/device.h

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -168,6 +168,11 @@ class Device {
168168
}
169169
};
170170

171+
using check_create_device_ertr = Device::access_ertr;
172+
using check_create_device_ret = check_create_device_ertr::future<>;
173+
check_create_device_ret check_create_device(
174+
const std::string path,
175+
size_t size);
171176
}
172177

173178
WRITE_CLASS_DENC_BOUNDED(crimson::os::seastore::device_spec_t)

src/crimson/os/seastore/random_block_manager/rbm_device.cc

Lines changed: 50 additions & 41 deletions
Original file line numberDiff line numberDiff line change
@@ -21,52 +21,61 @@ SET_SUBSYS(seastore_device);
2121
RBMDevice::mkfs_ret RBMDevice::do_primary_mkfs(device_config_t config,
2222
int shard_num, size_t journal_size) {
2323
LOG_PREFIX(RBMDevice::do_primary_mkfs);
24-
return stat_device(
25-
).handle_error(
26-
mkfs_ertr::pass_further{},
27-
crimson::ct_error::assert_all{
28-
"Invalid error stat_device in RBMDevice::do_primary_mkfs"}
29-
).safe_then(
30-
[this, FNAME, config=std::move(config), shard_num, journal_size](auto st) {
31-
super.block_size = st.block_size;
32-
super.size = st.size;
33-
super.config = std::move(config);
34-
super.journal_size = journal_size;
35-
ceph_assert_always(super.journal_size > 0);
36-
ceph_assert_always(super.size >= super.journal_size);
37-
ceph_assert_always(shard_num > 0);
38-
39-
std::vector<rbm_shard_info_t> shard_infos(shard_num);
40-
for (int i = 0; i < shard_num; i++) {
41-
uint64_t aligned_size =
42-
(super.size / shard_num) -
43-
((super.size / shard_num) % super.block_size);
44-
shard_infos[i].size = aligned_size;
45-
shard_infos[i].start_offset = i * aligned_size;
46-
assert(shard_infos[i].size > super.journal_size);
47-
}
48-
super.shard_infos = shard_infos;
49-
super.shard_num = shard_num;
50-
shard_info = shard_infos[seastar::this_shard_id()];
51-
DEBUG("super {} ", super);
52-
53-
// write super block
54-
return open(get_device_path(),
55-
seastar::open_flags::rw | seastar::open_flags::dsync
24+
check_create_device_ret maybe_create = check_create_device_ertr::now();
25+
using crimson::common::get_conf;
26+
if (get_conf<bool>("seastore_block_create") && !get_device_path().empty()) {
27+
auto size = get_conf<Option::size_t>("seastore_device_size");
28+
maybe_create = check_create_device(get_device_path(), size);
29+
}
30+
return maybe_create.safe_then([this, FNAME, config=std::move(config),
31+
shard_num, journal_size] {
32+
return stat_device(
5633
).handle_error(
5734
mkfs_ertr::pass_further{},
5835
crimson::ct_error::assert_all{
59-
"Invalid error open in RBMDevice::do_primary_mkfs"}
60-
).safe_then([this] {
61-
return initialize_nvme_features(
36+
"Invalid error stat_device in RBMDevice::do_primary_mkfs"}
37+
).safe_then(
38+
[this, FNAME, config=std::move(config), shard_num, journal_size](auto st) {
39+
super.block_size = st.block_size;
40+
super.size = st.size;
41+
super.config = std::move(config);
42+
super.journal_size = journal_size;
43+
ceph_assert_always(super.journal_size > 0);
44+
ceph_assert_always(super.size >= super.journal_size);
45+
ceph_assert_always(shard_num > 0);
46+
47+
std::vector<rbm_shard_info_t> shard_infos(shard_num);
48+
for (int i = 0; i < shard_num; i++) {
49+
uint64_t aligned_size =
50+
(super.size / shard_num) -
51+
((super.size / shard_num) % super.block_size);
52+
shard_infos[i].size = aligned_size;
53+
shard_infos[i].start_offset = i * aligned_size;
54+
assert(shard_infos[i].size > super.journal_size);
55+
}
56+
super.shard_infos = shard_infos;
57+
super.shard_num = shard_num;
58+
shard_info = shard_infos[seastar::this_shard_id()];
59+
DEBUG("super {} ", super);
60+
61+
// write super block
62+
return open(get_device_path(),
63+
seastar::open_flags::rw | seastar::open_flags::dsync
64+
).handle_error(
65+
mkfs_ertr::pass_further{},
66+
crimson::ct_error::assert_all{
67+
"Invalid error open in RBMDevice::do_primary_mkfs"}
6268
).safe_then([this] {
63-
return write_rbm_superblock(
69+
return initialize_nvme_features(
6470
).safe_then([this] {
65-
return close();
66-
}).handle_error(
67-
mkfs_ertr::pass_further{},
68-
crimson::ct_error::assert_all{
69-
"Invalid error write_rbm_superblock in RBMDevice::do_primary_mkfs"
71+
return write_rbm_superblock(
72+
).safe_then([this] {
73+
return close();
74+
}).handle_error(
75+
mkfs_ertr::pass_further{},
76+
crimson::ct_error::assert_all{
77+
"Invalid error write_rbm_superblock in RBMDevice::do_primary_mkfs"
78+
});
7079
});
7180
});
7281
});

src/crimson/os/seastore/segment_manager/block.cc

Lines changed: 0 additions & 53 deletions
Original file line numberDiff line numberDiff line change
@@ -248,59 +248,6 @@ block_sm_superblock_t make_superblock(
248248
};
249249
}
250250

251-
using check_create_device_ertr = BlockSegmentManager::access_ertr;
252-
using check_create_device_ret = check_create_device_ertr::future<>;
253-
static check_create_device_ret check_create_device(
254-
const std::string &path,
255-
size_t size)
256-
{
257-
LOG_PREFIX(block_check_create_device);
258-
INFO("path={}, size=0x{:x}", path, size);
259-
return seastar::open_file_dma(
260-
path,
261-
seastar::open_flags::exclusive |
262-
seastar::open_flags::rw |
263-
seastar::open_flags::create
264-
).then([size, FNAME, &path](auto file) {
265-
return seastar::do_with(
266-
file,
267-
[size, FNAME, &path](auto &f) -> seastar::future<>
268-
{
269-
DEBUG("path={} created, truncating to 0x{:x}", path, size);
270-
ceph_assert(f);
271-
return f.truncate(
272-
size
273-
).then([&f, size] {
274-
return f.allocate(0, size);
275-
}).finally([&f] {
276-
return f.close();
277-
});
278-
});
279-
}).then_wrapped([&path, FNAME](auto f) -> check_create_device_ret {
280-
if (f.failed()) {
281-
try {
282-
f.get();
283-
return seastar::now();
284-
} catch (const std::system_error &e) {
285-
if (e.code().value() == EEXIST) {
286-
ERROR("path={} exists", path);
287-
return seastar::now();
288-
} else {
289-
ERROR("path={} creation error -- {}", path, e);
290-
return crimson::ct_error::input_output_error::make();
291-
}
292-
} catch (...) {
293-
ERROR("path={} creation error", path);
294-
return crimson::ct_error::input_output_error::make();
295-
}
296-
}
297-
298-
DEBUG("path={} complete", path);
299-
std::ignore = f.discard_result();
300-
return seastar::now();
301-
});
302-
}
303-
304251
using open_device_ret =
305252
BlockSegmentManager::access_ertr::future<
306253
std::pair<seastar::file, seastar::stat_data>

0 commit comments

Comments
 (0)