LCOV - code coverage report
Current view: top level - legacy/ascend910/algorithm/impl/resource_manager - hccl_socket_manager.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 58.1 % 497 289
Test Date: 2026-08-18 17:47:01 Functions: 74.4 % 39 29

            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 "adapter_hccp_common.h"
      12              : #include "externalinput_pub.h"
      13              : #include "hccl_socket.h"
      14              : #include "sal_pub.h"
      15              : #include "hccl_socket_manager.h"
      16              : 
      17              : namespace hccl {
      18          719 : HcclSocketManager::HcclSocketManager(NICDeployment nicDeployment, s32 deviceLogicId, u32 devicePhyId, u32 userRank)
      19          719 :     : nicDeployment_(nicDeployment),
      20          719 :       deviceLogicId_(deviceLogicId),
      21          719 :       devicePhyId_(devicePhyId),
      22          719 :       userRank_(userRank),
      23          719 :       wlistInfosMap_(),
      24          719 :       commSocketsMap_()
      25          719 : {}
      26              : 
      27         1426 : HcclSocketManager::~HcclSocketManager() { DestroySockets(); }
      28              : 
      29              : std::map<PortInfo, std::shared_ptr<HcclSocket>> HcclSocketManager::serverSocketMap_;
      30              : std::map<PortInfo, Referenced> HcclSocketManager::serverSocketRefMap_;
      31              : std::mutex HcclSocketManager::serverMapMutex_;
      32              : RegisterDetectCallBack g_RegisterDetectCallBack = nullptr;
      33              : 
      34           12 : HcclResult HcclSocketManager::ServerInit(const HcclNetDevCtx netDevCtx, u32 port)
      35              : {
      36           12 :     HcclIpAddress localIp{0};
      37           12 :     CHK_RET(HcclNetDevGetLocalIp(netDevCtx, localIp));
      38              : 
      39           12 :     PortInfo portInfo(localIp, port);
      40              : 
      41           12 :     std::unique_lock<std::mutex> lock(serverMapMutex_);
      42           12 :     auto serverSocketInMap = serverSocketMap_.find(portInfo);
      43           12 :     if (serverSocketInMap != serverSocketMap_.end()) {
      44            0 :         auto& serverSocketRef = serverSocketRefMap_[portInfo];
      45            0 :         serverSocketRef.Ref();
      46            0 :         return HCCL_SUCCESS;
      47              :     }
      48              : 
      49           12 :     std::shared_ptr<HcclSocket> tempSocket;
      50           12 :     EXCEPTION_CATCH((tempSocket = std::make_shared<HcclSocket>(netDevCtx, port)), return HCCL_E_PTR);
      51           12 :     CHK_RET(tempSocket->Init());
      52           12 :     CHK_RET(tempSocket->Listen());
      53            6 :     HCCL_INFO("[Init][Server]ip[%s] port[%u]", localIp.GetReadableAddress(), port);
      54            6 :     serverSocketMap_.insert(std::make_pair(portInfo, tempSocket));
      55              : 
      56            6 :     Referenced ref;
      57            6 :     ref.Ref();
      58            6 :     serverSocketRefMap_.insert(std::make_pair(portInfo, ref));
      59              : 
      60            6 :     return HCCL_SUCCESS;
      61           12 : }
      62              : 
      63          158 : HcclResult HcclSocketManager::ServerDeInit(const HcclNetDevCtx netDevCtx, u32 port)
      64              : {
      65          158 :     HcclIpAddress localIp{0};
      66          159 :     CHK_RET(HcclNetDevGetLocalIp(netDevCtx, localIp));
      67          159 :     CHK_RET(ServerDeInit(localIp, port));
      68              : 
      69          159 :     return HCCL_SUCCESS;
      70          159 : }
      71              : 
      72          158 : HcclResult HcclSocketManager::ServerDeInit(const HcclIpAddress& localIp, u32 port)
      73              : {
      74          158 :     PortInfo portInfo(localIp, port);
      75              : 
      76          157 :     std::unique_lock<std::mutex> lock(serverMapMutex_);
      77          159 :     auto res = serverSocketMap_.find(portInfo);
      78          159 :     if (res == serverSocketMap_.end()) {
      79          155 :         HCCL_INFO("[DeInit][Server]ip[%s] port[%u] not found", localIp.GetReadableAddress(), port);
      80          155 :         return HCCL_SUCCESS;
      81              :     }
      82              : 
      83            4 :     auto& serverSocketRef = serverSocketRefMap_[portInfo];
      84            4 :     serverSocketRef.Unref();
      85              : 
      86            4 :     HCCL_INFO(
      87              :         "[DeInit][Server]ip[%s] port[%u] serverSocketRef.Count() = %d", localIp.GetReadableAddress(), port,
      88              :         serverSocketRef.Count());
      89            4 :     if (serverSocketRef.Count() == 0) {
      90            4 :         HCCL_INFO("[DeInit][Server]ip[%s] port[%u]", localIp.GetReadableAddress(), port);
      91            4 :         serverSocketMap_[portInfo]->DeInit();
      92            4 :         serverSocketMap_.erase(portInfo);
      93            4 :         serverSocketRefMap_.erase(portInfo);
      94              :     }
      95              : 
      96            4 :     return HCCL_SUCCESS;
      97          159 : }
      98              : 
      99              : // public
     100              : // 填加向本端创建链接的客户端"RANK+IP"白名单
     101           48 : HcclResult HcclSocketManager::AddWhiteList(
     102              :     const std::string& commTag, bool isInterLink, NicType socketType, const HcclIpAddress& localIp,
     103              :     const std::map<u32, HcclRankLinkInfo>& whiteListMap, uint32_t connectMode)
     104              : {
     105           48 :     if (whiteListMap.size() == 0) {
     106            0 :         HCCL_ERROR("[Add][WhiteList]client infos map or local Ip is empty.");
     107            0 :         return HCCL_E_PARA;
     108              :     }
     109              : 
     110              :     HcclResult ret;
     111           48 :     for (auto& res : serverSocketMap_) {
     112            0 :         if (res.second->GetLocalIp() == localIp) {
     113            0 :             std::vector<SocketWlistInfo> wlistInfosVec{};
     114            0 :             for (auto iter = whiteListMap.begin(); iter != whiteListMap.end(); iter++) {
     115            0 :                 auto dstRankLinkInfo = iter->second;
     116            0 :                 ret = ConstructWhiteList(commTag, isInterLink, socketType, dstRankLinkInfo, wlistInfosVec, connectMode);
     117            0 :                 CHK_PRT_RET(
     118              :                     ret != HCCL_SUCCESS, HCCL_ERROR("[Add][WhiteList]Construct white lists is failed. ret[%d]", ret),
     119              :                     ret);
     120            0 :             }
     121              : 
     122            0 :             if (wlistInfosVec.size() > 0) {
     123            0 :                 HCCL_INFO("[Add][WhiteList]wlist size[%u] ", wlistInfosVec.size());
     124            0 :                 CHK_RET(res.second->AddWhiteList(wlistInfosVec));
     125            0 :                 SaveWhiteListInfo(commTag, res.second, wlistInfosVec);
     126              :             }
     127            0 :         }
     128              :     }
     129              : 
     130           48 :     return HCCL_SUCCESS;
     131              : }
     132              : 
     133            0 : HcclResult HcclSocketManager::ConstructWhiteList(
     134              :     const std::string& commTag, bool isInterLink, NicType socketType, const HcclRankLinkInfo& dstRankLinkInfo,
     135              :     std::vector<SocketWlistInfo>& wlistInfosVec, uint32_t connectMode)
     136              : {
     137              :     SocketWlistInfo wlistInfo;
     138            0 :     u32 userRank = dstRankLinkInfo.userRank;
     139            0 :     for (u32 i = 0; i < dstRankLinkInfo.socketsPerLink; i++) {
     140              :         // 使用Client Rank作为确定标识,保证Client和Server的Tag一致
     141            0 :         std::string tag;
     142            0 :         if (connectMode != 0) {
     143            0 :             tag = commTag;
     144              :         } else {
     145            0 :             tag = MakeUniqueConnTag(commTag, isInterLink, userRank, i);
     146              :         }
     147            0 :         wlistInfo.connLimit = GetConnLimit(socketType);
     148            0 :         s32 sRet = memcpy_s(&wlistInfo.tag[0], sizeof(wlistInfo.tag), tag.c_str(), tag.size() + 1);
     149            0 :         if (sRet != EOK) {
     150            0 :             HCCL_ERROR("[Construct][WhiteList]memory copy failed. errorno[%d]", sRet);
     151            0 :             return HCCL_E_MEMORY;
     152              :         }
     153              : 
     154            0 :         wlistInfo.remoteIp.addr = dstRankLinkInfo.ip.GetBinaryAddress().addr;
     155            0 :         wlistInfo.remoteIp.addr6 = dstRankLinkInfo.ip.GetBinaryAddress().addr6;
     156            0 :         HCCL_DEBUG(
     157              :             "[Construct][WhiteList]remoteIp[%s], tag[%s]", dstRankLinkInfo.ip.GetReadableAddress(), wlistInfo.tag);
     158            0 :         wlistInfosVec.push_back(wlistInfo);
     159            0 :     }
     160              : 
     161            0 :     return HCCL_SUCCESS;
     162              : }
     163              : 
     164              : // private
     165              : // 移除白名单
     166           26 : HcclResult HcclSocketManager::DelWhiteList(const std::string& commTag)
     167              : {
     168           26 :     std::unique_lock<std::mutex> lock(wlistMapMutex_);
     169           26 :     auto it = wlistInfosMap_.find(commTag);
     170           26 :     if (it != wlistInfosMap_.end()) {
     171            0 :         auto nicWlistInfosMap_ = it->second;
     172            0 :         for (auto iter = nicWlistInfosMap_.begin(); iter != nicWlistInfosMap_.end(); iter++) {
     173            0 :             auto wlistInfosVec_ = iter->second;
     174            0 :             iter->first->DelWhiteList(wlistInfosVec_);
     175            0 :         }
     176            0 :         wlistInfosMap_.erase(it);
     177            0 :     }
     178           26 :     return HCCL_SUCCESS;
     179           26 : }
     180              : 
     181              : // public API
     182              : // 与远端创建连接,异步接口
     183           90 : HcclResult HcclSocketManager::CreateSockets(
     184              :     const std::string& commTag, bool isInterLink, const HcclNetDevCtx netDevCtx, NicType socketType,
     185              :     HcclSocketRole localRole, const HcclIpAddress& localIp, const std::map<u32, HcclRankLinkInfo>& remoteInfos,
     186              :     std::map<u32, std::vector<std::shared_ptr<HcclSocket>>>& socketsMap, std::map<u32, u32>& dstRankToUserRank,
     187              :     bool isSupportReuse, uint32_t connectMode)
     188              : {
     189           90 :     if (remoteInfos.size() == 0) {
     190            0 :         HCCL_ERROR("[Create][Sockets]remote infos map or local Ip is empty.");
     191            0 :         return HCCL_E_PARA;
     192              :     }
     193              : 
     194              :     HcclResult ret;
     195          144 :     for (auto iter = remoteInfos.begin(); iter != remoteInfos.end(); iter++) {
     196           93 :         std::vector<std::shared_ptr<HcclSocket>> rankSockets{};
     197           93 :         auto remoteIpIter = iter->second;
     198           93 :         u32 remoteUserRank = remoteIpIter.userRank;
     199           93 :         ret = CreateSockets(
     200              :             commTag, isInterLink, netDevCtx, socketType, localRole, localIp, remoteIpIter, rankSockets, isSupportReuse,
     201              :             connectMode);
     202           93 :         CHK_PRT_RET(
     203              :             ret != HCCL_SUCCESS,
     204              :             HCCL_ERROR("[Create][Sockets]create to rank[%u] connection is failed. ret[%u]", iter->first, ret), ret);
     205              : 
     206           54 :         if (rankSockets.size() > 0) {
     207           54 :             socketsMap.insert(std::make_pair(iter->first, rankSockets));
     208           54 :             dstRankToUserRank.insert(std::make_pair(iter->first, remoteUserRank));
     209              :         }
     210          132 :     }
     211           51 :     return HCCL_SUCCESS;
     212              : }
     213              : 
     214              : // private
     215              : // 与指定IP创建Socket链接
     216           93 : HcclResult HcclSocketManager::CreateSockets(
     217              :     const std::string& commTag, bool isInterLink, const HcclNetDevCtx netDevCtx, NicType socketType,
     218              :     HcclSocketRole localRole, const HcclIpAddress& localIp, const HcclRankLinkInfo& remoteLinkInfo,
     219              :     std::vector<std::shared_ptr<HcclSocket>>& ipSockets, bool isSupportReuse, uint32_t connectMode)
     220              : {
     221              :     HcclResult ret;
     222              : 
     223           93 :     u32 remoteRank = remoteLinkInfo.userRank;
     224           93 :     auto remoteIp = remoteLinkInfo.ip;
     225           93 :     u32 remotePort = remoteLinkInfo.port;
     226           93 :     u32 socketsPerLink = remoteLinkInfo.socketsPerLink;
     227              : 
     228              :     // 支持复用,则先找下是否与相同的远端IP创建过链接
     229           93 :     if (isSupportReuse) {
     230              :         // 先根据远端IP(暂未管本端IP)找,找到了就返回,没找到正常创建
     231           87 :         u32 gotLinkNum = 0;
     232           87 :         GetSocketsByRankIP(commTag, remoteRank, remoteIp, socketsPerLink, ipSockets, gotLinkNum);
     233           87 :         socketsPerLink -= gotLinkNum;
     234           87 :         if (socketsPerLink == 0) {
     235            0 :             HCCL_INFO(
     236              :                 "[Create][Sockets]get reuse socket is success."
     237              :                 "commTag[%s], remoteRank[%u], remoteIp[%s], localRank[%u].",
     238              :                 commTag.c_str(), remoteRank, remoteIp.GetReadableIP(), userRank_);
     239            0 :             return HCCL_SUCCESS;
     240              :         }
     241              :     }
     242              : 
     243           93 :     ret = ConstructSockets(
     244              :         commTag, isInterLink, netDevCtx, socketsPerLink, socketType, remoteRank, remoteIp, remotePort, localIp,
     245              :         localRole, ipSockets, connectMode);
     246           92 :     CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("[Create][Sockets]construct socket is failed. ret[%d]", ret), ret);
     247              : 
     248              :     // 若作为客户端,需要发起Connect请求
     249              :     // 原实现是采用批量接口,当前使用Socket对象进行发起连接,无法使用批量接口,性能理论上可能有下降
     250              :     // 后继根据影响情况,看是否使用批量接口,若采用批量,则需要在更上层调用发起Connect请求才能最大程度地批量
     251           92 :     if (localRole == HcclSocketRole::SOCKET_ROLE_CLIENT) {
     252           46 :         for (u32 i = 0; i < ipSockets.size(); i++) {
     253           42 :             if (ipSockets[i]->GetStatus() != HcclSocketStatus::SOCKET_OK) {
     254           41 :                 CHK_RET(ipSockets[i]->Connect());
     255              :             }
     256              :         }
     257              :     }
     258              : 
     259           54 :     SaveSockets(commTag, remoteRank, remoteIp, ipSockets);
     260              : 
     261           54 :     HCCL_INFO("[Create][Sockets]Create Sockets is success.");
     262           54 :     return HCCL_SUCCESS;
     263           93 : }
     264              : 
     265              : // private
     266              : // 当前仅用于析构时, 关闭所有Socket; 后继若有需要开放接口,注意 isSupCloseSockImmed_ 需要处理
     267          859 : void HcclSocketManager::DestroySockets()
     268              : {
     269              :     // 不对 isSupCloseSockImmed_ 进行判断处理, 强制关闭所有Socket
     270          859 :     std::unique_lock<std::mutex> lock(socketsMapMutex_);
     271          895 :     for (auto it = commSocketsMap_.begin(); it != commSocketsMap_.end(); it++) {
     272           24 :         auto rankSocketmap = it->second;
     273           74 :         for (auto iter = rankSocketmap.begin(); iter != rankSocketmap.end(); iter++) {
     274           50 :             DestroySockets(iter->second);
     275              :         }
     276              :         // 删除链接时,自动删除 WhiteList
     277           24 :         DelWhiteList(it->first);
     278           24 :     }
     279          867 :     commSocketsMap_.clear();
     280         1734 :     return;
     281          864 : }
     282              : 
     283              : // public API
     284            2 : void HcclSocketManager::DestroySockets(const std::string& commTag)
     285              : {
     286            2 :     std::unique_lock<std::mutex> lock(socketsMapMutex_);
     287            2 :     auto it = commSocketsMap_.find(commTag);
     288            2 :     if (it != commSocketsMap_.end()) {
     289            2 :         auto rankSocketmap = it->second;
     290            6 :         for (auto iter = rankSocketmap.begin(); iter != rankSocketmap.end(); iter++) {
     291            4 :             DestroySockets(iter->second);
     292              :         }
     293            2 :         commSocketsMap_.erase(it);
     294            2 :     }
     295            2 :     DelWhiteList(commTag);
     296            4 :     return;
     297            2 : }
     298              : 
     299              : // public API
     300              : // Destroy指定的远端Rank的所有的 IP 连接
     301              : // 暂无使用, 考虑删除
     302            2 : void HcclSocketManager::DestroySockets(const std::string& commTag, u32 rank)
     303              : {
     304            2 :     std::unique_lock<std::mutex> lock(socketsMapMutex_);
     305            2 :     auto it = commSocketsMap_.find(commTag);
     306            2 :     if (it != commSocketsMap_.end()) {
     307            2 :         auto rankSocketmap = it->second;
     308            2 :         auto iter = rankSocketmap.find(rank);
     309            2 :         if (iter != rankSocketmap.end()) {
     310            2 :             DestroySockets(iter->second);
     311            2 :             rankSocketmap.erase(iter);
     312              :         }
     313            2 :     }
     314            4 :     return;
     315            2 : }
     316              : 
     317              : // private
     318           56 : void HcclSocketManager::DestroySockets(std::vector<std::shared_ptr<HcclSocket>> rankSockets)
     319              : {
     320          112 :     for (u32 j = 0; j < rankSockets.size(); j++) {
     321           56 :         auto temp = rankSockets[j];
     322           56 :         if (temp != nullptr) {
     323           56 :             temp->Close();
     324              :         }
     325           56 :     }
     326              : 
     327           56 :     return;
     328              : }
     329              : 
     330              : // public API
     331              : // isWaitEstablished 为 true 时, 连接建立完成后返回; 为 flase时, 连接请求发起后即返回. 默认为 true.
     332              : // 预留 调用时设置为 false, 通过多线程的方式提升建链性能.
     333            0 : HcclResult HcclSocketManager::CreateSockets(
     334              :     const std::string& commTag, bool isInterLink, const HcclNetDevCtx netDevCtx,
     335              :     const std::map<u32, HcclRankLinkInfo>& dstServerMap, const std::map<u32, HcclRankLinkInfo>& dstClientMap,
     336              :     std::map<u32, std::vector<std::shared_ptr<HcclSocket>>>& serverSocketsMap,
     337              :     std::map<u32, std::vector<std::shared_ptr<HcclSocket>>>& clientSocketsMap, bool isSupportReuse,
     338              :     bool isWaitEstablished)
     339              : {
     340            0 :     HCCL_DEBUG("[Create][Sockets]client map size[%u], server map size[%u]", dstClientMap.size(), dstServerMap.size());
     341              : 
     342            0 :     HCCL_DEBUG(
     343              :         "[Create][Sockets]commTag %s, isInterLink %d, isSupportReuse %d, "
     344              :         "isWaitEstablished %d",
     345              :         commTag.c_str(), isInterLink, isSupportReuse, isWaitEstablished);
     346              : 
     347              :     HcclResult ret;
     348              : 
     349              :     NicType socketType;
     350            0 :     CHK_RET(HcclNetDevGetNicType(netDevCtx, &socketType));
     351            0 :     HcclIpAddress localIp{0};
     352            0 :     CHK_RET(HcclNetDevGetLocalIp(netDevCtx, localIp));
     353              : 
     354            0 :     HCCL_DEBUG("[Create][Sockets]localIp %s", localIp.GetReadableAddress());
     355              : 
     356            0 :     for (auto it = dstServerMap.begin(); it != dstServerMap.end(); ++it) {
     357            0 :         HCCL_DEBUG("[Create][Sockets]dstServerMap rank %u", it->first);
     358            0 :         auto info = it->second;
     359            0 :         HCCL_DEBUG(
     360              :             "[Create][Sockets]dstServerMap userRank %u, devicePhyId %u, ip %s, port %u", info.userRank,
     361              :             info.devicePhyId, info.ip.GetReadableAddress(), info.port);
     362            0 :     }
     363            0 :     for (auto it = dstClientMap.begin(); it != dstClientMap.end(); ++it) {
     364            0 :         HCCL_DEBUG("[Create][Sockets]dstClientMap rank %u", it->first);
     365            0 :         auto info = it->second;
     366            0 :         HCCL_DEBUG(
     367              :             "[Create][Sockets]dstClientMap userRank %u, devicePhyId %u, ip %s, port %u", info.userRank,
     368              :             info.devicePhyId, info.ip.GetReadableAddress(), info.port);
     369            0 :     }
     370              : 
     371              :     // 作为服务端时,先填加白名单
     372            0 :     if (dstClientMap.size() > 0) {
     373            0 :         ret = AddWhiteList(commTag, isInterLink, socketType, localIp, dstClientMap);
     374            0 :         CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("[Create][Sockets]Add white list failed. ret[%d]", ret), ret);
     375              :     }
     376              : 
     377            0 :     std::map<u32, u32> serverDstRankToUserRank; // 子平面rank 映射 通信域 rank
     378            0 :     std::map<u32, u32> clientDstRankToUserRank; // 子平面rank 映射 通信域 rank
     379              : 
     380            0 :     if (dstServerMap.size() > 0) {
     381              :         // 作为客户端,创建 Socket,并向所有的服务端发起建链请求
     382            0 :         ret = CreateSockets(
     383              :             commTag, isInterLink, netDevCtx, socketType, HcclSocketRole::SOCKET_ROLE_CLIENT, localIp, dstServerMap,
     384              :             clientSocketsMap, clientDstRankToUserRank, isSupportReuse);
     385            0 :         CHK_PRT_RET(
     386              :             ret != HCCL_SUCCESS,
     387              :             HCCL_ERROR("[Create][Sockets]Create sockets failed, local role is client. ret[%d]", ret), ret);
     388              :     }
     389              : 
     390            0 :     if (dstClientMap.size() > 0) {
     391              :         // 作为服务端,创建 Socket,然后返回
     392            0 :         ret = CreateSockets(
     393              :             commTag, isInterLink, netDevCtx, socketType, HcclSocketRole::SOCKET_ROLE_SERVER, localIp, dstClientMap,
     394              :             serverSocketsMap, serverDstRankToUserRank, isSupportReuse);
     395            0 :         CHK_PRT_RET(
     396              :             ret != HCCL_SUCCESS,
     397              :             HCCL_ERROR(
     398              :                 "[Create][Sockets]Create connection failed, local role is server."
     399              :                 " ret[%d]",
     400              :                 ret),
     401              :             ret);
     402              :     }
     403              : 
     404            0 :     HCCL_INFO(
     405              :         "[Create][Sockets]client socket map size %u, server socket map size %u", serverSocketsMap.size(),
     406              :         serverSocketsMap.size());
     407              : 
     408              :     // 需要等待连接建立成功时,则会阻塞
     409            0 :     if (isWaitEstablished) {
     410              :         // 等待所有作为客户端的链接建立成功
     411            0 :         ret = WaitLinksEstablishCompleted(HcclSocketRole::SOCKET_ROLE_CLIENT, clientSocketsMap);
     412            0 :         if (ret != HCCL_SUCCESS) {
     413            0 :             HCCL_ERROR("[Create][Sockets]Wait links establish completed failed, local role is client. ret[%d]", ret);
     414            0 :             TlsStatus tlsStatus = TlsStatus::UNKNOWN;
     415            0 :             CHK_PRT_CONT(
     416              :                 HcclNetDevGetTlsStatus(netDevCtx, &tlsStatus),
     417              :                 HCCL_WARNING("[HcclNetDevGetTlsStatus] Can not get TlsStatus"));
     418            0 :             PrintErrorConnection(
     419              :                 HcclSocketRole::SOCKET_ROLE_CLIENT, clientSocketsMap, clientDstRankToUserRank, tlsStatus);
     420            0 :             return ret;
     421              :         }
     422              : 
     423              :         // 等待所有作为服务端的链接建立成功
     424            0 :         ret = WaitLinksEstablishCompleted(HcclSocketRole::SOCKET_ROLE_SERVER, serverSocketsMap);
     425            0 :         if (ret != HCCL_SUCCESS) {
     426            0 :             HCCL_ERROR("[Create][Sockets]Wait links establish completed failed, local role is server. ret[%d]", ret);
     427            0 :             TlsStatus tlsStatus = TlsStatus::UNKNOWN;
     428            0 :             CHK_PRT_CONT(
     429              :                 HcclNetDevGetTlsStatus(netDevCtx, &tlsStatus),
     430              :                 HCCL_WARNING("[HcclNetDevGetTlsStatus] Can not get TlsStatus"));
     431            0 :             PrintErrorConnection(
     432              :                 HcclSocketRole::SOCKET_ROLE_SERVER, serverSocketsMap, serverDstRankToUserRank, tlsStatus);
     433            0 :             return ret;
     434              :         }
     435              :     }
     436              : 
     437            0 :     return HCCL_SUCCESS;
     438            0 : }
     439              : 
     440            0 : HcclResult HcclSocketManager::AddWhiteList(
     441              :     const std::string& commTag, const HcclNetDevCtx netDevCtx, HcclRankLinkInfo remoteRankInfo)
     442              : {
     443              :     NicType socketType;
     444            0 :     CHK_RET(HcclNetDevGetNicType(netDevCtx, &socketType));
     445            0 :     HcclIpAddress localIp{0};
     446            0 :     CHK_RET(HcclNetDevGetLocalIp(netDevCtx, localIp));
     447              : 
     448            0 :     bool isInterLink{true};
     449            0 :     if (socketType == NicType::VNIC_TYPE) {
     450            0 :         isInterLink = false;
     451              :     }
     452              : 
     453              :     HcclResult ret;
     454            0 :     HcclSocketRole role
     455            0 :         = userRank_ < remoteRankInfo.userRank ? HcclSocketRole::SOCKET_ROLE_SERVER : HcclSocketRole::SOCKET_ROLE_CLIENT;
     456              : 
     457            0 :     std::map<u32, HcclRankLinkInfo> remoteMap;
     458            0 :     remoteMap.insert(std::make_pair(remoteRankInfo.userRank, remoteRankInfo));
     459              : 
     460              :     // 作为服务端时,先填加白名单
     461            0 :     if (role == HcclSocketRole::SOCKET_ROLE_SERVER) {
     462            0 :         ret = AddWhiteList(commTag, isInterLink, socketType, localIp, remoteMap);
     463            0 :         CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("[Create][Sockets]Add white list failed. ret[%d]", ret), ret);
     464              :     }
     465              : 
     466            0 :     return HCCL_SUCCESS;
     467            0 : }
     468              : 
     469           86 : HcclResult HcclSocketManager::CreateSingleLinkSocket(
     470              :     const std::string& commTag, const HcclNetDevCtx netDevCtx, HcclRankLinkInfo rmtRank,
     471              :     std::vector<std::shared_ptr<HcclSocket>>& connectSockets, bool isWaitEstablished, bool isSupportReuse, s32 timeout,
     472              :     uint32_t connectMode)
     473              : {
     474              :     HcclResult ret;
     475              :     NicType socketType;
     476           86 :     CHK_RET(HcclNetDevGetNicType(netDevCtx, &socketType));
     477           86 :     HcclIpAddress localIp{0};
     478           87 :     CHK_RET(HcclNetDevGetLocalIp(netDevCtx, localIp));
     479              : 
     480           86 :     bool isInterLink{true};
     481           86 :     if (socketType == NicType::VNIC_TYPE) {
     482           86 :         isInterLink = false;
     483              :     }
     484           86 :     HcclSocketRole role
     485           86 :         = userRank_ < rmtRank.userRank ? HcclSocketRole::SOCKET_ROLE_SERVER : HcclSocketRole::SOCKET_ROLE_CLIENT;
     486              : 
     487           86 :     std::map<u32, HcclRankLinkInfo> remoteMap;
     488           87 :     remoteMap.insert(std::make_pair(rmtRank.userRank, rmtRank));
     489           87 :     if (role == HcclSocketRole::SOCKET_ROLE_SERVER) { // 作为服务端时,先填加白名单
     490           48 :         ret = AddWhiteList(commTag, isInterLink, socketType, localIp, remoteMap, connectMode);
     491           48 :         CHK_PRT_RET(ret != HCCL_SUCCESS, HCCL_ERROR("[Create][Sockets]Add white list failed. ret[%d]", ret), ret);
     492              :     }
     493              : 
     494           87 :     std::map<u32, u32> remoteRankToUserRank; // 子平面rank 映射 通信域 rank
     495           87 :     std::map<u32, std::vector<std::shared_ptr<HcclSocket>>> socketsMap;
     496           87 :     ret = CreateSockets(
     497              :         commTag, isInterLink, netDevCtx, socketType, role, localIp, remoteMap, socketsMap, remoteRankToUserRank,
     498              :         isSupportReuse, connectMode);
     499           87 :     CHK_PRT_RET(
     500              :         ret != HCCL_SUCCESS,
     501              :         HCCL_ERROR(
     502              :             "[Create][Sockets]Create connection failed, local role is server."
     503              :             " ret[%d]",
     504              :             ret),
     505              :         ret);
     506           48 :     if (isWaitEstablished) {
     507            0 :         ret = WaitLinksEstablishCompleted(role, socketsMap, timeout);
     508            0 :         if (ret != HCCL_SUCCESS) {
     509            0 :             HCCL_ERROR("[Create][Sockets]Wait links establish completed failed, local role is client. ret[%d]", ret);
     510            0 :             TlsStatus tlsStatus = TlsStatus::UNKNOWN;
     511            0 :             CHK_PRT_CONT(HcclNetDevGetTlsStatus(netDevCtx, &tlsStatus), HCCL_WARNING("Can not get TlsStatus"));
     512            0 :             PrintErrorConnection(role, socketsMap, remoteRankToUserRank, tlsStatus);
     513            0 :             AbortAndDeleteSocket(commTag, role, socketsMap);
     514            0 :             return ret;
     515              :         }
     516              :     }
     517              : 
     518           48 :     connectSockets.clear();
     519           96 :     for (auto iter = socketsMap.begin(); iter != socketsMap.end(); iter++) {
     520           48 :         auto rankSockets = iter->second;
     521           96 :         for (u32 i = 0; i < rankSockets.size(); i++) {
     522           48 :             connectSockets.push_back(rankSockets[i]);
     523              :         }
     524           48 :     }
     525           48 :     return HCCL_SUCCESS;
     526           87 : }
     527              : 
     528            0 : void HcclSocketManager::AbortAndDeleteSocket(
     529              :     const std::string& commTag, HcclSocketRole role,
     530              :     const std::map<u32, std::vector<std::shared_ptr<HcclSocket>>>& socketsMap)
     531              : {
     532              :     (void)role;
     533            0 :     for (auto iter = socketsMap.begin(); iter != socketsMap.end(); iter++) {
     534            0 :         auto rankSockets = iter->second;
     535            0 :         for (auto socket : rankSockets) {
     536              :             // 建链超时后终止当前的建链请求并删除socket防止复用
     537            0 :             (void)socket->Close();
     538            0 :         }
     539            0 :     }
     540            0 :     DestroySockets(commTag);
     541            0 :     return;
     542              : }
     543              : 
     544              : // public
     545            0 : HcclResult HcclSocketManager::GetListenPortByIp(
     546              :     [[maybe_unused]] const NICDeployment nicDeployment, const HcclIpAddress& ipAddr, std::set<u32>& listenedPort)
     547              : {
     548            0 :     for (auto& res : serverSocketMap_) {
     549            0 :         if (res.first.ip == ipAddr) {
     550            0 :             listenedPort.insert(res.first.listenPort);
     551              :         }
     552              :     }
     553              : 
     554            0 :     if (listenedPort.size() > 0) {
     555            0 :         return HCCL_SUCCESS;
     556              :     }
     557              : 
     558            0 :     return HCCL_E_NOT_FOUND;
     559              : }
     560              : 
     561              : // private
     562           40 : void HcclSocketManager::TransformSocketStatus(HcclSocketStatus status, std::string& stringStatus) const
     563              : {
     564           40 :     switch (status) {
     565            2 :         case HcclSocketStatus::SOCKET_CONNECTING:
     566            2 :             stringStatus = "connecting";
     567            2 :             break;
     568            0 :         case HcclSocketStatus::SOCKET_OK:
     569            0 :             stringStatus = "connected";
     570            0 :             break;
     571            0 :         case HcclSocketStatus::SOCKET_TIMEOUT:
     572            0 :             stringStatus = "time out";
     573            0 :             break;
     574           38 :         case HcclSocketStatus::SOCKET_ERROR:
     575           38 :             stringStatus = "connect failed";
     576           38 :             break;
     577            0 :         case HcclSocketStatus::SOCKET_INIT:
     578              :         default:
     579            0 :             stringStatus = "no connect";
     580            0 :             break;
     581              :     }
     582           40 : }
     583              : 
     584              : // private
     585           44 : void HcclSocketManager::PrintSocketsInfo(
     586              :     const std::string& localRole, u32 rank, std::vector<std::shared_ptr<HcclSocket>> ipSockets,
     587              :     std::string& sTlsStatus) const
     588              : {
     589           88 :     for (u32 j = 0; j < ipSockets.size(); j++) {
     590           44 :         std::shared_ptr<HcclSocket> tempSocket = ipSockets[j];
     591           44 :         if (tempSocket->GetStatus() != HcclSocketStatus::SOCKET_OK) {
     592           40 :             std::string connectStatus;
     593           40 :             TransformSocketStatus(tempSocket->GetStatus(), connectStatus);
     594           40 :             HCCL_ERROR(
     595              :                 "   |  %s(%u)   |  %u  |   %s(%u)   |  %u  | %s | %s |   %s  | %s",
     596              :                 tempSocket->GetRemoteIp().GetReadableAddress(), rank, tempSocket->GetRemotePort(),
     597              :                 tempSocket->GetLocalIp().GetReadableAddress(), userRank_, tempSocket->GetLocalPort(), localRole.c_str(),
     598              :                 connectStatus.c_str(), sTlsStatus.c_str(), LOG_KEYWORDS_LINK_INFO.c_str());
     599           40 :         }
     600           44 :     }
     601           44 : }
     602              : 
     603              : // private
     604           41 : void HcclSocketManager::PrintErrorConnectionInfo(
     605              :     HcclSocketRole localRole, std::map<u32, std::vector<std::shared_ptr<HcclSocket>>>& rankSocketsMap,
     606              :     std::map<u32, u32>& dstRankToUserRank, TlsStatus& tlsStatus) const
     607              : {
     608           41 :     std::string sRole;
     609           41 :     switch (localRole) {
     610           39 :         case HcclSocketRole::SOCKET_ROLE_SERVER:
     611           39 :             sRole = " server ";
     612           39 :             break;
     613            2 :         case HcclSocketRole::SOCKET_ROLE_CLIENT:
     614            2 :             sRole = " client ";
     615            2 :             break;
     616            0 :         default:
     617            0 :             sRole = "   NA   ";
     618            0 :             break;
     619              :     }
     620              :     const std::map<TlsStatus, std::string> tlsStatusMap
     621          246 :         = {{TlsStatus::ENABLE, "ENABLE"}, {TlsStatus::DISABLE, "DISABLE"}, {TlsStatus::UNKNOWN, "UNKNOWN"}};
     622           82 :     std::string sTlsStatus = tlsStatusMap.at(tlsStatus);
     623           85 :     for (auto iter = rankSocketsMap.begin(); iter != rankSocketsMap.end(); iter++) {
     624           44 :         auto rankSockets = iter->second;
     625           44 :         PrintSocketsInfo(sRole, dstRankToUserRank[iter->first], rankSockets, sTlsStatus);
     626           44 :     }
     627           82 : }
     628              : 
     629              : // private
     630           41 : void HcclSocketManager::PrintErrorConnection(
     631              :     HcclSocketRole localRole, std::map<u32, std::vector<std::shared_ptr<HcclSocket>>>& rankSocketsMap,
     632              :     std::map<u32, u32>& dstRankToUserRank, TlsStatus& tlsStatus) const
     633              : {
     634              :     // 原实现中,打印输出了一个num,而实际调用中,这个num都是1,所以当前删除了
     635           41 :     HCCL_ERROR("   _________________________LINK_ERROR_INFO___________________________");
     636           41 :     HCCL_ERROR("   | comm error, device[%d] ", deviceLogicId_);
     637           41 :     HCCL_ERROR("   |  dest_ip(user_rank)  |   dest_port   |  src_ip(user_rank)   |   src_port   |   MyRole   "
     638              :                "|   Status   |    TlsStatus   |");
     639           41 :     HCCL_ERROR("   |----------------------|---------------|----------------------|--------------|------------"
     640              :                "|------------|----------------|");
     641              : 
     642           41 :     PrintErrorConnectionInfo(localRole, rankSocketsMap, dstRankToUserRank, tlsStatus);
     643           41 :     return;
     644              : }
     645              : 
     646              : // private
     647              : // 获取SOCKET连接的 ConnLimit,临时写一个,后继看如何判定,后继考虑初始化到Listen的Socket中
     648            0 : u32 HcclSocketManager::GetConnLimit(NicType socketType)
     649              : {
     650            0 :     u32 connLimit = 1;
     651            0 :     switch (socketType) {
     652            0 :         case NicType::DEVICE_NIC_TYPE:
     653            0 :             connLimit = NIC_SOCKET_CONN_LIMIT;
     654            0 :             break;
     655            0 :         case NicType::VNIC_TYPE:
     656            0 :             connLimit = VNIC_SOCKET_CONN_LIMIT;
     657            0 :             break;
     658            0 :         case NicType::HOST_NIC_TYPE:
     659            0 :             connLimit = HOST_SOCKET_CONN_LIMIT;
     660            0 :             break;
     661            0 :         default:
     662            0 :             break;
     663              :     }
     664            0 :     return connLimit;
     665              : }
     666              : 
     667              : // 生成统一的 SocketTag, 用于标识Socket, 对于一对链接(Server <--> Client), SocketTag 需要相同
     668              : std::string
     669           93 : HcclSocketManager::MakeUniqueConnTag(const std::string& commTag, bool isInterLink, u32 userRank, u32 indexForLink)
     670              : {
     671           93 :     std::string tmpStr = isInterLink ? "_Inter_" : "_Intra_";
     672              :     std::string socketTag
     673           92 :         = commTag + tmpStr + "MultiSocket_" + std::to_string(userRank) + "_" + std::to_string(indexForLink);
     674           93 :     return socketTag;
     675           93 : }
     676              : 
     677              : // 保存白名单,后继保存到Listen的Socket对象中
     678            0 : void HcclSocketManager::SaveWhiteListInfo(
     679              :     const std::string& commTag, std::shared_ptr<HcclSocket>& socket, const std::vector<SocketWlistInfo> wlistInfos)
     680              : {
     681              :     // 将Add成功的whiteList, 保存在Socket对象中, 方便后继Del.
     682              :     // 理论上, 接口 DelSocketWhiteList, 上层应该没有调用的必要性.
     683              :     // socket关闭时, 底层应该会自动清除, 而关闭前, 也没看到调用的必要性.
     684              :     // 综上, 即保存这个 wlistInfosMap_ 必要性可能不大.
     685            0 :     std::unique_lock<std::mutex> lock(wlistMapMutex_);
     686            0 :     auto it = wlistInfosMap_.find(commTag);
     687            0 :     if (it == wlistInfosMap_.end()) {
     688            0 :         std::map<std::shared_ptr<HcclSocket>, std::vector<SocketWlistInfo>> nicWlistInfosMap;
     689            0 :         nicWlistInfosMap.insert(std::make_pair(socket, wlistInfos));
     690            0 :         wlistInfosMap_.insert(std::make_pair(commTag, nicWlistInfosMap));
     691            0 :     } else {
     692            0 :         auto& nicWlistInfosMap = it->second;
     693            0 :         auto iter = nicWlistInfosMap.find(socket);
     694            0 :         if (iter == nicWlistInfosMap.end()) {
     695            0 :             nicWlistInfosMap.insert(std::make_pair(socket, wlistInfos));
     696              :         } else {
     697            0 :             auto& wlist = iter->second;
     698            0 :             wlist.insert(wlist.end(), wlistInfos.begin(), wlistInfos.end());
     699              :         }
     700              :     }
     701            0 : }
     702              : 
     703              : // private
     704              : // 根据相关参数构造 HcclSocket 对象
     705           93 : HcclResult HcclSocketManager::ConstructSockets(
     706              :     const std::string& commTag, bool isInterLink, const HcclNetDevCtx netDevCtx, u32 socketsPerLink,
     707              :     [[maybe_unused]] NicType socketType, u32 remoteUserRank, const HcclIpAddress& remoteIp, u32 remotePort,
     708              :     [[maybe_unused]] const HcclIpAddress& localIp, HcclSocketRole localRole,
     709              :     std::vector<std::shared_ptr<HcclSocket>>& socketList, uint32_t connectMode)
     710              : {
     711              :     // 使用Client Rank作为确定标识,保证Client和Server的Tag一致
     712           93 :     u32 clientRank = localRole == HcclSocketRole::SOCKET_ROLE_CLIENT ? userRank_ : remoteUserRank;
     713          185 :     for (u32 i = 0; i < socketsPerLink; i++) {
     714           93 :         std::string socketTag = MakeUniqueConnTag(commTag, isInterLink, clientRank, i);
     715           93 :         std::shared_ptr<HcclSocket> tempSocket;
     716           93 :         if (connectMode > 0) {
     717            0 :             EXCEPTION_CATCH(
     718              :                 (tempSocket = std::make_shared<HcclSocket>(commTag, netDevCtx, remoteIp, remotePort, localRole)),
     719              :                 return HCCL_E_PTR);
     720              :         } else {
     721           93 :             EXCEPTION_CATCH(
     722              :                 (tempSocket = std::make_shared<HcclSocket>(socketTag, netDevCtx, remoteIp, remotePort, localRole)),
     723              :                 return HCCL_E_PTR);
     724              :         }
     725           93 :         CHK_RET(tempSocket->Init());
     726           93 :         socketList.push_back(tempSocket);
     727           93 :     }
     728           92 :     return HCCL_SUCCESS;
     729              : }
     730              : 
     731              : // private
     732              : // 保存 HcclSocket 对象
     733           54 : void HcclSocketManager::SaveSockets(
     734              :     const std::string& commTag, u32 remoteRank, const HcclIpAddress& remoteIp,
     735              :     std::vector<std::shared_ptr<HcclSocket>>& ipSockets)
     736              : {
     737              :     // 将 ipSockets 累加到 commSocketsMap_ 中
     738           54 :     HCCL_DEBUG(
     739              :         "[Save][Sockets]commTag[%s], remoteRank[%u], remoteIp[%s], localRank[%u], save socket size[%u].",
     740              :         commTag.c_str(), remoteRank, remoteIp.GetReadableIP(), userRank_, ipSockets.size());
     741              : 
     742           54 :     std::unique_lock<std::mutex> lock(socketsMapMutex_);
     743           54 :     auto it = commSocketsMap_.find(commTag);
     744           54 :     if (it == commSocketsMap_.end()) {
     745           26 :         std::map<u32, std::vector<std::shared_ptr<HcclSocket>>> rankSocketmap{};
     746           26 :         rankSocketmap.insert(std::make_pair(remoteRank, ipSockets));
     747           26 :         commSocketsMap_.insert(std::make_pair(commTag, rankSocketmap));
     748           26 :     } else {
     749           28 :         auto& rankSocketmap = it->second;
     750           28 :         auto iter = rankSocketmap.find(remoteRank);
     751           28 :         if (iter == rankSocketmap.end()) {
     752           28 :             rankSocketmap.insert(std::make_pair(remoteRank, ipSockets));
     753           28 :             HCCL_DEBUG(
     754              :                 "[Save][Sockets]rankSocketmap size[%u], ipSockets size[%u].", rankSocketmap.size(), ipSockets.size());
     755              :         } else {
     756            0 :             auto& rankSockets = iter->second;
     757              :             // 当前直接插入,不判断本端IP,远端IP是否相同
     758            0 :             for (u32 i = 0; i < ipSockets.size(); i++) {
     759            0 :                 rankSockets.push_back(ipSockets[i]);
     760              :             }
     761            0 :             HCCL_DEBUG(
     762              :                 "[Save][Sockets]rankSocketmap size[%u], rankSockets size[%u].", rankSocketmap.size(),
     763              :                 rankSockets.size());
     764              :         }
     765              :     }
     766           54 :     HCCL_DEBUG("[Save][Sockets]commSocketsMap_ size[%u].", commSocketsMap_.size());
     767           54 : }
     768              : 
     769              : // private
     770           86 : void HcclSocketManager::GetSocketsByRankIP(
     771              :     const std::string& commTag, u32 remoteRank, const HcclIpAddress& remoteIp, u32 socketsPerLink,
     772              :     std::vector<std::shared_ptr<HcclSocket>>& ipSockets, u32& gotLinkNum)
     773              : {
     774           86 :     HCCL_DEBUG(
     775              :         "[Get][SocketsByRankIP]commTag[%s], remoteRank[%u], remoteIp[%s], localRank[%u], SocketsMap size[%u].",
     776              :         commTag.c_str(), remoteRank, remoteIp.GetReadableIP(), userRank_, commSocketsMap_.size());
     777              : 
     778           87 :     gotLinkNum = 0;
     779           87 :     auto it = commSocketsMap_.find(commTag);
     780           86 :     if (it != commSocketsMap_.end()) {
     781           25 :         auto& rankSocketmap = it->second;
     782           25 :         HCCL_INFO("[Get][SocketsByRankIP]rankSocketmap size[%u].", rankSocketmap.size());
     783           25 :         auto iter = rankSocketmap.find(remoteRank);
     784           25 :         if (iter != rankSocketmap.end()) {
     785            0 :             auto& rankSockets = iter->second;
     786            0 :             GetSocketsByRankIP(remoteIp, socketsPerLink, rankSockets, ipSockets, gotLinkNum);
     787              :         }
     788              :     }
     789           87 : }
     790              : 
     791            0 : void HcclSocketManager::GetSocketsByRankIP(
     792              :     const HcclIpAddress& remoteIp, u32 socketsPerLink, std::vector<std::shared_ptr<HcclSocket>>& rankSockets,
     793              :     std::vector<std::shared_ptr<HcclSocket>>& ipSockets, u32& gotLinkNum)
     794              : {
     795            0 :     for (u32 idx = 0; idx < rankSockets.size(); idx++) {
     796            0 :         if (rankSockets[idx]->GetRemoteIp() == remoteIp) {
     797            0 :             ipSockets.push_back(rankSockets[idx]);
     798            0 :             gotLinkNum++;
     799            0 :             if (gotLinkNum == socketsPerLink) {
     800            0 :                 break;
     801              :             }
     802              :         }
     803              :     }
     804            0 : }
     805              : 
     806              : // private
     807              : // 同步接口,更新连接状态,并返回连接成功的连接数量
     808              : HcclResult
     809           40 : HcclSocketManager::WaitLinkEstablish(std::shared_ptr<HcclSocket> socket, std::function<bool()> needStop, s32 timeout)
     810              : {
     811           40 :     CHK_SMART_PTR_NULL(socket);
     812           40 :     u32 count = 0;
     813           40 :     auto startTime = std::chrono::steady_clock::now();
     814           40 :     auto timeoutSec = std::chrono::seconds(timeout > 0 ? timeout : GetExternalInputHcclLinkTimeOut());
     815           40 :     HCCL_DEBUG("[Wait][LinkEstablish]waiting for sockets link up...");
     816              :     while (true) {
     817          987 :         CHK_PRT_RET(needStop(), HCCL_ERROR("Terminating operation due to external request"), HCCL_E_INTERNAL);
     818              : 
     819          987 :         if ((std::chrono::steady_clock::now() - startTime) >= timeoutSec) {
     820            1 :             HCCL_ERROR(
     821              :                 "[Wait][LinkEstablish]wait socket establish timeout, role[%u] rank[%u] timeout[%lld s]",
     822              :                 static_cast<u32>(socket->GetLocalRole()), userRank_, timeoutSec);
     823            1 :             socket->SetStatus(HcclSocketStatus::SOCKET_TIMEOUT);
     824            1 :             return HCCL_E_TIMEOUT;
     825              :         }
     826          986 :         HcclSocketStatus status = socket->GetStatus();
     827          986 :         if (status == HcclSocketStatus::SOCKET_OK) {
     828            0 :             HCCL_DEBUG(
     829              :                 "[Wait][LinkEstablish]socket is establish. localIp[%s], remoteIp[%s]",
     830              :                 socket->GetLocalIp().GetReadableIP(), socket->GetRemoteIp().GetReadableIP());
     831            0 :             return HCCL_SUCCESS;
     832          986 :         } else if (status == HcclSocketStatus::SOCKET_CONNECTING) {
     833          947 :             SaluSleep(ONE_MILLISECOND_OF_USLEEP);
     834              :             // 日志过滤, 50 次才打印一次
     835          947 :             if (count % 50 == 0) {
     836           19 :                 HCCL_DEBUG("[Wait][LinkEstablish]socket is connecting ");
     837              :             }
     838          947 :             count++;
     839              : 
     840          947 :             continue;
     841           39 :         } else if (status == HcclSocketStatus::SOCKET_TIMEOUT) {
     842            0 :             return HCCL_E_TIMEOUT;
     843              :         } else {
     844           39 :             socket->SetStatus(HcclSocketStatus::SOCKET_ERROR);
     845           39 :             return HCCL_E_TCP_CONNECT;
     846              :         }
     847          947 :     }
     848              :     return HCCL_E_TCP_CONNECT;
     849              : }
     850              : 
     851           38 : HcclResult HcclSocketManager::WaitLinksEstablishCompleted(
     852              :     HcclSocketRole localRole, std::map<u32, std::vector<std::shared_ptr<HcclSocket>>>& socketsMap,
     853              :     std::map<u32, u32>& dstRankToUserRank, const RankInfo& loaclRankInfo, const RankInfo& remoteRankInfo,
     854              :     const HcclNetDevCtx& netDevCtx)
     855              : {
     856              :     (void)loaclRankInfo;
     857              :     (void)remoteRankInfo;
     858           38 :     HcclResult ret = WaitLinksEstablishCompleted(localRole, socketsMap);
     859           38 :     if (ret != HCCL_SUCCESS) {
     860           38 :         TlsStatus tlsStatus = TlsStatus::UNKNOWN;
     861           38 :         CHK_PRT_CONT(
     862              :             HcclNetDevGetTlsStatus(netDevCtx, &tlsStatus),
     863              :             HCCL_WARNING("[HcclNetDevGetTlsStatus] Can not get TlsStatus"));
     864           38 :         PrintErrorConnection(localRole, socketsMap, dstRankToUserRank, tlsStatus);
     865           38 :         HCCL_ERROR("[Create][Sockets]Wait links establish completed failed, local role is client. ret[%d]", ret);
     866           38 :         return ret;
     867              :     }
     868            0 :     return HCCL_SUCCESS;
     869              : }
     870              : 
     871            0 : void HcclSocketManager::AddIpQueue(
     872              :     RankInfo& localRankInfo, RankInfo& remoteRankInfo, NicType nicType, s32 deviceLogicId)
     873              : {
     874            0 :     if (g_RegisterDetectCallBack != nullptr) {
     875            0 :         g_RegisterDetectCallBack(localRankInfo, remoteRankInfo, nicType, deviceLogicId);
     876              :     } else {
     877            0 :         HCCL_RUN_WARNING("[AddIpQueue] g_RegisterDetectCallBack is nullptr");
     878              :     }
     879            0 : }
     880              : 
     881              : // private
     882              : // 同步接口,等待连接建立完成
     883           40 : HcclResult HcclSocketManager::WaitLinksEstablishCompleted(
     884              :     [[maybe_unused]] HcclSocketRole localRole, std::map<u32, std::vector<std::shared_ptr<HcclSocket>>>& rankSocketsMap,
     885              :     s32 timeout)
     886              : {
     887           40 :     for (auto iter = rankSocketsMap.begin(); iter != rankSocketsMap.end(); iter++) {
     888           40 :         auto rankSockets = iter->second;
     889           40 :         for (u32 i = 0; i < rankSockets.size(); i++) {
     890           40 :             HcclResult ret = WaitLinkEstablish(
     891           40 :                 rankSockets[i],
     892           40 :                 [this]() -> bool {
     893          987 :                     return this->GetStopFlag();
     894              :                 },
     895              :                 timeout);
     896           40 :             CHK_PRT_RET(
     897              :                 ret != HCCL_SUCCESS, HCCL_ERROR("[Wait][LinksEstablishCompleted] is failed. ret[%d].", ret), ret);
     898              :         }
     899           40 :     }
     900            0 :     return HCCL_SUCCESS;
     901              : }
     902              : 
     903            0 : HcclResult HcclSocketManager::SetStopFlag(bool value)
     904              : {
     905            0 :     stopFlag_.store(value);
     906              : 
     907            0 :     std::unique_lock<std::mutex> lock(socketsMapMutex_);
     908            0 :     for (auto& socketsMap : commSocketsMap_) {      // map
     909            0 :         for (auto& socketMap : socketsMap.second) { // map
     910            0 :             for (auto& socket : socketMap.second) { // vector
     911            0 :                 CHK_RET(socket->SetStopFlag(value));
     912              :             }
     913              :         }
     914              :     }
     915              : 
     916            0 :     return HCCL_SUCCESS;
     917            0 : }
     918              : 
     919          987 : bool HcclSocketManager::GetStopFlag() { return stopFlag_.load(); }
     920              : 
     921              : #ifdef __cplusplus
     922              : extern "C" {
     923              : #endif // __cplusplus
     924           47 : void DetectCallBack(RegisterDetectCallBack p1) { g_RegisterDetectCallBack = p1; }
     925              : #ifdef __cplusplus
     926              : }
     927              : #endif // __cplusplus
     928              : 
     929              : } // namespace hccl
        

Generated by: LCOV version 2.0-1