From 3b9632696a5e0b4e02c8ac32ba8ab8b00ee7a005 Mon Sep 17 00:00:00 2001 From: Matan Breizman Date: Thu, 4 Sep 2025 12:08:53 +0000 Subject: [PATCH] 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 --- src/crimson/os/seastore/segment_manager/block.cc | 16 +++++++++++++++- 1 file changed, 15 insertions(+), 1 deletion(-) diff --git a/src/crimson/os/seastore/segment_manager/block.cc b/src/crimson/os/seastore/segment_manager/block.cc index a372e069eb9..e5dfabbb15c 100644 --- a/src/crimson/os/seastore/segment_manager/block.cc +++ b/src/crimson/os/seastore/segment_manager/block.cc @@ -499,6 +499,8 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::mkfs( ).safe_then([this] { return shard_devices.invoke_on_all([](auto &local_device) { return local_device.shard_mkfs( + // TODO: It would make more sense to pass the error further + // to the caller but invoke_on_all expectes a seastar::future ).handle_error( crimson::ct_error::assert_all{ "Invalid error in BlockSegmentManager::mkfs" @@ -520,7 +522,6 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::primary_mkfs( seastar::stat_data stat; block_sm_superblock_t sb; std::unique_ptr tracker; - using crimson::common::get_conf; if (get_conf("seastore_block_create")) { auto size = get_conf("seastore_device_size"); @@ -533,6 +534,19 @@ BlockSegmentManager::mkfs_ret BlockSegmentManager::primary_mkfs( std::ignore = device.close(); }); sb = make_superblock(get_device_id(), sm_config, stat); + rewrite_gen_t hot_tier_generations = crimson::common::get_conf( + "seastore_hot_tier_generations"); + rewrite_gen_t cold_tier_generations = crimson::common::get_conf( + "seastore_cold_tier_generations"); + if (std::cmp_less(sb.shard_infos[0].segments, + (hot_tier_generations + cold_tier_generations + 1))) { + // TODO: cold device might not be used, for now assume it would be + ERROR("Not enough available segments to open! " + "Consider increasing the device size (needed {} got {})", + (hot_tier_generations + cold_tier_generations + 1), + sb.shard_infos[0].segments); + co_await mkfs_ertr::future<>(crimson::ct_error::enoent::make()); + } stats.metadata_write.increment(ceph::encoded_sizeof(sb)); co_await write_superblock(get_device_id(), device, sb); INFO("{} complete", device_id_printer_t{get_device_id()}); -- 2.39.5