Skip to content

Commit 3b96326

Browse files
committed
crimson/os/seastore/segment_manager: Check segments prior to mkfs
Verify Segment count for prior to mkfs * ExtentPlacementManager::init - dynamic_max_rewrite_generation segments * SegmentedJournal segment (1) Fixes: https://tracker.ceph.com/issues/72484 Signed-off-by: Matan Breizman <[email protected]>
1 parent 46b6632 commit 3b96326

File tree

1 file changed

+15
-1
lines changed
  • src/crimson/os/seastore/segment_manager

1 file changed

+15
-1
lines changed

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

Lines changed: 15 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -499,6 +499,8 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::mkfs(
499499
).safe_then([this] {
500500
return shard_devices.invoke_on_all([](auto &local_device) {
501501
return local_device.shard_mkfs(
502+
// TODO: It would make more sense to pass the error further
503+
// to the caller but invoke_on_all expectes a seastar::future
502504
).handle_error(
503505
crimson::ct_error::assert_all{
504506
"Invalid error in BlockSegmentManager::mkfs"
@@ -520,7 +522,6 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::primary_mkfs(
520522
seastar::stat_data stat;
521523
block_sm_superblock_t sb;
522524
std::unique_ptr<SegmentStateTracker> tracker;
523-
524525
using crimson::common::get_conf;
525526
if (get_conf<bool>("seastore_block_create")) {
526527
auto size = get_conf<Option::size_t>("seastore_device_size");
@@ -533,6 +534,19 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::primary_mkfs(
533534
std::ignore = device.close();
534535
});
535536
sb = make_superblock(get_device_id(), sm_config, stat);
537+
rewrite_gen_t hot_tier_generations = crimson::common::get_conf<uint64_t>(
538+
"seastore_hot_tier_generations");
539+
rewrite_gen_t cold_tier_generations = crimson::common::get_conf<uint64_t>(
540+
"seastore_cold_tier_generations");
541+
if (std::cmp_less(sb.shard_infos[0].segments,
542+
(hot_tier_generations + cold_tier_generations + 1))) {
543+
// TODO: cold device might not be used, for now assume it would be
544+
ERROR("Not enough available segments to open! "
545+
"Consider increasing the device size (needed {} got {})",
546+
(hot_tier_generations + cold_tier_generations + 1),
547+
sb.shard_infos[0].segments);
548+
co_await mkfs_ertr::future<>(crimson::ct_error::enoent::make());
549+
}
536550
stats.metadata_write.increment(ceph::encoded_sizeof<block_sm_superblock_t>(sb));
537551
co_await write_superblock(get_device_id(), device, sb);
538552
INFO("{} complete", device_id_printer_t{get_device_id()});

0 commit comments

Comments
 (0)