@@ -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