]> git.apps.os.sepia.ceph.com Git - ceph-ci.git/commitdiff
crimson/os/seastore/segment_manager: Check segments prior to mkfs
authorMatan Breizman <mbreizma@redhat.com>
Thu, 4 Sep 2025 12:08:53 +0000 (12:08 +0000)
committerMatan Breizman <mbreizma@redhat.com>
Mon, 15 Sep 2025 12:39:16 +0000 (12:39 +0000)
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 <mbreizma@redhat.com>
src/crimson/os/seastore/segment_manager/block.cc

index a372e069eb914bccedeb3bdf5a5bb368dd6d2afd..e5dfabbb15c8b05759c00234413244b27cab1cf6 100644 (file)
@@ -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<SegmentStateTracker> tracker;
-
   using crimson::common::get_conf;
   if (get_conf<bool>("seastore_block_create")) {
     auto size = get_conf<Option::size_t>("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<uint64_t>(
+    "seastore_hot_tier_generations");
+  rewrite_gen_t cold_tier_generations = crimson::common::get_conf<uint64_t>(
+    "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<block_sm_superblock_t>(sb));
   co_await write_superblock(get_device_id(), device, sb);
   INFO("{} complete", device_id_printer_t{get_device_id()});