LCOV - code coverage report
Current view: top level - legacy/ascend910/framework/common/src/topo - topoinfo_ranktableHeterog.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 0.0 % 281 0
Test Date: 2026-08-18 17:47:01 Functions: 0.0 % 18 0

            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 "topoinfo_ranktableHeterog.h"
      12              : 
      13              : #include <map>
      14              : #include <vector>
      15              : #include <string>
      16              : #include <fstream>
      17              : #include <algorithm>
      18              : #include <unistd.h>
      19              : #include <chrono>
      20              : #include <iostream>
      21              : #include <arpa/inet.h>
      22              : 
      23              : #include "externalinput_pub.h"
      24              : // ltm指定config路径
      25              : #include "common/src/config.h"
      26              : #include "workflow_pub.h"
      27              : 
      28              : using namespace std;
      29              : using namespace hccl;
      30              : 
      31              : constexpr u32 MAX_PORT_ID = 65535;
      32            0 : TopoinfoRanktableHeterog::TopoinfoRanktableHeterog(
      33            0 :     const std::string& rankTableM, const std::string& identify, DevType deviceType)
      34              :     : TopoInfoRanktableParser(rankTableM, identify),
      35            0 :       deviceType_(deviceType)
      36            0 : {}
      37              : 
      38            0 : TopoinfoRanktableHeterog::~TopoinfoRanktableHeterog() {}
      39              : 
      40            0 : HcclResult TopoinfoRanktableHeterog::Init()
      41              : {
      42              :     // 根据rankTable类型标记执行读文件或读字符串,将内容保存在json对象fileContent_中
      43            0 :     CHK_RET(LoadRankTableString(rankTableFile_));
      44              :     // 解析rankTable
      45            0 :     CHK_RET(ParserClusterInfo(params_, rankTable_));
      46            0 :     return HCCL_SUCCESS;
      47              : }
      48              : 
      49            0 : HcclResult TopoinfoRanktableHeterog::GetSelfClusterInfo(HcclCommParams& params)
      50              : {
      51              :     // 获取params
      52            0 :     params.rank = params_.rank;
      53            0 :     params.userRank = params_.rank;
      54            0 :     params.totalRanks = params_.totalRanks;
      55            0 :     params.logicDevId = params_.logicDevId;
      56            0 :     params.serverId = params_.serverId;
      57            0 :     params.deviceType = params_.deviceType;
      58            0 :     return HCCL_SUCCESS;
      59              : }
      60              : 
      61            0 : HcclResult TopoinfoRanktableHeterog::GetClusterInfo(hccl::HcclCommParams& params, hccl::RankTable_t& rankTable)
      62              : {
      63            0 :     CHK_RET(GetClusterInfo(rankTable));
      64            0 :     CHK_RET(GetSelfClusterInfo(params));
      65            0 :     return HCCL_SUCCESS;
      66              : }
      67              : 
      68            0 : HcclResult TopoinfoRanktableHeterog::GetClusterInfo(RankTable_t& clusterInfo)
      69              : {
      70              :     // 获取rankInfo
      71            0 :     clusterInfo.deviceNum = rankTable_.deviceNum;
      72            0 :     clusterInfo.serverNum = rankTable_.serverNum;
      73            0 :     clusterInfo.nicDeploy = rankTable_.nicDeploy;
      74            0 :     clusterInfo.rankNum = rankTable_.rankNum;
      75            0 :     clusterInfo.rankList = rankTable_.rankList;
      76            0 :     clusterInfo.serverList = rankTable_.serverList;
      77            0 :     clusterInfo.collectiveId = rankTable_.collectiveId;
      78            0 :     clusterInfo.version = rankTable_.version;
      79            0 :     clusterInfo.mode = rankTable_.mode;
      80            0 :     return HCCL_SUCCESS;
      81              : }
      82              : 
      83            0 : HcclResult TopoinfoRanktableHeterog::ParserClusterInfo(hccl::HcclCommParams& params, hccl::RankTable_t& rankTable)
      84              : {
      85              :     // 获取ranktable info信息
      86            0 :     CHK_RET(GetRanktableInfo(rankTable));
      87            0 :     if (!IsTaskNumCalMode()) {
      88            0 :         CHK_RET(CheckNicDeployConsistence(rankTable));
      89            0 :         rankTable.nicDeploy = NICDeployment::NIC_DEPLOYMENT_DEVICE;
      90            0 :         std::sort(
      91              :             rankTable.rankList.begin(), rankTable.rankList.end(),
      92            0 :             [&](const RankInfo_t& a, const RankInfo_t& b) -> bool {
      93            0 :                 return a.rankId < b.rankId;
      94              :             });
      95              : 
      96            0 :         unordered_map<std::string, u32> minRankPerServerMap;
      97            0 :         for (auto& iter : rankTable.rankList) {
      98            0 :             if (minRankPerServerMap.find(iter.serverId) == minRankPerServerMap.end()) {
      99            0 :                 minRankPerServerMap[iter.serverId] = iter.rankId;
     100            0 :             } else if (minRankPerServerMap[iter.serverId] > iter.rankId) {
     101            0 :                 minRankPerServerMap[iter.serverId] = iter.rankId;
     102              :             }
     103              :         }
     104            0 :         map<u32, std::string> minRankInServerMap;
     105            0 :         for (auto& iter : minRankPerServerMap) {
     106            0 :             minRankInServerMap.insert(std::make_pair(iter.second, iter.first));
     107              :         }
     108              : 
     109            0 :         u32 serverIndex = 0;
     110            0 :         for (auto& iter : minRankInServerMap) {
     111            0 :             for (u32 rankIndex = 0; rankIndex < rankTable.rankList.size(); rankIndex++) {
     112            0 :                 if (rankTable.rankList[rankIndex].serverId == iter.second) {
     113            0 :                     rankTable.rankList[rankIndex].serverIdx = serverIndex;
     114            0 :                     ServerInfo_t serverinfo;
     115            0 :                     NetworkInfo_t networkInfo;
     116            0 :                     serverinfo.serverId = iter.second;
     117            0 :                     networkInfo.ipAddr = rankTable.rankList[rankIndex].hostIp;
     118            0 :                     serverinfo.networkInfo.push_back(networkInfo);
     119              :                     std::vector<ServerInfo_t>::iterator found
     120            0 :                         = find(rankTable.serverList.begin(), rankTable.serverList.end(), serverinfo);
     121            0 :                     if (found == rankTable.serverList.end()) {
     122            0 :                         rankTable.serverList.push_back(serverinfo);
     123              :                     }
     124            0 :                 }
     125              :             }
     126            0 :             serverIndex++;
     127              :         }
     128              : 
     129            0 :         u32 rankId = INVALID_VALUE_RANKID;
     130            0 :         std::string errormessage = "";
     131            0 :         if (SalStrToULong(identify_, HCCL_BASE_DECIMAL, rankId) != HCCL_SUCCESS) {
     132            0 :             errormessage = "Value [" + identify_
     133            0 :                            + "] for rankTable variable [rank_id] is invalid, expected value is a valid integer.";
     134            0 :             HCCL_ERROR(
     135              :                 "[%s][%s]errNo[0x%016llx] [%s]", LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RANKTABLE_CHECK.c_str(),
     136              :                 HCOM_ERROR_CODE(HCCL_E_PARA), errormessage.c_str());
     137            0 :             return HCCL_E_PARA;
     138              :         }
     139              :         // 校验rank id合法性
     140            0 :         if (rankId >= rankTable.rankList.size()) {
     141            0 :             errormessage = "Value [" + std::to_string(rankId)
     142            0 :                            + "] for rankTable variable [rank_id] is invalid, "
     143            0 :                              "expected value is a valid rank ID in [0, "
     144            0 :                            + std::to_string(rankTable.rankList.size() - 1) + "].";
     145            0 :             HCCL_ERROR(
     146              :                 "[%s][%s] [%s]", LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RANKTABLE_CHECK.c_str(),
     147              :                 errormessage.c_str());
     148            0 :             return HCCL_E_PARA;
     149              :         }
     150            0 :         errormessage = "The current node's rankId [" + std::to_string(rankId)
     151            0 :                        + "] does not match "
     152            0 :                          "the rankId ["
     153            0 :                        + std::to_string(rankTable.rankList[rankId].rankId) + "] in the rankTable.";
     154            0 :         CHK_PRT_RET(
     155              :             rankId != rankTable.rankList[rankId].rankId,
     156              :             HCCL_ERROR(
     157              :                 "[%s][%s] [%s]", LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RANKTABLE_CHECK.c_str(),
     158              :                 errormessage.c_str()),
     159              :             HCCL_E_UNAVAIL);
     160              : 
     161              :         // params内容填入
     162            0 :         params.rank = rankId;
     163            0 :         params.logicDevId = rankTable.rankList[rankId].deviceInfo.devicePhyId;
     164            0 :         params.serverId = rankTable.rankList[rankId].serverId;
     165            0 :         params.totalRanks = rankTable.rankNum;
     166            0 :         params.deviceType = deviceType_;
     167            0 :     }
     168            0 :     return HCCL_SUCCESS;
     169              : }
     170              : 
     171            0 : HcclResult TopoinfoRanktableHeterog::GetRanktableInfo(RankTable_t& clusterInfo)
     172              : {
     173              :     // 清空list
     174            0 :     clusterInfo.serverList.clear();
     175            0 :     clusterInfo.rankList.clear();
     176              : 
     177              :     // 获取信息
     178            0 :     std::string collective_id;
     179            0 :     nlohmann::json node_list;
     180            0 :     std::string version;
     181            0 :     std::string mode;
     182              : 
     183            0 :     std::string heterogSubVersion;
     184              :     // 解析91093-ES专属标志
     185            0 :     if (fileContent_.find("heterog_sub_version") != fileContent_.end()) {
     186            0 :         CHK_RET(GetJsonProperty(fileContent_, "heterog_sub_version", heterogSubVersion, false));
     187            0 :         CHK_RET(CheckHeterogSubVersion(heterogSubVersion));
     188            0 :         HCCL_DEBUG("[Get][RanktableInfo] heterog_sub_version exists!");
     189            0 :         is91093_ = true;
     190              :     }
     191              : 
     192            0 :     CHK_RET(GetJsonProperty(fileContent_, "collective_id", collective_id, false));
     193            0 :     if (collective_id.length() > COLLECTIVEID_MAX_LEN) {
     194            0 :         HCCL_ERROR(
     195              :             "[Get][RanktableInfo]errNo[0x%016llx] collectiveId length is over than %d bytes.",
     196              :             HCOM_ERROR_CODE(HCCL_E_PARA), collective_id.length());
     197            0 :         return HCCL_E_PARA;
     198              :     }
     199            0 :     CHK_RET(GetJsonProperty(fileContent_, "node_list", node_list, false));
     200            0 :     CHK_RET(GetJsonProperty(fileContent_, "version", version, false));
     201              : 
     202            0 :     if (fileContent_.find("mode") != fileContent_.end()) {
     203            0 :         CHK_RET(GetJsonProperty(fileContent_, "mode", mode, false));
     204            0 :         CHK_RET(CheckMode(mode));
     205              :     }
     206              : 
     207            0 :     HCCL_DEBUG("[rankTableJson] -> collectiveId: [%s], nodeListSize: [%zu]", collective_id.c_str(), node_list.size());
     208              : 
     209              :     // 保存serverNum
     210            0 :     clusterInfo.serverNum = node_list.size();
     211            0 :     if (clusterInfo.serverNum == 0) {
     212            0 :         HCCL_ERROR("[Get][RanktableInfo]errNo[0x%016llx] node num is zero", HCOM_ERROR_CODE(HCCL_E_PARA));
     213            0 :         return HCCL_E_PARA;
     214              :     }
     215              :     // 获得single node信息
     216            0 :     for (u32 index = 0; index < clusterInfo.serverNum; index++) {
     217            0 :         CHK_RET(GetSingleNode(node_list, index, clusterInfo));
     218              :     }
     219              : 
     220              :     // 保存deviceNum和rankNum
     221            0 :     CHK_RET(GetDevNum(clusterInfo.rankList, clusterInfo.deviceNum));
     222            0 :     clusterInfo.rankNum = clusterInfo.rankList.size();
     223            0 :     clusterInfo.collectiveId = collective_id;
     224            0 :     clusterInfo.version = version;
     225            0 :     clusterInfo.mode = mode;
     226            0 :     return HCCL_SUCCESS;
     227            0 : }
     228              : 
     229            0 : HcclResult TopoinfoRanktableHeterog::CheckNicDeployConsistence(RankTable_t& clusterInfo) const
     230              : {
     231              :     // 检查rankList的大小
     232            0 :     CHK_PRT_RET(
     233              :         clusterInfo.rankList.size() == 0, HCCL_DEBUG("rank list size is 0, skip nic deeply check."), HCCL_SUCCESS);
     234            0 :     NICDeployment tmpNicDeply = clusterInfo.rankList.begin()->hostIp.IsInvalid() ?
     235              :                                     NICDeployment::NIC_DEPLOYMENT_DEVICE :
     236            0 :                                     NICDeployment::NIC_DEPLOYMENT_HOST;
     237            0 :     for (auto& it : clusterInfo.rankList) {
     238            0 :         CHK_PRT_RET(
     239              :             (tmpNicDeply == NICDeployment::NIC_DEPLOYMENT_DEVICE && !it.hostIp.IsInvalid())
     240              :                 || (tmpNicDeply == NICDeployment::NIC_DEPLOYMENT_HOST && it.hostIp.IsInvalid()),
     241              :             HCCL_ERROR(
     242              :                 "[Get][RanktableInfo] errNo[0x%016llx] "
     243              :                 "hostIp config bettewn ranks is different.",
     244              :                 HCOM_ERROR_CODE(HCCL_E_PARA)),
     245              :             HCCL_E_PARA);
     246              :     }
     247            0 :     return HCCL_SUCCESS;
     248              : }
     249              : 
     250            0 : HcclResult TopoinfoRanktableHeterog::CheckMode(std::string& mode) const
     251              : {
     252            0 :     if (mode == "tcp" || mode == "rdma") {
     253            0 :         return HCCL_SUCCESS;
     254              :     }
     255            0 :     HCCL_ERROR(
     256              :         "[Get][RanktableInfo]errNo[0x%016llx] mode[%s] is not supported, support for [tcp] and [rdma]",
     257              :         HCOM_ERROR_CODE(HCCL_E_PARA), mode.c_str());
     258            0 :     return HCCL_E_PARA;
     259              : }
     260              : 
     261            0 : HcclResult TopoinfoRanktableHeterog::CheckHeterogSubVersion(std::string& subVersion) const
     262              : {
     263            0 :     if (subVersion == "1.2") {
     264            0 :         return HCCL_SUCCESS;
     265              :     }
     266              : 
     267            0 :     HCCL_ERROR(
     268              :         "[Get][RanktableInfo]errNo[0x%016llx] subVersion[%s] is not supported, support for 1.2",
     269              :         HCOM_ERROR_CODE(HCCL_E_PARA), subVersion.c_str());
     270            0 :     return HCCL_E_PARA;
     271              : }
     272              : 
     273            0 : HcclResult TopoinfoRanktableHeterog::GetHostPort(const u32& localRank, u32& hostPort)
     274              : {
     275            0 :     u32 basePort = (GetExternalInputHcclIfBasePort() == HCCL_INVALID_PORT) ? HOST_PARA_BASE_PORT :
     276            0 :                                                                              GetExternalInputHcclIfBasePort();
     277            0 :     hostPort = basePort + localRank;
     278            0 :     CHK_PRT_RET(hostPort > MAX_PORT_ID, HCCL_ERROR("[Get][HostPort]invalid port id[%u]", hostPort), HCCL_E_INTERNAL);
     279            0 :     if (hostPortMap_.find(hostPort) == hostPortMap_.end()) {
     280            0 :         return HCCL_SUCCESS;
     281              :     }
     282            0 :     while (hostPortMap_[hostPort] == HOST_PORT_USED) {
     283            0 :         hostPort++;
     284            0 :         CHK_PRT_RET(
     285              :             hostPort > MAX_PORT_ID, HCCL_ERROR("[Get][HostPort]invalid port id[%u]", hostPort), HCCL_E_INTERNAL);
     286              :     }
     287            0 :     return HCCL_SUCCESS;
     288              : }
     289              : 
     290            0 : HcclResult TopoinfoRanktableHeterog::GetRanks(
     291              :     const nlohmann::json& NodeListObj, u32 objIndex, RankTable_t& clusterInfo, std::string& serverId, u32& serverIdx,
     292              :     HcclIpAddress& nodeIp)
     293              : {
     294            0 :     HCCL_DEBUG("Get Node[%u]: nodeAddr:[%s], nodeIdx:[%u]", objIndex, serverId.c_str(), serverIdx);
     295              :     // 获取信息
     296            0 :     nlohmann::json Ranks;
     297            0 :     CHK_RET(GetJsonArrayMemberProperty(NodeListObj, objIndex, "ranks", Ranks, false));
     298              : 
     299            0 :     HCCL_DEBUG("[%s.json] -> rank_list: size:%zu", fileName_.c_str(), Ranks.size());
     300            0 :     CHK_PRT_RET(Ranks.size() == 0, HCCL_ERROR("[Get][Ranks]Ranks size is zero"), HCCL_E_PARA);
     301              : 
     302              :     // 91093的GetSingleRank单独操作
     303            0 :     if (is91093_) {
     304            0 :         for (u32 index = 0; index < Ranks.size(); index++) {
     305            0 :             CHK_RET(GetSingleRank91093(Ranks, index, clusterInfo, serverId, serverIdx, nodeIp));
     306              :         }
     307              :     } else {
     308              :         // 获取单rank信息
     309            0 :         for (u32 index = 0; index < Ranks.size(); index++) {
     310            0 :             CHK_RET(GetSingleRank(Ranks, index, clusterInfo, serverId, serverIdx, nodeIp));
     311              :         }
     312              :     }
     313              : 
     314              :     // 重新分配host port
     315            0 :     for (auto& rankInfo : clusterInfo.rankList) {
     316            0 :         if (rankInfo.hostPort == HCCL_INVALID_PORT) {
     317            0 :             CHK_RET(GetHostPort(rankInfo.localRank, rankInfo.hostPort));
     318              :         }
     319            0 :         HCCL_DEBUG("rank id: %u localRank:%u host port: %u", rankInfo.rankId, rankInfo.localRank, rankInfo.hostPort);
     320              :     }
     321            0 :     hostPortMap_.clear();
     322            0 :     return HCCL_SUCCESS;
     323            0 : }
     324              : 
     325              : HcclResult
     326            0 : TopoinfoRanktableHeterog::GetSingleNode(const nlohmann::json& NodeListObj, u32 objIndex, RankTable_t& clusterInfo)
     327              : {
     328              :     // 获取信息
     329              :     HcclResult ret;
     330            0 :     std::string nodeAddr;
     331            0 :     std::string serverId;
     332            0 :     CHK_RET(GetJsonArrayMemberProperty(NodeListObj, objIndex, "node_addr", nodeAddr, false));
     333              :     // 将serverId添加到资源池,内部会进行IP地址校验,如果资源池中有serverId,则报错
     334            0 :     serverId = nodeAddr;
     335            0 :     CHK_RET(CheckUniqueAndInsertPool(
     336              :         JsonUniqueInfoType::UNIQUE_INFO_TYPE_SERVER_ID, serverId, JsonCheckOpType::CHECK_OP_TYPE_INSERT));
     337              :     // 设置serverIdx
     338              :     u32 serverIdx;
     339            0 :     GenerateServerIdx(serverId, serverIdx);
     340              : 
     341              :     // 计算node ip
     342            0 :     HcclIpAddress nodeIp;
     343            0 :     CHK_RET(ConvertIpAddress(nodeAddr, nodeIp));
     344              : 
     345              :     // 处理ranklist
     346            0 :     ret = GetRanks(NodeListObj, objIndex, clusterInfo, serverId, serverIdx, nodeIp);
     347            0 :     CHK_PRT_RET(
     348              :         ret != HCCL_SUCCESS, HCCL_ERROR("[Get][GetRanks]get rank list error:nodeAddr:[%s]", serverId.c_str()), ret);
     349            0 :     return HCCL_SUCCESS;
     350            0 : }
     351              : 
     352              : // 91093暂定所有字段都是必选字段。除了ranks里面的 bind_device_id
     353            0 : HcclResult TopoinfoRanktableHeterog::GetSingleRank91093(
     354              :     const nlohmann::json& ranksObj, u32 objIndex, RankTable_t& clusterInfo, std::string& serverId, u32& serverIdx,
     355              :     HcclIpAddress& nodeIp)
     356              : {
     357            0 :     HCCL_INFO("Entry-GetSingleRank91093");
     358            0 :     std::string rankId;
     359            0 :     CHK_RET(GetJsonArrayMemberProperty(ranksObj, objIndex, "rank_id", rankId, false));
     360              : 
     361            0 :     s32 devicePhyId = 0;
     362            0 :     std::string devPhyIdStr;
     363            0 :     CHK_RET(GetJsonArrayMemberProperty(ranksObj, objIndex, "device_id", devPhyIdStr, false));
     364            0 :     CHK_RET(SalStrToInt(devPhyIdStr, HCCL_BASE_DECIMAL, devicePhyId));
     365              : 
     366            0 :     s32 port = HCCL_INVALID_PORT;
     367            0 :     std::string portStr;
     368            0 :     CHK_RET(GetJsonArrayMemberProperty(ranksObj, objIndex, "port", portStr, false));
     369            0 :     CHK_RET(SalStrToInt(portStr, HCCL_BASE_DECIMAL, port));
     370              : 
     371              :     // 如果device没有网卡,则缺省,通信使用node_addr
     372            0 :     HcclIpAddress rankIp;
     373            0 :     std::string rankIpStr;
     374            0 :     CHK_RET(GetJsonArrayMemberProperty(ranksObj, objIndex, "rank_ip", rankIpStr, false));
     375            0 :     if (rankIpStr.empty()) {
     376            0 :         rankIp = nodeIp;
     377              :     } else {
     378            0 :         CHK_RET(ConvertIpAddress(rankIpStr, rankIp));
     379              :     }
     380              : 
     381            0 :     s32 sdid = 0;
     382            0 :     std::string sdidStr;
     383            0 :     CHK_RET(GetJsonArrayMemberProperty(ranksObj, objIndex, "sdid", sdidStr, false));
     384            0 :     CHK_RET(SalStrToInt(sdidStr, HCCL_BASE_DECIMAL, sdid));
     385              : 
     386              :     // 如果deviceId == -1, 则去获取可选字段
     387            0 :     s32 bindDeviceId = -1;
     388            0 :     std::string bindDeviceIdStr;
     389            0 :     if (devicePhyId == HOST_DEVICE_ID) {
     390            0 :         CHK_RET(GetJsonArrayMemberProperty(ranksObj, objIndex, "bind_device_id", bindDeviceIdStr, false));
     391            0 :         CHK_RET(SalStrToInt(bindDeviceIdStr, HCCL_BASE_DECIMAL, bindDeviceId));
     392              :     }
     393              : 
     394              :     // rankList
     395            0 :     RankInfo_t rankInfo;
     396            0 :     rankInfo.localRank = objIndex;
     397            0 :     rankInfo.serverId = serverId;
     398            0 :     rankInfo.serverIdx = serverIdx;
     399            0 :     rankInfo.hostIp = nodeIp;
     400            0 :     rankInfo.superDeviceId = sdid;
     401            0 :     rankInfo.bindDeviceId = bindDeviceId;
     402            0 :     rankInfo.deviceInfo.devicePhyId = devicePhyId;
     403            0 :     rankInfo.deviceInfo.port = port;
     404            0 :     rankInfo.deviceInfo.deviceIp.push_back(rankIp);
     405              : 
     406            0 :     std::string errormessage = "";
     407            0 :     if (SalStrToULong(rankId, HCCL_BASE_DECIMAL, rankInfo.rankId) != HCCL_SUCCESS) {
     408            0 :         errormessage = "Value [" + rankId
     409            0 :                        + "] for rankTable variable [rank_id] is invalid, expected value is a non-negative integer.";
     410            0 :         HCCL_ERROR(
     411              :             "[%s][%s]errNo[0x%016llx] [%s]", LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RANKTABLE_CHECK.c_str(),
     412              :             HCOM_ERROR_CODE(HCCL_E_PARA), errormessage.c_str());
     413            0 :         return HCCL_E_PARA;
     414              :     }
     415              : 
     416            0 :     rankInfo.podName = ""; // podname在新场景下置空
     417              :     // ranktable中port无效,设置为环境变量HCCL_IF_BASE_PORT+该rank的local_rank_id,否则按照配置的port使用
     418            0 :     if (port == 0) {
     419            0 :         rankInfo.hostPort = HCCL_INVALID_PORT;
     420              :     } else {
     421            0 :         rankInfo.hostPort = port;
     422            0 :         hostPortMap_[rankInfo.hostPort] = HOST_PORT_USED;
     423              :     }
     424            0 :     clusterInfo.rankList.push_back(rankInfo);
     425            0 :     HCCL_DEBUG("[%s.json]->rankId[%u], nodeAddr[%s]", fileName_.c_str(), rankInfo.rankId, rankInfo.serverId.c_str());
     426              : 
     427            0 :     return HCCL_SUCCESS;
     428            0 : }
     429              : 
     430            0 : HcclResult TopoinfoRanktableHeterog::GetSingleRank(
     431              :     const nlohmann::json& ranksObj, u32 objIndex, RankTable_t& clusterInfo, std::string& serverId, u32& serverIdx,
     432              :     HcclIpAddress& nodeIp)
     433              : {
     434              :     // 获取rank_id
     435            0 :     std::string rankId;
     436            0 :     CHK_RET(GetJsonArrayMemberProperty(ranksObj, objIndex, "rank_id", rankId, false));
     437              : 
     438            0 :     s32 devicePhyId = 0;
     439            0 :     std::string devPhyIdStr;
     440            0 :     if (GetJsonArrayMemberProperty(ranksObj, objIndex, "device_id", devPhyIdStr, true) == HCCL_E_NOT_FOUND) {
     441            0 :         devicePhyId = HOST_DEVICE_ID;
     442              :     } else {
     443            0 :         HCCL_DEBUG("[Get][GetRanks]device_id:[%s]", devPhyIdStr.c_str());
     444            0 :         CHK_RET(SalStrToInt(devPhyIdStr, HCCL_BASE_DECIMAL, devicePhyId));
     445              :     }
     446              : 
     447            0 :     s32 port = HCCL_INVALID_PORT;
     448            0 :     std::string portStr;
     449            0 :     if (GetJsonArrayMemberProperty(ranksObj, objIndex, "port", portStr, true) == HCCL_E_NOT_FOUND) {
     450            0 :         port = HCCL_INVALID_PORT;
     451              :     } else {
     452            0 :         CHK_RET(SalStrToInt(portStr, HCCL_BASE_DECIMAL, port));
     453              :     }
     454              : 
     455              :     // 如果device没有网卡,则缺省,通信使用node_addr
     456            0 :     HcclIpAddress rankIp;
     457            0 :     std::string rankIpStr;
     458            0 :     if (GetJsonArrayMemberProperty(ranksObj, objIndex, "rank_ip", rankIpStr, true) == HCCL_E_NOT_FOUND) {
     459            0 :         rankIp = nodeIp;
     460              :     } else {
     461            0 :         if (rankIpStr.empty()) {
     462            0 :             rankIp = nodeIp;
     463              :         } else {
     464            0 :             CHK_RET(ConvertIpAddress(rankIpStr, rankIp));
     465              :         }
     466              :     }
     467              : 
     468              :     // rankList
     469            0 :     RankInfo_t rankInfo;
     470            0 :     rankInfo.localRank = objIndex;
     471            0 :     rankInfo.serverId = serverId;
     472            0 :     rankInfo.serverIdx = serverIdx;
     473            0 :     rankInfo.hostIp = nodeIp;
     474            0 :     rankInfo.deviceInfo.devicePhyId = devicePhyId;
     475            0 :     rankInfo.deviceInfo.port = port;
     476            0 :     rankInfo.deviceInfo.deviceIp.push_back(rankIp);
     477            0 :     std::string errormessage = "";
     478            0 :     if (SalStrToULong(rankId, HCCL_BASE_DECIMAL, rankInfo.rankId) != HCCL_SUCCESS) {
     479            0 :         errormessage = "Value [" + rankId
     480            0 :                        + "] for rankTable variable [rank_id] is invalid, expected value is a non-negative integer.";
     481            0 :         HCCL_ERROR(
     482              :             "[%s][%s]errNo[0x%016llx] [%s]", LOG_KEYWORDS_INIT_GROUP.c_str(), LOG_KEYWORDS_RANKTABLE_CHECK.c_str(),
     483              :             HCOM_ERROR_CODE(HCCL_E_PARA), errormessage.c_str());
     484            0 :         return HCCL_E_PARA;
     485              :     }
     486            0 :     rankInfo.podName = ""; // podname在新场景下置空
     487              :     // ranktable中port无效,设置为环境变量HCCL_IF_BASE_PORT+该rank的local_rank_id,否则按照配置的port使用
     488            0 :     if (port == 0) {
     489            0 :         rankInfo.hostPort = HCCL_INVALID_PORT;
     490              :     } else {
     491            0 :         rankInfo.hostPort = port;
     492            0 :         hostPortMap_[rankInfo.hostPort] = HOST_PORT_USED;
     493              :     }
     494            0 :     clusterInfo.rankList.push_back(rankInfo);
     495            0 :     HCCL_DEBUG("[%s.json]->rankId[%u], nodeAddr[%s]", fileName_.c_str(), rankInfo.rankId, rankInfo.serverId.c_str());
     496              : 
     497            0 :     return HCCL_SUCCESS;
     498            0 : }
        

Generated by: LCOV version 2.0-1