LCOV - code coverage report
Current view: top level - legacy/ascend910/framework/common/src/config - env_config.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 72.4 % 435 315
Test Date: 2026-07-28 12:11:00 Functions: 77.5 % 40 31

            Line data    Source code
       1              : /**
       2              :  * Copyright (c) 2025 Huawei Technologies Co., Ltd.
       3              :  * This program is free software, you can redistribute it and/or modify it under the terms and conditions of
       4              :  * CANN Open Software License Agreement Version 2.0 (the "License").
       5              :  * Please refer to the License for details. You may not use this file except in compliance with the License.
       6              :  * THIS SOFTWARE IS PROVIDED ON AN "AS IS" BASIS, WITHOUT WARRANTIES OF ANY KIND, EITHER EXPRESS OR IMPLIED,
       7              :  * INCLUDING BUT NOT LIMITED TO NON-INFRINGEMENT, MERCHANTABILITY, OR FITNESS FOR A PARTICULAR PURPOSE.
       8              :  * See LICENSE in the root of the software repository for the full text of the License.
       9              :  */
      10              : 
      11              : #include "env_config.h"
      12              : #include <algorithm>
      13              : #include <mutex>
      14              : #include <sstream>
      15              : #include <string>
      16              : #include "adapter_error_manager_pub.h"
      17              : #include "log.h"
      18              : #include "sal_pub.h"
      19              : #include "mmpa_api.h"
      20              : #include "config_log.h"
      21              : #include "adapter_rts_common.h"
      22              : 
      23              : using namespace hccl;
      24              : 
      25              : static std::mutex g_envConfigMutex;
      26              : 
      27              : constexpr char ENV_EMPTY_STRING[] = "EmptyString";
      28              : 
      29              : constexpr char HCCL_AUTO_PORT_CONFIG[] = "auto"; // 端口范围配置为auto时,由OS分配浮动监听端口
      30              : constexpr u32 MAX_PORT_NUMBER = 65535; // 合法端口号的上限
      31              : constexpr u32 HCCL_SOCKET_PORT_RANGE_AUTO = 0; // 需要保留的
      32              : const std::string CLUSTER_HEART_CONFIG = "cluster_heartbeat:";
      33              : const std::string STUCK_DETECTION_CONFIG = "stuck_detection:";
      34              : const std::string INCONSISTENT_CHECK_CONFIG = "inconsistent_check:";
      35              : const std::string CONNECTION_FAULT_DETECTION_TIME = "connection_fault_detection_time:";
      36              : const std::string TASK_MONITOR_INTERVAL = "task_monitor_interval:";
      37              : constexpr static const s32 HCCL_MAX_LINK_TIME_OUT_S  = (120 * 60); // HCCL 最大探测超时时间设置为120*60s
      38          257 : HcclResult InitEnvConfig()
      39              : {
      40          257 :     std::lock_guard<std::mutex> lock(g_envConfigMutex);
      41          257 :     if (g_envConfig.initialized) {
      42          252 :         return HCCL_SUCCESS;
      43              :     }
      44              :     // 初始化环境变量
      45            5 :     CHK_RET(InitEnvParam());
      46              : 
      47            5 :     g_envConfig.initialized = true;
      48              : 
      49            5 :     return HCCL_SUCCESS;
      50          257 : }
      51              : 
      52           49 : bool GetExternalInputHostPortSwitch()
      53              : {
      54           49 :     std::lock_guard<std::mutex> lock(g_envConfigMutex);
      55           49 :     return g_envConfig.hostSocketPortSwitch;
      56           49 : }
      57              : 
      58          498 : bool GetExternalInputNpuPortSwitch()
      59              : {
      60          498 :     std::lock_guard<std::mutex> lock(g_envConfigMutex);
      61          498 :     return g_envConfig.npuSocketPortSwitch;
      62          498 : }
      63              : 
      64          234 : const u32& EnvConfig::GetExternalInputRdmaTrafficClass()
      65              : {
      66          234 :     return g_envConfig.rdmaTrafficClass;
      67              : }
      68              : 
      69          234 : const u32& EnvConfig::GetExternalInputRdmaServerLevel()
      70              : {
      71          234 :     return g_envConfig.rdmaServerLevel;
      72              : }
      73              : 
      74            0 : const u32& EnvConfig::GetExternalInputRdmaTimeOut()
      75              : {
      76            0 :     return g_envConfig.rdmaTimeOut;
      77              : }
      78              : 
      79            0 : const u32& EnvConfig::GetExternalInputRdmaRetryCnt()
      80              : {
      81            0 :     return g_envConfig.rdmaRetryCnt;
      82              : }
      83              : 
      84            1 : const std::vector<HcclSocketPortRange> &GetExternalInputHostSocketPortRange()
      85              : {
      86            1 :     std::lock_guard<std::mutex> lock(g_envConfigMutex);
      87            1 :     return g_envConfig.hostSocketPortRange;
      88            1 : }
      89              : 
      90            0 : const std::vector<HcclSocketPortRange> &GetExternalInputNpuSocketPortRange()
      91              : {
      92            0 :     std::lock_guard<std::mutex> lock(g_envConfigMutex);
      93            0 :     return g_envConfig.npuSocketPortRange;
      94            0 : }
      95              : 
      96           38 : s32& GetExternalInputDfsConnectionFaultDetectionTime()
      97              : {
      98           38 :     return g_envConfig.dfsConnectionFaultDetectionTime;
      99              : }
     100              : 
     101            0 : u32& GetExternalInputDfsTaskMonitorInterval()
     102              : {
     103            0 :     return g_envConfig.dfsTaskMonitorInterval;
     104              : }
     105              : 
     106            0 : HcclResult ResetEnvConfigInitState()
     107              : {
     108            0 :     g_envConfig.SetDefaultParams();
     109            0 :     return HCCL_SUCCESS;
     110              : }
     111              : 
     112           52 : HcclResult InitEnvParam()
     113              : {
     114           52 :     HcclResult ret = ParseHostSocketPortRange();
     115           52 :     char* mmSysGetHostEnvValue = nullptr;
     116           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_HOST_SOCKET_PORT_RANGE, mmSysGetHostEnvValue);
     117           52 :     std::string hostSocketPortRangeEnv = (mmSysGetHostEnvValue != nullptr) ? mmSysGetHostEnvValue : "EmptyString";
     118           52 :     RPT_ENV_ERR(ret != HCCL_SUCCESS,
     119              :         "EI0001",
     120              :         std::vector<std::string>({"value", "env", "expect"}),
     121              :         std::vector<std::string>({hostSocketPortRangeEnv, "HCCL_HOST_SOCKET_PORT_RANGE",
     122              :         "a valid port range in the format of port1-port2, where port1 and port2 are valid port numbers (0-65535)"}));
     123           52 :     CHK_PRT_RET(ret != HCCL_SUCCESS,
     124              :         HCCL_ERROR("[%s][%s]errNo[0x%016llx] In init environment param, parse "
     125              :                    "HCCL_HOST_SOCKET_PORT_RANGE failed. errorno[%d]",
     126              :             LOG_KEYWORDS_INIT_GROUP.c_str(),
     127              :             LOG_KEYWORDS_ENV_CONFIG.c_str(),
     128              :             HCCL_ERROR_CODE(ret),
     129              :             ret),
     130              :         ret);
     131              : 
     132           52 :     ret = ParseNpuSocketPortRange();
     133           52 :     char* mmSysGetNpuEnvValue = nullptr;
     134           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_NPU_SOCKET_PORT_RANGE, mmSysGetNpuEnvValue);
     135           52 :     std::string npuSocketPortRangeEnv = (mmSysGetNpuEnvValue != nullptr) ? mmSysGetNpuEnvValue : "EmptyString";
     136           52 :     RPT_ENV_ERR(ret != HCCL_SUCCESS,
     137              :         "EI0001",
     138              :         std::vector<std::string>({"value", "env", "expect"}),
     139              :         std::vector<std::string>({npuSocketPortRangeEnv, "HCCL_NPU_SOCKET_PORT_RANGE",
     140              :         "a valid port range in the format of port1-port2, where port1 and port2 are valid port numbers (0-65535)"}));
     141           52 :     CHK_PRT_RET(ret != HCCL_SUCCESS,
     142              :         HCCL_ERROR("[%s][%s]errNo[0x%016llx] In init environment param, parse "
     143              :                    "HCCL_NPU_SOCKET_PORT_RANGE failed. errorno[%d]",
     144              :             LOG_KEYWORDS_INIT_GROUP.c_str(),
     145              :             LOG_KEYWORDS_ENV_CONFIG.c_str(),
     146              :             HCCL_ERROR_CODE(ret),
     147              :             ret),
     148              :         ret);
     149              : 
     150           52 :     ret = ParseDFSConfig();
     151           52 :     char* dfsConfigValue = nullptr;
     152           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_DFS_CONFIG, dfsConfigValue);
     153           52 :     std::string dfsConfigEnv = (dfsConfigValue != nullptr) ? dfsConfigValue : "EmptyString";
     154           52 :     RPT_ENV_ERR(ret != HCCL_SUCCESS,
     155              :         "EI0001",
     156              :         std::vector<std::string>({"value", "env", "expect"}),
     157              :         std::vector<std::string>({dfsConfigEnv, "HCCL_DFS_CONFIG", "comma-separated key-value pairs (e.g., cluter_heartbeat=on,stuck_detection=off)"}));
     158           52 :     CHK_PRT_RET(ret != HCCL_SUCCESS,
     159              :         HCCL_ERROR("[%s][%s]errNo[0x%016llx] In init environment param, parse "
     160              :                    "HCCL_DFS_CONFIG failed. errorno[%d]",
     161              :             LOG_KEYWORDS_INIT_GROUP.c_str(),
     162              :             LOG_KEYWORDS_ENV_CONFIG.c_str(),
     163              :             HCCL_ERROR_CODE(ret),
     164              :             ret),
     165              :         ret);
     166              : 
     167           52 :     ret = g_envConfig.ParseRDMATrafficClass();
     168           52 :     char* mmSysGetTrafficClassEnvValue = nullptr;
     169           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_RDMA_TC, mmSysGetTrafficClassEnvValue);
     170           52 :     std::string mmSysGetTrafficClassEnv = (mmSysGetTrafficClassEnvValue != nullptr) ? mmSysGetTrafficClassEnvValue : "EmptyString";
     171           52 :     RPT_ENV_ERR(ret != HCCL_SUCCESS,
     172              :         "EI0001",
     173              :         std::vector<std::string>({"value", "env", "expect"}),
     174              :         std::vector<std::string>({mmSysGetTrafficClassEnv, "HCCL_RDMA_TC", "range[0, 255], Must be a multiple of 4"}));
     175           52 :     CHK_PRT_RET(ret != HCCL_SUCCESS,
     176              :         HCCL_ERROR("[%s][%s]errNo[0x%016llx] In init environment param, parse "
     177              :                    "HCCL_RDMA_TC failed. errorno[%d]",
     178              :             LOG_KEYWORDS_INIT_GROUP.c_str(),
     179              :             LOG_KEYWORDS_ENV_CONFIG.c_str(),
     180              :             HCCL_ERROR_CODE(ret),
     181              :             ret),
     182              :         ret);
     183              : 
     184           52 :     ret = g_envConfig.ParseRDMAServerLevel();
     185           52 :     char* mmSysGetServerLevelEnvValue = nullptr;
     186           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_RDMA_SL, mmSysGetServerLevelEnvValue);
     187           52 :     std::string mmSysGetServerLevel = (mmSysGetServerLevelEnvValue != nullptr) ? mmSysGetServerLevelEnvValue : "EmptyString";
     188           52 :     RPT_ENV_ERR(ret != HCCL_SUCCESS,
     189              :         "EI0001",
     190              :         std::vector<std::string>({"value", "env", "expect"}),
     191              :         std::vector<std::string>({mmSysGetServerLevel, "HCCL_RDMA_SL", "Value range[0, 7]"}));
     192           52 :     CHK_PRT_RET(ret != HCCL_SUCCESS,
     193              :         HCCL_ERROR("[%s][%s]errNo[0x%016llx] In init environment param, parse "
     194              :                    "HCCL_RDMA_SL failed. errorno[%d]",
     195              :             LOG_KEYWORDS_INIT_GROUP.c_str(),
     196              :             LOG_KEYWORDS_ENV_CONFIG.c_str(),
     197              :             HCCL_ERROR_CODE(ret),
     198              :             ret),
     199              :         ret);
     200              : 
     201              :     // 解析RDMATimeOut
     202           52 :     std::pair<u32, u32> rdmaTimeOutRange;
     203           52 :     ret = g_envConfig.ParseRDMATimeOut(rdmaTimeOutRange);
     204           52 :     char* mmSysGetTimeOutEnvValue = nullptr;
     205           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_RDMA_TIMEOUT, mmSysGetTimeOutEnvValue);
     206           52 :     std::string timeOutEnv = (mmSysGetTimeOutEnvValue != nullptr) ? mmSysGetTimeOutEnvValue : "EmptyString";
     207              :     std::string vaildRange =
     208           52 :         "range[" + std::to_string(rdmaTimeOutRange.first) + " ," + std::to_string(rdmaTimeOutRange.second) + "]";
     209           52 :     RPT_ENV_ERR(ret != HCCL_SUCCESS,
     210              :         "EI0001",
     211              :         std::vector<std::string>({"value", "env", "expect"}),
     212              :         std::vector<std::string>({timeOutEnv, "HCCL_RDMA_TIMEOUT", vaildRange}));
     213           52 :     CHK_PRT_RET(ret != HCCL_SUCCESS,
     214              :         HCCL_ERROR("[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_RDMA_TIMEOUT failed. errorno[%d]",
     215              :             LOG_KEYWORDS_INIT_GROUP.c_str(),
     216              :             LOG_KEYWORDS_ENV_CONFIG.c_str(),
     217              :             HCCL_ERROR_CODE(ret),
     218              :             ret),
     219              :         ret);
     220              : 
     221              :     // 解析RDMARetryCnt
     222           52 :     ret = g_envConfig.ParseRDMARetryCnt();
     223           52 :     char* mmSysGetRetryCntEnvValue = nullptr;
     224           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_RDMA_RETRY_CNT, mmSysGetRetryCntEnvValue);
     225           52 :     std::string retryCntEnv = (mmSysGetRetryCntEnvValue != nullptr) ? mmSysGetRetryCntEnvValue : "EmptyString";
     226           52 :     RPT_ENV_ERR(ret != HCCL_SUCCESS,
     227              :         "EI0001",
     228              :         std::vector<std::string>({"value", "env", "expect"}),
     229              :         std::vector<std::string>({retryCntEnv, "HCCL_RDMA_RETRY_CNT", "range[1, 7]"}));
     230           52 :     CHK_PRT_RET(ret != HCCL_SUCCESS,
     231              :         HCCL_ERROR("[%s][%s]errNo[0x%016llx] In init env variable param, parse HCCL_RDMA_RETRY_CNT failed. errorno[%d]",
     232              :             LOG_KEYWORDS_INIT_GROUP.c_str(),
     233              :             LOG_KEYWORDS_ENV_CONFIG.c_str(),
     234              :             HCCL_ERROR_CODE(ret),
     235              :             ret),
     236              :         ret);
     237              : 
     238           52 :     ret = InitDebugConfigByEnv();
     239           52 :     char* env = nullptr; // 环境变量值
     240           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_DEBUG_CONFIG, env);
     241          143 :     std::string envValue = env ? std::string(env) : "null";
     242           52 :     RPT_ENV_ERR(ret != HCCL_SUCCESS,
     243              :         "EI0001",
     244              :         std::vector<std::string>({"value", "env", "expect"}),
     245              :         std::vector<std::string>({envValue, "HCCL_DEBUG_CONFIG", "ALG,TASK,RESOURCE(optionally prefixed with'^'"}));
     246           52 :     CHK_PRT_RET(ret != HCCL_SUCCESS,
     247              :         HCCL_ERROR("[%s][%s]errNo[0x%016llx] In init environment param, parse "
     248              :                    "HCCL_DEBUG_CONFIG failed. errorno[%d]",
     249              :             LOG_KEYWORDS_INIT_GROUP.c_str(),
     250              :             LOG_KEYWORDS_ENV_CONFIG.c_str(),
     251              :             HCCL_ERROR_CODE(ret),
     252              :             ret),
     253              :         ret);
     254              : 
     255              :     // 解析算法配置
     256           52 :     ret = ParseHcclAlgo();
     257           52 :     char* mmSysGetEnvValue = nullptr;
     258           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_ALGO, mmSysGetEnvValue);
     259           52 :     std::string hcclAlgo = (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString";
     260           52 :     RPT_ENV_ERR(ret != HCCL_SUCCESS,
     261              :         "EI0001",
     262              :         std::vector<std::string>({"value", "env", "expect"}),
     263              :         std::vector<std::string>({hcclAlgo, "HCCL_ALGO",
     264              :             "level0:NA;level1:<algo> or <op0>=level0:NA;level1:<algo0>/<op1>=level0:NA;level1:<algo1>"}));
     265           52 :     CHK_PRT_RET(ret != HCCL_SUCCESS,
     266              :         HCCL_ERROR("[%s][%s]errNo[0x%016llx] In init env variable param, parse "
     267              :                    "hccl algorithm config failed. errorno[%d]",
     268              :             LOG_KEYWORDS_INIT_GROUP.c_str(),
     269              :             LOG_KEYWORDS_ENV_CONFIG.c_str(),
     270              :             HCCL_ERROR_CODE(ret),
     271              :             ret),
     272              :         ret);
     273           52 :     return HCCL_SUCCESS;
     274           52 : }
     275              : 
     276            0 : bool EnvConfig::CheckEnvLen(const char *envStr, u32 envMaxLen)
     277              : {
     278              :     // 校验环境变量长度
     279            0 :     u32 envLen = strnlen(envStr, envMaxLen + 1);
     280            0 :     if (envLen == (envMaxLen + 1)) {
     281            0 :         HCCL_ERROR("[CheckEnvLen] errNo[0x%016llx] env len is invalid, len is %u", HCCL_ERROR_CODE(HCCL_E_PARA), envLen);
     282            0 :         return false;
     283              :     }
     284            0 :     return true;
     285              : }
     286              : 
     287          103 : HcclResult SetDefaultSocketPortRange(const SocketLocation &socketLoc, std::vector<HcclSocketPortRange> &portRangeVec)
     288              : {
     289          103 :     if (socketLoc == SOCKET_HOST) {
     290           51 :         g_envConfig.hostSocketPortSwitch = false;
     291           51 :         portRangeVec.clear();
     292           51 :         HCCL_RUN_WARNING("[HCCL_ENV] HCCL_HOST_SOCKET_PORT_RANGE is not set. Multi-process will not be supported!");
     293           52 :     } else if (socketLoc == SOCKET_NPU) {
     294           52 :         g_envConfig.npuSocketPortSwitch = false;
     295           52 :         portRangeVec.clear();
     296           52 :         HCCL_RUN_WARNING("[HCCL_ENV] HCCL_NPU_SOCKET_PORT_RANGE is not set. Multi-process will not be supported!");
     297              :     } else {
     298            0 :         HCCL_ERROR("[SetDefaultSocketPortRange] undefined socket location, fail to init socket port range by default.");
     299            0 :         return HCCL_E_NOT_SUPPORT;
     300              :     }
     301          103 :     return HCCL_SUCCESS;
     302              : }
     303              : 
     304            1 : HcclResult CheckSocketPortRangeValid(const std::string &envName, const std::vector<HcclSocketPortRange> &portRanges)
     305              : {
     306            1 :     std::vector<HcclSocketPortRange> rangeVec(portRanges.begin(), portRanges.end());
     307            1 :     std::sort(rangeVec.begin(), rangeVec.end(), [](auto &a, auto &b) {
     308            0 :         return a.min == b.min ? a.max < b.max : a.min < b.min;
     309              :     });
     310            2 :     for (size_t i = 0; i < rangeVec.size(); ++i) {
     311              :         // the socket range should not be inverted
     312            1 :         CHK_PRT_RET(rangeVec[i].min > rangeVec[i].max,
     313              :             HCCL_ERROR("[Check][PortRangeValid] In %s, in socket port range [%u, %u], "
     314              :                 "the lower bound is greater than the upper bound.",
     315              :                 envName.c_str(), rangeVec[i].min, rangeVec[i].max),
     316              :             HCCL_E_PARA);
     317              : 
     318              :         // the socket range should not include the reserved port for auto listening.
     319            1 :         CHK_PRT_RET(rangeVec[i].min <= HCCL_SOCKET_PORT_RANGE_AUTO,
     320              :             HCCL_ERROR("[Check][PortRangeValid] In %s, socket port range [%u, %u] includes "
     321              :                 "the reserved port number [%u]. please do not use port [%u] in socket port range.",
     322              :                 envName.c_str(), rangeVec[i].min, rangeVec[i].max, HCCL_SOCKET_PORT_RANGE_AUTO,
     323              :                 HCCL_SOCKET_PORT_RANGE_AUTO),
     324              :             HCCL_E_PARA);
     325              : 
     326              :         // the socket range should not exceed the maximum port number
     327            1 :         CHK_PRT_RET(rangeVec[i].max > MAX_PORT_NUMBER,
     328              :             HCCL_ERROR("[Check][PortRangeValid] In %s, in socket port range [%u, %u], "
     329              :                 "the upper bound exceed max port number[%u].",
     330              :                 envName.c_str(), rangeVec[i].min, rangeVec[i].max, MAX_PORT_NUMBER),
     331              :             HCCL_E_PARA);
     332              : 
     333              :         // the socket range should not be overlapped
     334            1 :         CHK_PRT_RET(i != 0 && rangeVec[i - 1].max >= rangeVec[i].min,
     335              :             HCCL_ERROR("[Check][PortRangeValid] In %s, "
     336              :                 "socket port range [%u, %u] is conflict with socket port range [%u, %u].",
     337              :                 envName.c_str(), rangeVec[i - 1].min, rangeVec[i - 1].max, rangeVec[i].min, rangeVec[i].max),
     338              :             HCCL_E_PARA);
     339              :     }
     340              : 
     341            1 :     return HCCL_SUCCESS;
     342            1 : }
     343              : 
     344            2 : HcclResult GetUIntFromStr(const std::string &digitStr, u32 &val)
     345              : {
     346            2 :     HcclResult ret = IsAllDigit(digitStr.c_str());
     347            2 :     CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("[GetUIntFromStr] str[%s] is not all digit.",
     348              :         digitStr.c_str()), ret);
     349            2 :     ret = SalStrToULong(digitStr.c_str(), HCCL_BASE_DECIMAL, val);
     350            2 :     CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("[GetUIntFromStr] str[%s] is a invalid number.",
     351              :         digitStr.c_str()), ret);
     352            2 :     return HCCL_SUCCESS;
     353              : }
     354              : 
     355            2 : bool SplitString(std::string &totalStr, std::string &prefixStr, const std::string &delim)
     356              : {
     357            2 :     std::size_t found = totalStr.find(delim);
     358            2 :     if (found == std::string::npos) {
     359            1 :         return false;
     360              :     }
     361            1 :     prefixStr = totalStr.substr(0, found);
     362            1 :     totalStr = totalStr.substr(found + 1);
     363            1 :     return true;
     364              : }
     365              : 
     366            1 : HcclResult SplitSinglePortRange(const std::string &envName, std::string &rangeStr, HcclSocketPortRange &portRange)
     367              : {
     368            1 :     std::string rangeMin{};
     369            1 :     const std::string delim = "-";
     370            1 :     if (SplitString(rangeStr, rangeMin, delim)) {
     371            1 :         CHK_RET(GetUIntFromStr(rangeMin, portRange.min));
     372            1 :         CHK_RET(GetUIntFromStr(rangeStr, portRange.max));
     373              :     } else {
     374            0 :         CHK_RET(GetUIntFromStr(rangeStr, portRange.min));
     375            0 :         portRange.max = portRange.min;
     376              :     }
     377            1 :     HCCL_INFO("[Split][SinglePortRange] Load hccl socket port range [%u, %u] from %s",
     378              :         portRange.min, portRange.max, envName.c_str());
     379            1 :     return HCCL_SUCCESS;
     380            1 : }
     381              : 
     382            1 : HcclResult SplitHcclSocketPortRange(const std::string &envName, std::string &portRangeConfig,
     383              :     std::vector<HcclSocketPortRange> &portRangeVec)
     384              : {
     385            1 :     std::string rangeStr{};
     386            1 :     const std::string delim = ",";
     387            1 :     while (SplitString(portRangeConfig, rangeStr, delim)) {
     388            0 :         HcclSocketPortRange portRange = {};
     389            0 :         CHK_RET(SplitSinglePortRange(envName, rangeStr, portRange));
     390            0 :         portRangeVec.emplace_back(portRange);
     391              :     }
     392            1 :     HcclSocketPortRange portRange = {};
     393            1 :     CHK_RET(SplitSinglePortRange(envName, portRangeConfig, portRange));
     394            1 :     portRangeVec.emplace_back(portRange);
     395              : 
     396            1 :     CHK_RET(CheckSocketPortRangeValid(envName, portRangeVec));
     397            1 :     return HCCL_SUCCESS;
     398            1 : }
     399              : 
     400            1 : HcclResult PortRangeSwitchOn(const SocketLocation &socketLoc)
     401              : {
     402            1 :     if (socketLoc == SOCKET_HOST) {
     403            1 :         g_envConfig.hostSocketPortSwitch = true;
     404            1 :         HCCL_INFO("HCCL_HOST_SOCKET_PORT_RANGE is set, switch on.");
     405            0 :     } else if (socketLoc == SOCKET_NPU) {
     406            0 :         g_envConfig.npuSocketPortSwitch = true;
     407            0 :         HCCL_INFO("HCCL_NPU_SOCKET_PORT_RANGE is set, switch on.");
     408              :     } else {
     409            0 :         HCCL_ERROR("[PortRangeSwitchOn] undefined socket location, fail to init socket port range by default.");
     410            0 :         return HCCL_E_NOT_SUPPORT;
     411              :     }
     412            1 :     return HCCL_SUCCESS;
     413              : }
     414              : 
     415            1 : void PrintSocketPortRange(const std::string &envName, const std::vector<HcclSocketPortRange> &portRangeVec)
     416              : {
     417              :     // assemble port ranges into a string to print the result range
     418            1 :     std::ostringstream portRangeOss;
     419            2 :     for (auto range : portRangeVec) {
     420            1 :         portRangeOss << " [" << std::to_string(range.min) << ", " << std::to_string(range.max) << "]";
     421              :     }
     422            1 :     HCCL_RUN_INFO("%s is set to%s.", envName.c_str(), portRangeOss.str().c_str());
     423            1 : }
     424              : 
     425          104 : HcclResult SetSocketPortRange(const std::string &envName, const std::string &socketPortRange,
     426              :     const SocketLocation &socketLoc, std::vector<HcclSocketPortRange> &portRangeVec)
     427              : {
     428          104 :     portRangeVec.clear();
     429              : 
     430              :     // the environment variable is not set
     431          104 :     if (socketPortRange.compare(ENV_EMPTY_STRING) == 0) {
     432          103 :         CHK_RET(SetDefaultSocketPortRange(socketLoc, portRangeVec));
     433          103 :         return HCCL_SUCCESS;
     434              :     }
     435              : 
     436              :     // the socket port range is set to auto, then the os will listen on the ports dynamically and automatically.
     437            1 :     if (socketPortRange.compare(HCCL_AUTO_PORT_CONFIG) == 0) {
     438            0 :         HcclSocketPortRange autoSocketPortRange = {
     439              :             HCCL_SOCKET_PORT_RANGE_AUTO,
     440              :             HCCL_SOCKET_PORT_RANGE_AUTO
     441              :         };
     442            0 :         portRangeVec.emplace_back(autoSocketPortRange);
     443            0 :         CHK_RET(PortRangeSwitchOn(socketLoc));
     444            0 :         HCCL_RUN_INFO("%s is set to %s as [%u, %u].", envName.c_str(), HCCL_AUTO_PORT_CONFIG,
     445              :             autoSocketPortRange.min, autoSocketPortRange.max);
     446            0 :         return HCCL_SUCCESS;
     447              :     }
     448              : 
     449            1 :     std::string portRangeConfig = socketPortRange;
     450              :     // the environment variable is set to an empty string
     451            1 :     portRangeConfig.erase(std::remove(portRangeConfig.begin(), portRangeConfig.end(), ' '), portRangeConfig.end());
     452            1 :     if (portRangeConfig.empty()) {
     453            0 :         CHK_RET(SetDefaultSocketPortRange(socketLoc, portRangeVec));
     454            0 :         return HCCL_SUCCESS;
     455              :     }
     456              :     // load ranges from string
     457            1 :     CHK_RET(SplitHcclSocketPortRange(envName, portRangeConfig, portRangeVec));
     458            1 :     if (portRangeVec.size() == 0) {
     459            0 :         HCCL_ERROR("Load empty port range from %s, please check.", envName.c_str());
     460            0 :         return HCCL_E_PARA;
     461              :     }
     462            1 :     CHK_RET(PortRangeSwitchOn(socketLoc));
     463            1 :     (void) PrintSocketPortRange(envName, portRangeVec);
     464            1 :     return HCCL_SUCCESS;
     465            1 : }
     466              : 
     467           52 : HcclResult ParseHostSocketPortRange()
     468              : {
     469           52 :     DevType deviceType = DevType::DEV_TYPE_COUNT;
     470           52 :     CHK_RET(hrtGetDeviceType(deviceType));
     471           52 :     if (deviceType != DevType::DEV_TYPE_910
     472            1 :         && deviceType != DevType::DEV_TYPE_910B
     473            1 :         && deviceType != DevType::DEV_TYPE_910_93) {
     474            0 :         g_envConfig.hostSocketPortSwitch = false;
     475            0 :         g_envConfig.hostSocketPortRange.clear();
     476            0 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_HOST_SOCKET_PORT_RANGE is not supported on devType[%u], nothing is loaded.", deviceType);
     477            0 :         return HCCL_SUCCESS;
     478              :     }
     479              : 
     480           52 :     char* mmSysGetEnvValue = nullptr;
     481           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_HOST_SOCKET_PORT_RANGE, mmSysGetEnvValue);
     482           52 :     std::string hostSocketPortRangeEnv = (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString";
     483          156 :     CHK_RET(SetSocketPortRange("HCCL_HOST_SOCKET_PORT_RANGE", hostSocketPortRangeEnv, SOCKET_HOST,
     484              :         g_envConfig.hostSocketPortRange));
     485           52 :     return HCCL_SUCCESS;
     486           52 : }
     487              : 
     488           52 : HcclResult ParseNpuSocketPortRange()
     489              : {
     490           52 :     DevType deviceType = DevType::DEV_TYPE_COUNT;
     491           52 :     CHK_RET(hrtGetDeviceType(deviceType));
     492           52 :     if (deviceType != DevType::DEV_TYPE_910
     493            1 :         && deviceType != DevType::DEV_TYPE_910B
     494            1 :         && deviceType != DevType::DEV_TYPE_910_93) {
     495            0 :         g_envConfig.npuSocketPortSwitch = false;
     496            0 :         g_envConfig.npuSocketPortRange.clear();
     497            0 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_NPU_SOCKET_PORT_RANGE is not supported on devType[%u], nothing is loaded.", deviceType);
     498            0 :         return HCCL_SUCCESS;
     499              :     }
     500           52 :     char* mmSysGetEnvValue = nullptr;
     501           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_NPU_SOCKET_PORT_RANGE, mmSysGetEnvValue);
     502           52 :     std::string npuSocketPortRangeEnv = (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString";
     503          156 :     CHK_RET(SetSocketPortRange("HCCL_NPU_SOCKET_PORT_RANGE", npuSocketPortRangeEnv, SOCKET_NPU,
     504              :         g_envConfig.npuSocketPortRange));
     505           52 :     return HCCL_SUCCESS;
     506           52 : }
     507              : 
     508              : // 通用的环境变量解析函数
     509          104 : HcclResult ParseEnvConfig(const EnvConfigParam& param, std::string& envValue, u32& resultValue)
     510              : {
     511          104 :     if (envValue.compare(ENV_EMPTY_STRING) == 0) {
     512          104 :         HCCL_RUN_INFO("%s set by default to [%u]", param.envName.c_str(), param.defaultValue);
     513          104 :         resultValue = param.defaultValue;
     514          104 :         return HCCL_SUCCESS;
     515              :     }
     516              : 
     517              :     // 校验环境变量长度
     518            0 :     bool isEnvLenValid = g_envConfig.CheckEnvLen(envValue.c_str(), g_envConfig.MAX_LEN_OF_DIGIT_ENV);
     519            0 :     CHK_PRT_RET(!isEnvLenValid,
     520              :         HCCL_ERROR("[Parse][%s] errNo[0x%016llx] Invalid %s env len, len is bigger than [%u], errorno[%d]",
     521              :         param.envName.c_str(), HCCL_ERROR_CODE(HCCL_E_PARA), param.envName.c_str(), g_envConfig.MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA),
     522              :         HCCL_E_PARA);
     523              :     
     524            0 :     CHK_RET(IsAllDigit(envValue.c_str()));
     525              :     
     526            0 :     HcclResult ret = SalStrToULong(envValue.c_str(), HCCL_BASE_DECIMAL, resultValue);
     527              :     // 若转换出错或者设置的值不在有效范围内,报错
     528            0 :     CHK_PRT_RET((ret != HCCL_SUCCESS || resultValue < param.minValue || resultValue > param.maxValue),
     529              :         HCCL_ERROR("[Parse][%s] is invalid. except: [%u, %u], actual: [%u]", param.envName.c_str(), param.minValue, param.maxValue, resultValue),
     530              :         HCCL_E_PARA);
     531              :     
     532              :     // 如果提供了baseValue,检查是否是baseValue的整数倍
     533            0 :     if (param.baseValue != 0 && resultValue % param.baseValue != 0) {
     534            0 :         HCCL_ERROR("[Parse] %s[%u] is not a multiple of [%u]", param.envName.c_str(), resultValue, param.baseValue);
     535            0 :         return HCCL_E_PARA;
     536              :     }
     537              : 
     538            0 :     HCCL_RUN_INFO("%s set by environment to [%u]", param.envName.c_str(), resultValue);
     539            0 :     return HCCL_SUCCESS;
     540              : }
     541              : 
     542           52 : HcclResult EnvConfig::ParseRDMATrafficClass()
     543              : {
     544           52 :     EnvConfigParam param = {
     545            0 :         "HCCL_RDMA_TC",
     546              :         HCCL_RDMA_TC_DEFAULT,
     547              :         HCCL_RDMA_TC_MIN,
     548              :         HCCL_RDMA_TC_MAX,
     549              :         HCCL_RDMA_TC_BASE
     550           52 :     };
     551           52 :     char* mmSysGetEnvValue = nullptr;
     552           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_RDMA_TC, mmSysGetEnvValue);
     553           52 :     std::string envValue = (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString";
     554          104 :     return ParseEnvConfig(param, envValue, g_envConfig.rdmaTrafficClass);
     555           52 : }
     556              : 
     557           52 : HcclResult EnvConfig::ParseRDMAServerLevel()
     558              : {
     559           52 :     EnvConfigParam param = {
     560            0 :         "HCCL_RDMA_SL",
     561              :         HCCL_RDMA_SL_DEFAULT,
     562              :         HCCL_RDMA_SL_MIN,
     563              :         HCCL_RDMA_SL_MAX,
     564              :         0
     565           52 :     };
     566           52 :     char* mmSysGetEnvValue = nullptr;
     567           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_RDMA_SL, mmSysGetEnvValue);
     568           52 :     std::string envValue = (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString";
     569          104 :     return ParseEnvConfig(param, envValue, g_envConfig.rdmaServerLevel);
     570           52 : }
     571              : 
     572           52 : HcclResult EnvConfig::ParseRDMATimeOut(std::pair<u32, u32> &rdmaTimeOutRange)
     573              : {
     574              :     u32 rdmaTimeOutMax;
     575              : #ifndef HCCD
     576           52 :     if (!IsGeneralServer()) {
     577              :         DevType deviceType;
     578           52 :         CHK_RET(hrtGetDeviceType(deviceType));
     579          103 :         rdmaTimeOutMax = (deviceType == DevType::DEV_TYPE_910_93 || deviceType == DevType::DEV_TYPE_910B)
     580          103 :             ? HCCL_RDMA_TIMEOUT_MAX_910_93
     581              :             : HCCL_RDMA_TIMEOUT_MAX;
     582              :     } else {
     583            0 :         rdmaTimeOutMax = HCCL_RDMA_TIMEOUT_MAX;
     584              :     }
     585              : #else
     586              :     rdmaTimeOutMax = HCCL_RDMA_TIMEOUT_MAX;
     587              : #endif
     588           52 :     rdmaTimeOutRange.first = HCCL_RDMA_TIMEOUT_MIN;
     589           52 :     rdmaTimeOutRange.second = rdmaTimeOutMax;
     590           52 :     char* mmSysGetEnvValue = nullptr;
     591           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_RDMA_TIMEOUT, mmSysGetEnvValue);
     592           52 :     std::string timeOutEnv = (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString";
     593           52 :     u32 rdmaTimeOut = HCCL_RDMA_TIMEOUT_DEFAULT;
     594           52 :     if (timeOutEnv == "EmptyString") {
     595           52 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_TIMEOUT set by default to [%u]", rdmaTimeOut);
     596           52 :         return HCCL_SUCCESS;
     597              :     }
     598              : 
     599              :     // 校验环境变量长度
     600            0 :     bool isEnvLenValid = CheckEnvLen(timeOutEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
     601              : 
     602            0 :     CHK_PRT_RET(!isEnvLenValid,
     603              :         HCCL_ERROR("[Parse][RDMATimeOut]errNo[0x%016llx] Invalid HCCL_RDMA_TIMEOUT env len, len is bigger than "\
     604              :             "[%u]. errorno[%d]", HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA), HCCL_E_PARA);
     605              : 
     606            0 :     g_envConfig.rdmaTimeOut = HCCL_RDMA_TIMEOUT_DEFAULT;
     607            0 :     CHK_RET(IsAllDigit(timeOutEnv.c_str()));
     608              : 
     609            0 :     HcclResult ret = SalStrToULong(timeOutEnv.c_str(), HCCL_BASE_DECIMAL, rdmaTimeOut);
     610              :     // 若转换出错或者设置的RDMATimeOut不在有效范围内,报错
     611            0 :     CHK_PRT_RET(
     612              :         (ret != HCCL_SUCCESS || rdmaTimeOut < HCCL_RDMA_TIMEOUT_MIN || rdmaTimeOut > rdmaTimeOutMax),
     613              :         HCCL_ERROR("[Parse][RDMATimeOut]HCCL_RDMA_TIMEOUT[%s] is invalid. except: [%u, %u]",
     614              :             timeOutEnv.c_str(),
     615              :             HCCL_RDMA_TIMEOUT_MIN,
     616              :             rdmaTimeOutMax),
     617              :         HCCL_E_PARA);
     618              : 
     619            0 :     g_envConfig.rdmaTimeOut = rdmaTimeOut;
     620            0 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_TIMEOUT set by environment to [%u]", rdmaTimeOut);
     621            0 :     return HCCL_SUCCESS;
     622           52 : }
     623              : 
     624           52 : HcclResult EnvConfig::ParseRDMARetryCnt()
     625              : {
     626           52 :     char* mmSysGetEnvValue = nullptr;
     627           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_RDMA_RETRY_CNT, mmSysGetEnvValue);
     628           52 :     std::string retryCntEnv = (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString";
     629           52 :     u32 rdmaRetryCnt = HCCL_RDMA_RETRY_CNT_DEFAULT;
     630           52 :     if (retryCntEnv == "EmptyString") {
     631           52 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_RETRY_CNT set by default to [%u]", rdmaRetryCnt);
     632           52 :         return HCCL_SUCCESS;
     633              :     }
     634              : 
     635              :     // 校验环境变量长度
     636            0 :     bool isEnvLenValid = CheckEnvLen(retryCntEnv.c_str(), MAX_LEN_OF_DIGIT_ENV);
     637              : 
     638            0 :     CHK_PRT_RET(!isEnvLenValid,
     639              :         HCCL_ERROR("[Parse][rdmaRetryCnt]errNo[0x%016llx] Invalid HCCL_RDMA_RETRY_CNT env len, len is bigger than "\
     640              :             "[%u]. errorno[%d]", HCCL_ERROR_CODE(HCCL_E_PARA), MAX_LEN_OF_DIGIT_ENV, HCCL_E_PARA), HCCL_E_PARA);
     641              : 
     642            0 :     g_envConfig.rdmaRetryCnt = HCCL_RDMA_RETRY_CNT_DEFAULT;
     643            0 :     CHK_RET(IsAllDigit(retryCntEnv.c_str()));
     644              : 
     645            0 :     HcclResult ret = SalStrToULong(retryCntEnv.c_str(), HCCL_BASE_DECIMAL, rdmaRetryCnt);
     646              :     // 若转换出错或者设置的RDMARetryCnt不在有效范围内,报错
     647            0 :     CHK_PRT_RET(
     648              :         (ret != HCCL_SUCCESS || rdmaRetryCnt < HCCL_RDMA_RETRY_CNT_MIN || rdmaRetryCnt > HCCL_RDMA_RETRY_CNT_MAX),
     649              :         HCCL_ERROR("[Parse][rdmaRetryCnt]HCCL_RDMA_RETRY_CNT[%s] is invalid. except: [%u, %u]", retryCntEnv.c_str(),
     650              :         HCCL_RDMA_RETRY_CNT_MIN, HCCL_RDMA_RETRY_CNT_MAX),
     651              :         HCCL_E_PARA);
     652            0 :     g_envConfig.rdmaRetryCnt = rdmaRetryCnt;
     653            0 :     HCCL_RUN_INFO("[HCCL_ENV] HCCL_RDMA_RETRY_CNT set by environment to [%u]", rdmaRetryCnt);
     654            0 :     return HCCL_SUCCESS;
     655           52 : }
     656              : 
     657          210 : HcclResult ParseSingleDFSConfigItem(const std::string& dfsConfigEnv, const std::string& configName,
     658              :     std::string& configResult)
     659              : {
     660          210 :     size_t start = dfsConfigEnv.find(configName);
     661          210 :     if (start == std::string::npos) {
     662          173 :         HCCL_INFO("[Parse] DFS config item [%s] is not found.", configName.c_str());
     663          173 :         return HCCL_SUCCESS;
     664              :     }
     665           37 :     size_t end = dfsConfigEnv.find(",", start);
     666           37 :     if (end == std::string::npos) {
     667           34 :         configResult = dfsConfigEnv.substr(start + configName.size());
     668              :     } else {
     669            3 :         configResult = dfsConfigEnv.substr(start + configName.size(), end - start - configName.size());
     670              :     }
     671           37 :     HCCL_INFO("[Parse] DFS config item %s [%s]", configName.c_str(), configResult.c_str());
     672           37 :     return HCCL_SUCCESS;
     673              : }
     674              : 
     675           42 : HcclResult ParseMonitor(std::string &taskMonitorInterval, s32 &monitorTime)
     676              : {
     677           42 :     if (taskMonitorInterval.empty()) {
     678           42 :         monitorTime = 0;
     679              :     } else {
     680            0 :         HcclResult ret = SalStrToInt(taskMonitorInterval, HCCL_BASE_DECIMAL, monitorTime);
     681            0 :         CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("[ParseDFSConfig] HCCL_DFS_CONFIG-task_monitor_interval[%s]"
     682              :             "is invalid, errorno[%d]", taskMonitorInterval.c_str(), ret), ret);
     683              :     }
     684              : 
     685           42 :     s32 maxTimeInMs = HCCL_MAX_LINK_TIME_OUT_S * 1000;
     686           42 :     if (monitorTime == 0) {
     687           42 :         g_envConfig.dfsTaskMonitorInterval = 0;
     688            0 :     } else if (monitorTime >= 0 && monitorTime <= maxTimeInMs) {
     689            0 :         g_envConfig.dfsTaskMonitorInterval = monitorTime;
     690              :     } else { // 不在允许范围内报错
     691            0 :         HCCL_ERROR("[ParseDFSConfig] HCCL_DFS_CONFIG-task_monitor_interval[%d] is invalid, except: [0, %d]",
     692              :             monitorTime, maxTimeInMs);
     693            0 :         return HCCL_E_PARA;
     694              :     }
     695           42 :     return HCCL_SUCCESS;
     696              : }
     697              : 
     698           52 : HcclResult ParseDFSConfig()
     699              : {
     700           52 :     char* dfsConfigValue = nullptr;
     701           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_DFS_CONFIG, dfsConfigValue);
     702           52 :     std::string dfsConfigEnv = (dfsConfigValue != nullptr) ? dfsConfigValue : "EmptyString";
     703           52 :     if (dfsConfigEnv == "EmptyString") {
     704           10 :         HCCL_RUN_INFO("[HCCL_ENV][Parse][HCCL_DFS_CONFIG] Parse environmental variable HCCL_DFS_CONFIG is not set.");
     705           10 :         return HCCL_SUCCESS;
     706              :     }
     707              : 
     708              :     //去除空格
     709           42 :     dfsConfigEnv.erase(std::remove(dfsConfigEnv.begin(), dfsConfigEnv.end(), ' '), dfsConfigEnv.end());
     710              : 
     711           42 :     std::transform(dfsConfigEnv.begin(), dfsConfigEnv.end(), dfsConfigEnv.begin(), ::tolower);
     712              : 
     713           42 :     std::string heartbeatSwitch;
     714           42 :     CHK_RET(ParseSingleDFSConfigItem(dfsConfigEnv, CLUSTER_HEART_CONFIG, heartbeatSwitch));
     715           42 :     if (heartbeatSwitch == "off") {
     716            5 :         g_envConfig.enableClusterHeartBeat = false;
     717           37 :     } else if (heartbeatSwitch == "on") {
     718            3 :         g_envConfig.enableClusterHeartBeat = true;
     719              :     } else {
     720           34 :         HCCL_RUN_WARNING("[HCCL_ENV][ParseDFSConfig] HCCL_DFS_CONFIG-cluster_heartbeat was configured to [%s], please configured to"\
     721              :             "'on' or 'off'", heartbeatSwitch.c_str());
     722              :     }
     723              : 
     724           42 :     std::string stuckDetectSwitch;
     725           42 :     CHK_RET(ParseSingleDFSConfigItem(dfsConfigEnv, STUCK_DETECTION_CONFIG, stuckDetectSwitch));
     726           42 :     if (stuckDetectSwitch == "off") {
     727            1 :         g_envConfig.opCounterEnable = false;
     728           41 :     } else if (stuckDetectSwitch == "on") {
     729            1 :         g_envConfig.opCounterEnable = true;
     730              :     } else {
     731           40 :         HCCL_RUN_WARNING("[HCCL_ENV][ParseDFSConfig] HCCL_DFS_CONFIG-stuck_detection was configured to [%s], please configured to"\
     732              :             "'on' or 'off'", stuckDetectSwitch.c_str());
     733              :     }
     734              : 
     735              :     // 解析算子不一致故障检测能力开关
     736           42 :     std::string inconsistentCheckSwitch;
     737           42 :     CHK_RET(ParseSingleDFSConfigItem(dfsConfigEnv, INCONSISTENT_CHECK_CONFIG, inconsistentCheckSwitch));
     738           42 :     if (inconsistentCheckSwitch == "off") {
     739            0 :         g_envConfig.inconsistentCheckSwitch = InconsistentCheckMode::OFF;
     740           42 :     } else if (inconsistentCheckSwitch == "on") {
     741            0 :         g_envConfig.inconsistentCheckSwitch = InconsistentCheckMode::ON;
     742           42 :     } else if (inconsistentCheckSwitch == "first") {
     743            0 :         g_envConfig.inconsistentCheckSwitch = InconsistentCheckMode::FIRST;
     744              :     } else {
     745           42 :         HCCL_RUN_WARNING("[ParseDFSConfig] HCCL_DFS_CONFIG-inconsistent_check was configured to [%s], please configured to"\
     746              :             "'on' or 'off' or 'first'", inconsistentCheckSwitch.c_str());
     747              :     }
     748              : 
     749           42 :     std::string taskMonitorInterval = "";
     750           42 :     s32 monitorTime = 0;
     751           42 :     CHK_RET(ParseSingleDFSConfigItem(dfsConfigEnv, TASK_MONITOR_INTERVAL, taskMonitorInterval));
     752           42 :     CHK_RET(ParseMonitor(taskMonitorInterval, monitorTime));
     753              : 
     754              :     // 解析连接故障检测时间
     755           42 :     std::string connectionDefaultDetectionTime = "";
     756           42 :     CHK_RET(ParseSingleDFSConfigItem(dfsConfigEnv, CONNECTION_FAULT_DETECTION_TIME, connectionDefaultDetectionTime));
     757           42 :     if (connectionDefaultDetectionTime.empty()) {
     758           15 :         g_envConfig.dfsConnectionFaultDetectionTime = HCCL_MIN_CONNECT_FAULT_DETECTION_TIME;
     759           15 :         HCCL_RUN_INFO("[HCCL_ENV][Parse] HCCL_DFS_CONFIG cluster_heartbeat set by environment to [%d], "
     760              :             "stuck_detection set by environment to [%d], connection_fault_detection_time[%d]s inconsistentCheckSwitch[%d],"
     761              :             "task_monitor_interval[%u]ms", g_envConfig.enableClusterHeartBeat, g_envConfig.opCounterEnable,
     762              :             g_envConfig.dfsConnectionFaultDetectionTime, g_envConfig.inconsistentCheckSwitch, g_envConfig.dfsTaskMonitorInterval);
     763           15 :         return HCCL_SUCCESS;
     764              :     }
     765           27 :     s32 detctTime = 0;
     766           27 :     HcclResult ret = SalStrToInt(connectionDefaultDetectionTime, HCCL_BASE_DECIMAL, detctTime);
     767           27 :     CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("[ParseDFSConfig] HCCL_DFS_CONFIG-connection_fault_detection_time[%s]"
     768              :         "is invalid, errorno[%d]", connectionDefaultDetectionTime.c_str(), ret), ret);
     769              : 
     770           27 :     if (detctTime == 0) {
     771           21 :         g_envConfig.dfsConnectionFaultDetectionTime = 0;
     772            6 :     } else if (detctTime >= HCCL_MIN_CONNECT_FAULT_DETECTION_TIME && detctTime <= HCCL_MAX_LINK_TIME_OUT_S) {
     773            6 :         g_envConfig.dfsConnectionFaultDetectionTime = detctTime;
     774              :     }  else { // 不在允许范围内报错
     775            0 :         HCCL_ERROR("[ParseDFSConfig] HCCL_DFS_CONFIG-connection_fault_detection_time[%d] is invalid, except: [%d, %d]",
     776              :             detctTime, HCCL_MIN_CONNECT_FAULT_DETECTION_TIME, HCCL_MAX_LINK_TIME_OUT_S);
     777            0 :         return HCCL_E_PARA;
     778              :     }
     779              : 
     780           27 :     HCCL_RUN_INFO("[HCCL_ENV][Parse] HCCL_DFS_CONFIG cluster_heartbeat set by environment to [%d], "
     781              :         "stuck_detection set by environment to [%d], connection_fault_detection_time[%d]s inconsistentCheckSwitch[%d],"
     782              :         "task_monitor_interval[%u]ms", g_envConfig.enableClusterHeartBeat, g_envConfig.opCounterEnable,
     783              :         g_envConfig.dfsConnectionFaultDetectionTime, g_envConfig.inconsistentCheckSwitch, g_envConfig.dfsTaskMonitorInterval);
     784           27 :     return HCCL_SUCCESS;
     785           52 : }
     786              : 
     787            0 : HcclResult GetKeyWordPath(const std::string &cannEnvStr, const std::string &keyStr, std::string &cannPath)
     788              : {
     789            0 :     std::string tempPath;   // 存放临时路径
     790              :     // 查找cann安装路径
     791            0 :     for (u32 i = 0; i < cannEnvStr.length(); ++i) {
     792              :         // 环境变量中存放的每段路径之间以':'隔开
     793            0 :         if (cannEnvStr[i] != ':') {
     794            0 :             tempPath += cannEnvStr[i];
     795              :         }
     796              : 
     797            0 :         if (cannEnvStr[i] == ':' || i == cannEnvStr.length() - 1) {
     798            0 :             size_t found = tempPath.find(keyStr);
     799            0 :             if (found == std::string::npos) {
     800            0 :                 tempPath.clear();
     801            0 :                 continue;
     802              :             }
     803            0 :             if (tempPath.length() <= found + keyStr.length() || tempPath[found + keyStr.length()] == '/') {
     804            0 :                 cannPath = tempPath.substr(0, found + keyStr.length());
     805            0 :                 break;
     806              :             }
     807            0 :             tempPath.clear();
     808              :         }
     809              :     }
     810            0 :     if (cannPath.empty()) {
     811            0 :         return HCCL_E_NOT_FOUND;
     812              :     }
     813            0 :     return HCCL_SUCCESS;
     814            0 : }
     815              : 
     816            0 : HcclResult ParseLibraryPath(std::string &cannPath)
     817              : {
     818            0 :     char* mmSysGetEnvValue = nullptr;
     819            0 :     MM_SYS_GET_ENV(MM_ENV_LD_LIBRARY_PATH, mmSysGetEnvValue);
     820            0 :     std::string getPath = (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString";
     821            0 :     if (getPath == "EmptyString") {
     822            0 :         HCCL_ERROR("[ParseLibraryPath]ENV:LD_LIBRARY_PATH is not set");
     823            0 :         return HCCL_E_PARA;
     824              :     } else {
     825            0 :         HCCL_INFO("ParseLibraryPath]getPath[%s]", getPath.c_str());
     826            0 :         cannPath = getPath;
     827              :     }
     828            0 :     return HCCL_SUCCESS;
     829            0 : }
     830              : 
     831           11 : const bool& GetExternalInputHcclHeartBeatEnable()
     832              : {
     833           11 :     return g_envConfig.enableClusterHeartBeat;
     834              : }
     835              : 
     836         1076 : const bool& GetExternalInputStuckDetect()
     837              : {
     838         1076 :     return g_envConfig.opCounterEnable;
     839              : }
     840              : 
     841           37 : const InconsistentCheckMode& GetExternalInconsistentCheckSwitch()
     842              : {
     843           37 :     return g_envConfig.inconsistentCheckSwitch;
     844              : }
     845              : 
     846           52 : HcclResult ParseHcclAlgo()
     847              : {
     848           52 :     char* mmSysGetEnvValue = nullptr;
     849           52 :     MM_SYS_GET_ENV(MM_ENV_HCCL_ALGO, mmSysGetEnvValue);
     850           52 :     std::string hcclAlgo = (mmSysGetEnvValue != nullptr) ? mmSysGetEnvValue : "EmptyString";
     851           52 :     if (hcclAlgo != "EmptyString") {
     852            7 :         CHK_RET(SetHcclAlgoConfig(hcclAlgo));
     853            7 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_ALGO set by environment to [%s]", hcclAlgo.c_str());
     854              :     } else {
     855           45 :         HCCL_RUN_INFO("[HCCL_ENV] HCCL_ALGO is not set");
     856              :     }
     857           52 :     return HCCL_SUCCESS;
     858           52 : }
        

Generated by: LCOV version 2.0-1