diff --git a/ydb/tools/cfg/base.py b/ydb/tools/cfg/base.py index 3fc570089087..e8823c75d35f 100644 --- a/ydb/tools/cfg/base.py +++ b/ydb/tools/cfg/base.py @@ -313,6 +313,7 @@ def __init__(self, template, host_info_provider, validator=None, database=None, self.table_profiles_config = self.__cluster_description.get("table_profiles_config") self.http_proxy_config = self.__cluster_description.get("http_proxy_config") self.blob_storage_config = self.__cluster_description.get("blob_storage_config") + self.infer_pdisk_slot_count = self._extract_infer_pdisk_slot_count(self.blob_storage_config) self.bootstrap_config = self.__cluster_description.get("bootstrap_config") self.memory_controller_config = self.__cluster_description.get("memory_controller_config") self.kafka_proxy_config = self.__cluster_description.get("kafka_proxy_config") @@ -359,6 +360,15 @@ def get_subjective_description(objective_description, tenant, validator): subjective_description.validate() return subjective_description + def _extract_infer_pdisk_slot_count(self, blob_storage_config): + if blob_storage_config is None: + return None + if 'infer_pdisk_slot_count' not in blob_storage_config: + return None + infer_pdisk_slot_count = blob_storage_config['infer_pdisk_slot_count'] + del blob_storage_config['infer_pdisk_slot_count'] + return infer_pdisk_slot_count + @property def storage_config_generation(self): return self.__cluster_description.get("storage_config_generation", 0) diff --git a/ydb/tools/cfg/dynamic.py b/ydb/tools/cfg/dynamic.py index 225b39e2fe0a..9e61293eafd1 100644 --- a/ydb/tools/cfg/dynamic.py +++ b/ydb/tools/cfg/dynamic.py @@ -192,6 +192,12 @@ def add_drive(array, drive): if drive.expected_slot_count is not None: pc = pdisk_config.TPDiskConfig(ExpectedSlotCount=drive.expected_slot_count) kwargs.update(PDiskConfig=pc) + + if self._cluster_details.infer_pdisk_slot_count is not None: + infer_settings = self._cluster_details.infer_pdisk_slot_count.get(str(drive.type).lower()) + if infer_settings is not None: + kwargs.update(InferPDiskSlotCountFromUnitSize=infer_settings['unit_size']) + kwargs.update(InferPDiskSlotCountMax=infer_settings['max_slots']) array.add(**kwargs) for host_config in self._cluster_details.host_configs: diff --git a/ydb/tools/cfg/static.py b/ydb/tools/cfg/static.py index 824b5ef1bab0..2593b5d0c458 100644 --- a/ydb/tools/cfg/static.py +++ b/ydb/tools/cfg/static.py @@ -459,6 +459,29 @@ def normalize_dictionary(self, yaml_config): return yaml_config return result + def _apply_infer_pdisk_slot_count_to_host_config(self, host_config): + infer_settings = self.__cluster_details.infer_pdisk_slot_count + if infer_settings is None: + return + + target_cfg = { + 'infer_pdisk_slot_count_from_unit_size': {}, + 'infer_pdisk_slot_count_max': {}, + } + + ssd_settings = infer_settings.get('ssd') + if ssd_settings: + target_cfg['infer_pdisk_slot_count_from_unit_size']['ssd'] = ssd_settings['unit_size'] + target_cfg['infer_pdisk_slot_count_max']['ssd'] = ssd_settings['max_slots'] + + rot_settings = infer_settings.get('rot') + if rot_settings: + target_cfg['infer_pdisk_slot_count_from_unit_size']['rot'] = rot_settings['unit_size'] + target_cfg['infer_pdisk_slot_count_max']['rot'] = rot_settings['max_slots'] + + if target_cfg["infer_pdisk_slot_count_from_unit_size"]: + host_config.update(target_cfg) + def get_normalized_config(self): app_config = self.get_app_config() dictionary = json_format.MessageToDict(app_config, preserving_proto_field_name=True) @@ -496,6 +519,8 @@ def get_normalized_config(self): drive['pdisk_config'] = self.normalize_dictionary(json_format.MessageToDict(pd)) + self._apply_infer_pdisk_slot_count_to_host_config(host_config) + if self.table_service_config: normalized_config["table_service_config"] = self.table_service_config