LCOV - code coverage report
Current view: top level - base_comm/resources/ccu/ccu_transport - ccu_transport_.cc (source / functions) Coverage Total Hit
Test: coverage.info Lines: 42.0 % 579 243
Test Date: 2026-08-25 19:18:03 Functions: 58.9 % 56 33

            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 "ccu_transport_.h"
      12              : 
      13              : #include "exception_handler.h"
      14              : 
      15              : #include "../../../../../legacy/ascend950/unified_platform/resource/mem/user_remote_mem_getter.h"
      16              : 
      17              : #include "env_config/env_config_v2.h"
      18              : 
      19              : namespace hcomm {
      20              : 
      21              : constexpr uint32_t FINISH_MSG_SIZE = 128;
      22              : constexpr char FINISH_MSG[FINISH_MSG_SIZE] = "Transport exchange data ready!";
      23              : 
      24           15 : HcclResult BuildCcuConnection(
      25              :     const CcuTransport::CcuConnectionInfo& ccuConnectionInfo, std::unique_ptr<CcuConnection>& ccuConnection)
      26              : {
      27           15 :     if (ccuConnectionInfo.type == CcuTransport::CcuConnectionType::UB_CTP) {
      28           30 :         ccuConnection.reset(new (std::nothrow) CcuCtpConnection(
      29           15 :             ccuConnectionInfo.locAddr, ccuConnectionInfo.rmtAddr, ccuConnectionInfo.channelInfo,
      30           30 :             ccuConnectionInfo.ccuJettys, ccuConnectionInfo.qos));
      31              :     } else {
      32            0 :         ccuConnection.reset(new (std::nothrow) CcuRtpConnection(
      33            0 :             ccuConnectionInfo.locAddr, ccuConnectionInfo.rmtAddr, ccuConnectionInfo.channelInfo,
      34            0 :             ccuConnectionInfo.ccuJettys, ccuConnectionInfo.qos));
      35              :     }
      36           15 :     CHK_PTR_NULL(ccuConnection);
      37           15 :     CHK_RET(ccuConnection->Init());
      38           15 :     return HCCL_SUCCESS;
      39              : }
      40              : 
      41            0 : HcclResult CcuCreateTransport(
      42              :     Hccl::Socket* socket, const CcuTransport::CcuConnectionInfo& ccuConnectionInfo,
      43              :     const CcuTransport::CclBufferInfo& cclBufferInfo, std::unique_ptr<CcuTransport>& ccuTransport)
      44              : {
      45            0 :     CHK_PTR_NULL(socket);
      46            0 :     std::unique_ptr<CcuConnection> ccuConnection{nullptr};
      47            0 :     CHK_RET(BuildCcuConnection(ccuConnectionInfo, ccuConnection));
      48              : 
      49            0 :     ccuTransport.reset(new (std::nothrow) CcuTransport(socket, std::move(ccuConnection), cclBufferInfo));
      50            0 :     CHK_PTR_NULL(ccuTransport);
      51            0 :     CHK_RET(ccuTransport->Init());
      52              : 
      53            0 :     return HcclResult::HCCL_SUCCESS;
      54            0 : }
      55              : 
      56           15 : HcclResult CcuCreateTransport(
      57              :     Hccl::Socket* socket, const CcuTransport::CcuConnectionInfo& ccuConnectionInfo,
      58              :     const std::vector<CcuTransport::CclBufferInfo>& bufferInfos, std::unique_ptr<CcuTransport>& ccuTransport)
      59              : {
      60           15 :     CHK_PTR_NULL(socket);
      61           15 :     std::unique_ptr<CcuConnection> ccuConnection{nullptr};
      62           15 :     CHK_RET(BuildCcuConnection(ccuConnectionInfo, ccuConnection));
      63              : 
      64           15 :     if (bufferInfos.size() == 0) {
      65            0 :         HCCL_ERROR("[CcuCreateTransport] bufferNum is 0.");
      66            0 :         return HCCL_E_PARA;
      67              :     }
      68           15 :     ccuTransport.reset(new (std::nothrow) CcuTransport(socket, std::move(ccuConnection), bufferInfos));
      69           15 :     CHK_PTR_NULL(ccuTransport);
      70              :     // 可能申请xn cke失败,需要回退
      71           15 :     auto ret = ccuTransport->Init();
      72           15 :     if (ret == HcclResult::HCCL_E_UNAVAIL) {
      73            0 :         HCCL_WARNING("[%s] ccuTransport init failed, ccu transport resources unavailable.", __func__);
      74            0 :         return ret;
      75              :     }
      76           15 :     CHK_RET(ret);
      77              : 
      78           15 :     return HcclResult::HCCL_SUCCESS;
      79           15 : }
      80              : 
      81           45 : CcuTransport::CcuTransport(
      82           45 :     Hccl::Socket* socket, std::unique_ptr<CcuConnection>&& connection, const CclBufferInfo& locCclBufInfo)
      83           45 :     : socket_(socket),
      84          135 :       ccuConnection_(std::move(connection))
      85              : {
      86           45 :     locBufferInfos_.push_back(locCclBufInfo);
      87           45 : }
      88              : 
      89           17 : CcuTransport::CcuTransport(
      90           17 :     Hccl::Socket* socket, std::unique_ptr<CcuConnection>&& connection, const std::vector<CclBufferInfo>& bufferInfos)
      91           17 :     : socket_(socket),
      92           17 :       ccuConnection_(std::move(connection)),
      93           68 :       locBufferInfos_(bufferInfos)
      94           17 : {}
      95              : 
      96           15 : HcclResult CcuTransport::Init()
      97              : {
      98           15 :     dieId_ = ccuConnection_->GetDieId();
      99           15 :     devLogicId_ = ccuConnection_->GetDevLogicId();
     100           15 :     auto ret = AppendCkes(INIT_CKE_NUM);
     101           15 :     if (ret == HcclResult::HCCL_E_UNAVAIL) {
     102            0 :         return ret;
     103              :     }
     104           15 :     CHK_RET(ret);
     105              : 
     106           15 :     ret = AppendXns(INIT_XN_NUM);
     107           15 :     if (ret == HcclResult::HCCL_E_UNAVAIL) {
     108            0 :         return ret;
     109              :     }
     110           15 :     CHK_RET(ret);
     111              : 
     112           15 :     transStatus_ = TransStatus::INIT;
     113              :     // 正常建链路径在 Init 成功时确认本端资源充足;msg-only(资源不足)路径由
     114              :     // ConstructMsgOnlyTransport 单独覆盖为 UNAVAIL/FAILED,避免依赖调用方设置
     115           15 :     locResStatus_ = CcuResStatus::RES_OK;
     116           15 :     return HCCL_SUCCESS;
     117              : }
     118              : 
     119           12 : CcuTransport::TransStatus CcuTransport::GetStatus()
     120              : {
     121           21 :     if (transStatus_ == TransStatus::READY || transStatus_ == TransStatus::CONNECT_FAILED
     122           21 :         || transStatus_ == TransStatus::SOCKET_TIMEOUT) {
     123           11 :         return transStatus_;
     124              :     }
     125              : 
     126            1 :     if (StatusMachine() != HcclResult::HCCL_SUCCESS) {
     127            0 :         HCCL_ERROR("[CcuTransport][%s] failed, %s.", __func__, transStatus_.Describe().c_str());
     128            0 :         transStatus_ = TransStatus::CONNECT_FAILED;
     129              :     }
     130              : 
     131            1 :     return transStatus_;
     132              : }
     133              : 
     134           15 : HcclResult CcuTransport::AppendCkes(uint32_t ckesNum)
     135              : {
     136           15 :     std::vector<ResInfo> resInfo;
     137           15 :     auto ret = CcuDevMgrImp::AllocCke(devLogicId_, dieId_, ckesNum, resInfo);
     138           15 :     CHK_PRT_RET(
     139              :         ret == HcclResult::HCCL_E_UNAVAIL,
     140              :         HCCL_WARNING("[CcuTransport][%s] failed, the resource is not enough.", __func__), ret);
     141           15 :     CHK_RET(ret);
     142              : 
     143           15 :     const uint32_t resSize = resInfo.size();
     144           30 :     for (uint32_t i = 0; i < resSize; i++) {
     145           15 :         const uint32_t ckeNum = resInfo[i].num;
     146           15 :         const uint32_t ckesSartId = resInfo[i].startId;
     147           75 :         for (uint32_t j = 0; j < ckeNum; j++) {
     148           60 :             locRes_.ckes.emplace_back(ckesSartId + j);
     149              :         }
     150              :     }
     151           15 :     ckesRes_.push_back(resInfo);
     152           15 :     return HCCL_SUCCESS;
     153           15 : }
     154              : 
     155           15 : HcclResult CcuTransport::AppendXns(uint32_t xnsNum)
     156              : {
     157           15 :     std::vector<ResInfo> resInfo;
     158           15 :     auto ret = CcuDevMgrImp::AllocXn(devLogicId_, dieId_, xnsNum, resInfo);
     159           15 :     CHK_PRT_RET(
     160              :         ret == HcclResult::HCCL_E_UNAVAIL,
     161              :         HCCL_WARNING("[CcuTransport][%s] failed, the resource is not enough.", __func__), ret);
     162           15 :     CHK_RET(ret);
     163              : 
     164           15 :     const uint32_t resSize = resInfo.size();
     165           30 :     for (uint32_t i = 0; i < resSize; i++) {
     166           15 :         uint32_t xnNum = resInfo[i].num;
     167           15 :         uint32_t xnsSartId = resInfo[i].startId;
     168           75 :         for (uint32_t j = 0; j < xnNum; j++) {
     169           60 :             locRes_.xns.emplace_back(xnsSartId + j);
     170              :         }
     171              :     }
     172           15 :     xnsRes_.push_back(resInfo);
     173           15 :     return HCCL_SUCCESS;
     174           15 : }
     175              : 
     176            1 : HcclResult CcuTransport::AppendCntXns()
     177              : {
     178            3 :     for (auto& cntXns : locRes_.cntXns) {
     179            2 :         if (cntXns.second == INVALID_UINT) {
     180            2 :             uint32_t wishCntXnId = 0;
     181            2 :             auto ret = CcuDevMgrImp::AllocWishCntXn(devLogicId_, dieId_, cntXns.first, wishCntXnId);
     182            2 :             CHK_PRT_RET(
     183              :                 ret == HcclResult::HCCL_E_UNAVAIL,
     184              :                 HCCL_ERROR("[CcuTransport][%s] failed, the resource is not enough.", __func__), ret);
     185            2 :             CHK_RET(ret);
     186            2 :             cntXns.second = wishCntXnId;
     187              :         }
     188              :     }
     189            1 :     return HCCL_SUCCESS;
     190              : }
     191              : 
     192            2 : HcclResult CcuTransport::StatusMachine()
     193              : {
     194              :     EXCEPTION_HANDLE_BEGIN
     195            2 :     Hccl::SocketStatus socketStatus = socket_->GetAsyncStatus();
     196            2 :     if (socketStatus == Hccl::SocketStatus::INIT || socketStatus == Hccl::SocketStatus::TIMEOUT) {
     197            0 :         HCCL_ERROR("[CcuTransport][GetStatus] socket timeout or no link, please check");
     198            0 :         return HcclResult::HCCL_E_INTERNAL;
     199              :     }
     200              : 
     201            2 :     if (socketStatus != Hccl::SocketStatus::OK) {
     202            0 :         return HcclResult::HCCL_SUCCESS; // 操作成功,保持当前状态
     203              :     }
     204            0 :     EXCEPTION_HANDLE_END
     205              : 
     206            2 :     switch (transStatus_) {
     207            1 :         case CcuTransport::TransStatus::INIT: {
     208            1 :             if (locResStatus_ != CcuResStatus::RES_OK) {
     209              :                 // 本端资源不足或资源申请失败, 无ccuConnection_, 直接发状态标记
     210            1 :                 CHK_RET(SendDataSize());
     211            1 :                 transStatus_ = TransStatus::SEND_DATA_SIZE;
     212            1 :                 break;
     213              :             }
     214            0 :             auto connStatus = ccuConnection_->GetStatus();
     215            0 :             if (connStatus == CcuConnStatus::CONN_INVALID) {
     216            0 :                 HCCL_ERROR(
     217              :                     "[CcuTransport][GetStatus] connection status[%s] failed."
     218              :                     " please check.",
     219              :                     connStatus.Describe().c_str());
     220            0 :                 return HcclResult::HCCL_E_INTERNAL;
     221              :             }
     222              : 
     223            0 :             if (connStatus == CcuConnStatus::EXCHANGEABLE || connStatus == CcuConnStatus::CONNECTED) {
     224              :                 // connection完成本端资源创建或复用时,发送本端资源信息
     225            0 :                 CHK_RET(SendDataSize());
     226            0 :                 transStatus_ = TransStatus::SEND_DATA_SIZE;
     227              :             }
     228              : 
     229              :             // connection状态非错误但未达到目标状态时,transport保持当前状态
     230            0 :             break;
     231              :         }
     232            0 :         case CcuTransport::TransStatus::SEND_DATA_SIZE:
     233            0 :             CHK_RET(RecvDataSize());
     234            0 :             transStatus_ = TransStatus::RECV_DATA_SIZE;
     235            0 :             break;
     236            0 :         case CcuTransport::TransStatus::RECV_DATA_SIZE:
     237            0 :             CHK_RET(SendConnAndTransInfo());
     238            0 :             transStatus_ = TransStatus::SEND_ALL_INFO;
     239            0 :             break;
     240            0 :         case CcuTransport::TransStatus::SEND_ALL_INFO:
     241            0 :             CHK_RET(RecvConnAndTransInfo());
     242            0 :             transStatus_ = TransStatus::RECV_ALL_INFO;
     243            0 :             break;
     244            0 :         case CcuTransport::TransStatus::RECV_ALL_INFO:
     245            0 :             CHK_RET(RecvDataProcess());
     246            0 :             if (locResStatus_ == CcuResStatus::RES_OK && rmtResStatus_ == CcuResStatus::RES_OK) {
     247            0 :                 CHK_RET(ccuConnection_->ImportJetty());
     248              :             }
     249            0 :             transStatus_ = TransStatus::SEND_FIN;
     250            0 :             break;
     251            0 :         case CcuTransport::TransStatus::SEND_FIN: {
     252            0 :             if (locResStatus_ != CcuResStatus::RES_OK || rmtResStatus_ != CcuResStatus::RES_OK) {
     253            0 :                 CHK_RET(SendFinish());
     254            0 :                 transStatus_ = CcuTransport::TransStatus::RECVING_FIN;
     255            0 :                 break;
     256              :             }
     257            0 :             auto connStatus = ccuConnection_->GetStatus();
     258            0 :             if (connStatus == CcuConnStatus::CONN_INVALID) {
     259            0 :                 HCCL_ERROR(
     260              :                     "[CcuTransport][GetStatus] connection status[%s] failed."
     261              :                     " please check",
     262              :                     connStatus.Describe().c_str());
     263            0 :                 return HcclResult::HCCL_E_INTERNAL;
     264              :             }
     265              : 
     266            0 :             if (connStatus == CcuConnStatus::CONNECTED) {
     267            0 :                 CHK_RET(SendFinish());
     268            0 :                 transStatus_ = CcuTransport::TransStatus::RECVING_FIN;
     269              :             }
     270            0 :             break;
     271              :         }
     272            0 :         case CcuTransport::TransStatus::RECVING_FIN:
     273            0 :             CHK_RET(RecvFinish());
     274            0 :             transStatus_ = CcuTransport::TransStatus::RECV_FIN;
     275            0 :             break;
     276            1 :         case CcuTransport::TransStatus::RECV_FIN:
     277            1 :             CHK_RET(CheckFinish());
     278            1 :             if (locResStatus_ != CcuResStatus::RES_OK || rmtResStatus_ != CcuResStatus::RES_OK) {
     279            1 :                 HCCL_WARNING(
     280              :                     "[CcuTransport][%s] resource status not OK after FIN (loc[%u], rmt[%u]) set CONNECT_FAILED",
     281              :                     __func__, static_cast<uint8_t>(locResStatus_), static_cast<uint8_t>(rmtResStatus_));
     282            1 :                 transStatus_ = TransStatus::CONNECT_FAILED;
     283            1 :                 break;
     284              :             }
     285            0 :             transStatus_ = CcuTransport::TransStatus::READY;
     286            0 :             break;
     287            0 :         case CcuTransport::TransStatus::SEND_TRANS_RES:
     288            0 :             CHK_RET(SendTransInfo());
     289            0 :             transStatus_ = CcuTransport::TransStatus::RECVING_TRANS_RES;
     290            0 :             break;
     291            0 :         case CcuTransport::TransStatus::RECVING_TRANS_RES:
     292            0 :             CHK_RET(RecvTransInfo());
     293            0 :             transStatus_ = CcuTransport::TransStatus::RECV_TRANS_RES;
     294            0 :             break;
     295            0 :         case CcuTransport::TransStatus::RECV_TRANS_RES:
     296            0 :             CHK_RET(RecvTransInfoProcess());
     297            0 :             transStatus_ = CcuTransport::TransStatus::SEND_FIN;
     298            0 :             break;
     299            0 :         default:
     300            0 :             HCCL_ERROR("[CcuTransport][%s] failed, error status[%s].", __func__, transStatus_.Describe().c_str());
     301            0 :             transStatus_ = CcuTransport::TransStatus::CONNECT_FAILED;
     302            0 :             break;
     303              :     }
     304            2 :     return HcclResult::HCCL_SUCCESS;
     305              : }
     306              : 
     307            3 : HcclResult CcuTransport::SendDataSize()
     308              : {
     309            3 :     Hccl::BinaryStream binaryStream;
     310              :     // 所有路径先写 locResStatus (int), 接收端据此分流
     311            3 :     int locResStatus = static_cast<int>(locResStatus_);
     312            3 :     binaryStream << locResStatus;
     313            3 :     if (locResStatus_ == CcuResStatus::RES_OK) {
     314            0 :         CHK_RET(HandshakeMsgPack(binaryStream));
     315            0 :         CHK_RET(ConnInfoPack(binaryStream));
     316            0 :         CHK_RET(TransResPack(binaryStream));
     317            0 :         CHK_RET(BufferInfoPack(binaryStream, locBufferInfos_));
     318              :     }
     319            3 :     binaryStream.Dump(sendData_);
     320            3 :     u32 sendSize = sendData_.size();
     321              : 
     322              :     // 发送数据包尺寸
     323              :     EXCEPTION_HANDLE_BEGIN
     324            3 :     socket_->SendAsync(&sendSize, sizeof(sendSize));
     325            0 :     EXCEPTION_HANDLE_END
     326            3 :     HCCL_INFO(
     327              :         "[CcuTransport::%s] Send size[%u] of data success. [%zu] bytes sent. locResStatus[%u]", __func__, sendSize,
     328              :         sizeof(sendSize), static_cast<uint8_t>(locResStatus_));
     329            3 :     return HcclResult::HCCL_SUCCESS;
     330            3 : }
     331              : 
     332            0 : HcclResult CcuTransport::RecvDataSize()
     333              : {
     334              :     // 接收数据包尺寸
     335              :     EXCEPTION_HANDLE_BEGIN
     336            0 :     socket_->RecvAsync(reinterpret_cast<u8*>(&exchangeDataSize_), sizeof(exchangeDataSize_));
     337            0 :     EXCEPTION_HANDLE_END
     338            0 :     HCCL_INFO(
     339              :         "[CcuTransport::%s] Receive size[%u] of data success. [%zu] bytes received.", __func__, exchangeDataSize_,
     340              :         sizeof(exchangeDataSize_));
     341            0 :     return HcclResult::HCCL_SUCCESS;
     342              : }
     343              : 
     344            0 : HcclResult CcuTransport::SendConnAndTransInfo()
     345              : {
     346              :     // 当前socket失败会抛异常,需要统一整改
     347              :     EXCEPTION_HANDLE_BEGIN
     348            0 :     socket_->SendAsync(sendData_.data(), sendData_.size());
     349            0 :     EXCEPTION_HANDLE_END
     350            0 :     return HcclResult::HCCL_SUCCESS;
     351              : }
     352              : 
     353            0 : HcclResult CcuTransport::RecvConnAndTransInfo()
     354              : {
     355            0 :     recvData_.resize(exchangeDataSize_);
     356              :     EXCEPTION_HANDLE_BEGIN
     357            0 :     socket_->RecvAsync(reinterpret_cast<u8*>(recvData_.data()), recvData_.size());
     358            0 :     EXCEPTION_HANDLE_END
     359            0 :     return HcclResult::HCCL_SUCCESS;
     360              : }
     361              : 
     362            4 : HcclResult CcuTransport::RecvDataProcess()
     363              : {
     364            4 :     if (exchangeDataSize_ < sizeof(int)) {
     365            1 :         HCCL_ERROR(
     366              :             "[CcuTransport][%s] exchangeDataSize[%u] < sizeof(int)[%zu], protocol mismatch.", __func__,
     367              :             exchangeDataSize_, sizeof(int));
     368            1 :         return HcclResult::HCCL_E_INTERNAL;
     369              :     }
     370            3 :     Hccl::BinaryStream binaryStream(recvData_);
     371            3 :     int rmtResStatusInt = static_cast<int>(CcuResStatus::RES_UNKNOWN);
     372            3 :     binaryStream >> rmtResStatusInt;
     373              :     // 校验对端传值范围:越界值强转后比较行为未定义,按协议错误处理
     374            3 :     if (rmtResStatusInt < static_cast<int>(CcuResStatus::RES_UNKNOWN)
     375            3 :         || rmtResStatusInt > static_cast<int>(CcuResStatus::RES_FAILED)) {
     376            1 :         HCCL_ERROR(
     377              :             "[CcuTransport][%s] invalid rmtResStatus[%d], out of range[%d,%d].", __func__, rmtResStatusInt,
     378              :             static_cast<int>(CcuResStatus::RES_UNKNOWN), static_cast<int>(CcuResStatus::RES_FAILED));
     379            1 :         return HcclResult::HCCL_E_INTERNAL;
     380              :     }
     381            2 :     rmtResStatus_ = static_cast<CcuResStatus>(rmtResStatusInt);
     382              : 
     383            2 :     if (rmtResStatus_ != CcuResStatus::RES_OK) {
     384            2 :         HCCL_WARNING(
     385              :             "[CcuTransport][%s] remote resource status[%u], skip rest unpack.", __func__,
     386              :             static_cast<uint8_t>(rmtResStatus_));
     387            2 :         return HcclResult::HCCL_SUCCESS;
     388              :     }
     389            0 :     if (locResStatus_ != CcuResStatus::RES_OK) {
     390            0 :         HCCL_WARNING(
     391              :             "[CcuTransport][%s] loc resource status[%u], skip remote full unpack.", __func__,
     392              :             static_cast<uint8_t>(locResStatus_));
     393            0 :         return HcclResult::HCCL_SUCCESS;
     394              :     }
     395            0 :     CHK_RET(HandshakeMsgUnpack(binaryStream));
     396            0 :     CHK_RET(ConnInfoUnpackProc(binaryStream));
     397            0 :     CHK_RET(TransResUnpackProc(binaryStream));
     398            0 :     rmtBufferVec_.clear();
     399            0 :     CHK_RET(BufferInfoUnpack(binaryStream));
     400            0 :     return HcclResult::HCCL_SUCCESS;
     401            3 : }
     402              : 
     403            0 : HcclResult CcuTransport::SendTransInfo()
     404              : {
     405            0 :     Hccl::BinaryStream binaryStream;
     406            0 :     TransResPack(binaryStream);
     407            0 :     binaryStream.Dump(sendTrans_);
     408              :     EXCEPTION_HANDLE_BEGIN
     409            0 :     socket_->SendAsync(sendTrans_.data(), sendTrans_.size());
     410            0 :     EXCEPTION_HANDLE_END
     411            0 :     exchangeDataSize_ = sendTrans_.size();
     412            0 :     return HcclResult::HCCL_SUCCESS;
     413            0 : }
     414              : 
     415            0 : HcclResult CcuTransport::RecvTransInfo()
     416              : {
     417            0 :     recvTrans_.resize(exchangeDataSize_);
     418              :     EXCEPTION_HANDLE_BEGIN
     419            0 :     socket_->RecvAsync(reinterpret_cast<u8*>(recvTrans_.data()), recvTrans_.size());
     420            0 :     EXCEPTION_HANDLE_END
     421            0 :     return HcclResult::HCCL_SUCCESS;
     422              : }
     423              : 
     424            0 : HcclResult CcuTransport::RecvTransInfoProcess()
     425              : {
     426            0 :     Hccl::BinaryStream binaryStream(recvTrans_);
     427            0 :     TransResUnpackProc(binaryStream);
     428            0 :     return HcclResult::HCCL_SUCCESS;
     429            0 : }
     430              : 
     431            1 : HcclResult CcuTransport::HandshakeMsgPack(Hccl::BinaryStream& binaryStream)
     432              : {
     433            1 :     binaryStream << attr_.handshakeMsg;
     434            1 :     HCCL_INFO(
     435              :         "[CcuTransport][%s] start pack handshakeMsg, attr.handshakeMsg.size[%zu]", __func__, attr_.handshakeMsg.size());
     436            1 :     return HcclResult::HCCL_SUCCESS;
     437              : }
     438              : 
     439            0 : HcclResult CcuTransport::ConnInfoPack(Hccl::BinaryStream& binaryStream) const
     440              : {
     441            0 :     std::vector<char> dtoData{};
     442            0 :     CHK_RET(ccuConnection_->Serialize(dtoData));
     443            0 :     binaryStream << dtoData;
     444            0 :     HCCL_INFO("[CcuTransport][%s] start pack connInfo, dtoData.size[%zu]", __func__, dtoData.size());
     445            0 :     return HcclResult::HCCL_SUCCESS;
     446            0 : }
     447              : 
     448            0 : HcclResult CcuTransport::TransResPack(Hccl::BinaryStream& binaryStream)
     449              : {
     450            0 :     const uint32_t locCkesSize = locRes_.ckes.size();
     451            0 :     binaryStream << locCkesSize;
     452            0 :     const uint32_t locCkeSize = locRes_.ckes.size();
     453            0 :     for (uint32_t i = 0; i < locCkeSize; i++) {
     454            0 :         binaryStream << locRes_.ckes[i];
     455              :     }
     456              : 
     457            0 :     const uint32_t locXnsSize = locRes_.xns.size();
     458            0 :     binaryStream << locXnsSize;
     459            0 :     for (uint32_t i = 0; i < locRes_.xns.size(); i++) {
     460            0 :         binaryStream << locRes_.xns[i];
     461              :     }
     462              : 
     463            0 :     HCCL_INFO("Send ckesSize[%u], xnsSize[%u]", locCkesSize, locXnsSize);
     464            0 :     return HcclResult::HCCL_SUCCESS;
     465              : }
     466              : 
     467            0 : HcclResult CcuTransport::TransCntXnResPack(Hccl::BinaryStream& binaryStream)
     468              : {
     469            0 :     const uint32_t locCntXnsSize = locRes_.cntXns.size();
     470            0 :     binaryStream << locCntXnsSize;
     471            0 :     for (auto& cntXns : locRes_.cntXns) {
     472            0 :         binaryStream << cntXns.first << cntXns.second;
     473            0 :         HCCL_INFO("Send resGroupTag[%s], wishCntXn[%u]", cntXns.first.c_str(), cntXns.second);
     474              :     }
     475              : 
     476            0 :     return HcclResult::HCCL_SUCCESS;
     477              : }
     478              : 
     479            0 : HcclResult CcuTransport::BufferInfoPack(Hccl::BinaryStream& binaryStream, std::vector<CclBufferInfo>& bufferVec) const
     480              : {
     481            0 :     u32 locBufferNum = bufferVec.size();
     482            0 :     binaryStream << locBufferNum;
     483            0 :     for (u32 pos = 0; pos < locBufferNum; ++pos) {
     484            0 :         bufferVec[pos].Pack(binaryStream);
     485              :     }
     486            0 :     return HcclResult::HCCL_SUCCESS;
     487              : }
     488              : 
     489            1 : HcclResult CcuTransport::HandshakeMsgUnpack(Hccl::BinaryStream& binaryStream)
     490              : {
     491            1 :     binaryStream >> rmtHandshakeMsg_;
     492              : 
     493            1 :     if (attr_.handshakeMsg.size() != rmtHandshakeMsg_.size()) {
     494            0 :         HCCL_ERROR("handshakeMsg size=%zu is not equal to rmt=%zu", attr_.handshakeMsg.size(), rmtHandshakeMsg_.size());
     495            0 :         return HcclResult::HCCL_E_INTERNAL;
     496              :     }
     497            1 :     HCCL_INFO("[CcuTransport][%s] unpack handshakeMsg, rmtHandshakeMsg.size[%zu]", __func__, rmtHandshakeMsg_.size());
     498            1 :     return HcclResult::HCCL_SUCCESS;
     499              : }
     500              : 
     501            0 : HcclResult CcuTransport::ConnInfoUnpackProc(Hccl::BinaryStream& binaryStream) const
     502              : {
     503            0 :     std::vector<char> dtoData{};
     504            0 :     binaryStream >> dtoData;
     505            0 :     CHK_RET(ccuConnection_->Deserialize(dtoData));
     506            0 :     HCCL_INFO("[CcuTransport][%s] start unpack connInfo, dtoData.size[%zu]", __func__, dtoData.size());
     507            0 :     return HcclResult::HCCL_SUCCESS;
     508            0 : }
     509              : 
     510            0 : HcclResult CcuTransport::TransResUnpackProc(Hccl::BinaryStream& binaryStream)
     511              : {
     512            0 :     uint32_t resSize{0};
     513            0 :     binaryStream >> resSize;
     514            0 :     rmtRes_.ckes.clear();
     515            0 :     for (uint32_t i = 0; i < resSize; i++) {
     516            0 :         uint32_t cke{0};
     517            0 :         binaryStream >> cke;
     518            0 :         rmtRes_.ckes.push_back(cke);
     519              :     }
     520            0 :     HCCL_INFO("Recv ckesSize[%u]", resSize);
     521              : 
     522            0 :     binaryStream >> resSize;
     523            0 :     rmtRes_.xns.clear();
     524            0 :     for (uint32_t i = 0; i < resSize; i++) {
     525            0 :         uint32_t xn{0};
     526            0 :         binaryStream >> xn;
     527            0 :         rmtRes_.xns.push_back(xn);
     528              :     }
     529            0 :     HCCL_INFO("Recv xnsSize[%u]", resSize);
     530              : 
     531            0 :     return HcclResult::HCCL_SUCCESS;
     532              : }
     533              : 
     534            0 : HcclResult CcuTransport::TransCntXnResUnpackProc(Hccl::BinaryStream& binaryStream)
     535              : {
     536            0 :     uint32_t resSize{0};
     537            0 :     binaryStream >> resSize;
     538            0 :     HCCL_INFO("Recv resGroupTagSize[%u]", resSize);
     539            0 :     for (uint32_t num = 0; num < resSize; num++) {
     540            0 :         std::string resGroupTag;
     541            0 :         uint32_t wishCntXn = 0;
     542            0 :         binaryStream >> resGroupTag >> wishCntXn;
     543            0 :         HCCL_INFO(
     544              :             "Recv resGroupTag[%s], wishCntXn[%u], locRes_.cntXns size[%zu]", resGroupTag.c_str(), wishCntXn,
     545              :             locRes_.cntXns.size());
     546            0 :         if (locRes_.cntXns.find(resGroupTag) == locRes_.cntXns.end()) {
     547            0 :             HCCL_ERROR("Recv resGroupTag[%s] not in locRes.", resGroupTag.c_str());
     548            0 :             return HcclResult::HCCL_E_INTERNAL;
     549              :         }
     550            0 :         auto iter = rmtRes_.cntXns.find(resGroupTag);
     551            0 :         if (iter == rmtRes_.cntXns.end()) {
     552            0 :             rmtRes_.cntXns.insert(std::make_pair(resGroupTag, wishCntXn));
     553            0 :         } else if (iter->second != wishCntXn) {
     554            0 :             HCCL_ERROR(
     555              :                 "Recv resGroupTag[%s], current rmt cnt xn[%u] is not equal to recv cnt xn[%u].", resGroupTag.c_str(),
     556              :                 iter->second, wishCntXn);
     557            0 :             return HcclResult::HCCL_E_INTERNAL;
     558              :         }
     559            0 :     }
     560            0 :     return HcclResult::HCCL_SUCCESS;
     561              : }
     562              : 
     563            0 : HcclResult CcuTransport::BufferInfoUnpack(Hccl::BinaryStream& binaryStream)
     564              : {
     565            0 :     u32 rmtBufferNum{0};
     566            0 :     binaryStream >> rmtBufferNum;
     567            0 :     CHK_PRT_RET(
     568              :         rmtBufferNum == 0 || rmtBufferNum > MAX_BUFFER_NUM,
     569              :         HCCL_ERROR(
     570              :             "[CcuTransport][BufferInfoUnpack] rmtBufferNum[%u] is zero or exceeds limit[%u]", rmtBufferNum,
     571              :             MAX_BUFFER_NUM),
     572              :         HCCL_E_PARA);
     573            0 :     HCCL_INFO("[CcuTransport][BufferInfoUnpack] rmtBufferNum[%u]", rmtBufferNum);
     574            0 :     for (u32 pos = 0; pos < rmtBufferNum; ++pos) {
     575            0 :         CclBufferInfo rmtBufferInfo{};
     576            0 :         rmtBufferInfo.Unpack(binaryStream);
     577            0 :         std::string memInfo(rmtBufferInfo.memInfo.data(), strnlen(rmtBufferInfo.memInfo.data(), HCCL_RES_TAG_MAX_LEN));
     578            0 :         if (memInfo == "HcclBuffer") {
     579            0 :             rmtHcclBufferInfo_ = rmtBufferInfo;
     580              :         }
     581            0 :         rmtBufferVec_.push_back(std::make_unique<Hccl::RemoteUbRmaBuffer>(
     582            0 :             reinterpret_cast<uintptr_t>(rmtBufferInfo.addr), rmtBufferInfo.size, rmtBufferInfo.tokenId,
     583            0 :             rmtBufferInfo.tokenValue, Hccl::CommMemTypeToHcclMemType(rmtBufferInfo.type), memInfo));
     584            0 :     }
     585            0 :     return HcclResult::HCCL_SUCCESS;
     586              : }
     587              : 
     588            0 : HcclResult CcuTransport::SendFinish()
     589              : {
     590            0 :     sendFinishMsg_ = std::vector<char>(FINISH_MSG, FINISH_MSG + FINISH_MSG_SIZE);
     591              :     EXCEPTION_HANDLE_BEGIN
     592            0 :     socket_->SendAsync(sendFinishMsg_.data(), FINISH_MSG_SIZE);
     593            0 :     EXCEPTION_HANDLE_END
     594            0 :     return HcclResult::HCCL_SUCCESS;
     595              : }
     596              : 
     597            0 : HcclResult CcuTransport::RecvFinish()
     598              : {
     599            0 :     recvFinishMsg_.resize(FINISH_MSG_SIZE);
     600              :     EXCEPTION_HANDLE_BEGIN
     601            0 :     socket_->RecvAsync(reinterpret_cast<u8*>(recvFinishMsg_.data()), FINISH_MSG_SIZE);
     602            0 :     EXCEPTION_HANDLE_END
     603            0 :     return HcclResult::HCCL_SUCCESS;
     604              : }
     605              : 
     606            3 : HcclResult CcuTransport::CheckFinish()
     607              : {
     608            6 :     const std::string sendFinishMsgStr(sendFinishMsg_.begin(), sendFinishMsg_.end());
     609            3 :     const std::string recvFinishMsgStr(recvFinishMsg_.begin(), recvFinishMsg_.end());
     610            3 :     if (sendFinishMsgStr != recvFinishMsgStr) {
     611            1 :         HCCL_ERROR(
     612              :             "[CcuTransport][RecvFinish]msgRecv[%s] and msgSend[%s] are not equal", recvFinishMsgStr.c_str(),
     613              :             sendFinishMsgStr.c_str());
     614            1 :         return HcclResult::HCCL_E_INTERNAL;
     615              :     }
     616              : 
     617            2 :     return HcclResult::HCCL_SUCCESS;
     618            3 : }
     619              : 
     620           62 : HcclResult CcuTransport::ReleaseTransRes()
     621              : {
     622           77 :     for (uint32_t i = 0; i < ckesRes_.size(); i++) {
     623           15 :         if (ckesRes_[i].empty()) {
     624            0 :             continue;
     625              :         }
     626           15 :         auto ret = CcuDevMgrImp::ReleaseCke(devLogicId_, dieId_, ckesRes_[i]);
     627           15 :         if (ret != HcclResult::HCCL_SUCCESS) {
     628            0 :             HCCL_ERROR(
     629              :                 "[CcuTransport][%s] release ckes failed but passed, "
     630              :                 "devLogicId[%d] dieId[%u].",
     631              :                 __func__, devLogicId_, dieId_);
     632              :         }
     633              :     }
     634           62 :     ckesRes_.clear();
     635              : 
     636           77 :     for (uint32_t i = 0; i < xnsRes_.size(); i++) {
     637           15 :         if (xnsRes_[i].empty()) {
     638            0 :             continue;
     639              :         }
     640           15 :         auto ret = CcuDevMgrImp::ReleaseXn(devLogicId_, dieId_, xnsRes_[i]);
     641           15 :         if (ret != HcclResult::HCCL_SUCCESS) {
     642            0 :             HCCL_ERROR(
     643              :                 "[CcuTransport][%s] release xns failed but passed, "
     644              :                 "devLogicId[%d] dieId[%u].",
     645              :                 __func__, devLogicId_, dieId_);
     646              :         }
     647              :     }
     648           62 :     xnsRes_.clear();
     649              : 
     650           62 :     return HcclResult::HCCL_SUCCESS;
     651              : }
     652              : 
     653           18 : uint32_t CcuTransport::GetDieId() const { return dieId_; }
     654              : 
     655           33 : uint32_t CcuTransport::GetChannelId() const
     656              : {
     657              :     // msg-only(资源不足)transport 无 ccuConnection_,返回无效 id,避免空指针解引用
     658           33 :     if (ccuConnection_ == nullptr) {
     659            0 :         return UINT32_MAX;
     660              :     }
     661           33 :     return ccuConnection_->GetChannelId();
     662              : }
     663              : 
     664           15 : HcclResult CcuTransport::GetLocCkeByIndex(const uint32_t index, uint32_t& locCkeId) const
     665              : {
     666           15 :     CHK_PRT_RET(
     667              :         locRes_.ckes.empty(), HCCL_ERROR("[CcuTransport][%s] failed, local resources is empty.", __func__),
     668              :         HcclResult::HCCL_E_PARA);
     669              : 
     670           14 :     CHK_PRT_RET(
     671              :         index >= locRes_.ckes.size(),
     672              :         HCCL_ERROR(
     673              :             "[CcuTransport][%s] failed, index[%u] is larger than size[%u].", __func__, index, locRes_.ckes.size()),
     674              :         HcclResult::HCCL_E_PARA);
     675              : 
     676           13 :     locCkeId = locRes_.ckes[index];
     677           13 :     return HcclResult::HCCL_SUCCESS;
     678              : }
     679              : 
     680           13 : HcclResult CcuTransport::GetLocXnByIndex(const uint32_t index, uint32_t& locXnId) const
     681              : {
     682           13 :     CHK_PRT_RET(
     683              :         locRes_.xns.empty(), HCCL_ERROR("[CcuTransport][%s] failed, local resources is empty.", __func__),
     684              :         HcclResult::HCCL_E_PARA);
     685              : 
     686           12 :     CHK_PRT_RET(
     687              :         index >= locRes_.xns.size(),
     688              :         HCCL_ERROR(
     689              :             "[CcuTransport][%s] failed, index[%u] is larger than size[%u].", __func__, index, locRes_.xns.size()),
     690              :         HcclResult::HCCL_E_PARA);
     691              : 
     692           11 :     locXnId = locRes_.xns[index];
     693           11 :     return HcclResult::HCCL_SUCCESS;
     694              : }
     695              : 
     696            2 : HcclResult CcuTransport::GetRmtCkeByIndex(const uint32_t index, uint32_t& rmtCkeId) const
     697              : {
     698            2 :     CHK_PRT_RET(
     699              :         rmtRes_.ckes.empty(), HCCL_ERROR("[CcuTransport][%s] failed, local resources is empty.", __func__),
     700              :         HcclResult::HCCL_E_PARA);
     701              : 
     702            1 :     CHK_PRT_RET(
     703              :         index >= rmtRes_.ckes.size(),
     704              :         HCCL_ERROR(
     705              :             "[CcuTransport][%s] failed, index[%u] is larger than size[%u].", __func__, index, rmtRes_.ckes.size()),
     706              :         HcclResult::HCCL_E_PARA);
     707              : 
     708            1 :     rmtCkeId = rmtRes_.ckes[index];
     709            1 :     return HcclResult::HCCL_SUCCESS;
     710              : }
     711              : 
     712            3 : HcclResult CcuTransport::GetRmtXnByIndex(const uint32_t index, uint32_t& rmtXnId) const
     713              : {
     714            3 :     CHK_PRT_RET(
     715              :         rmtRes_.xns.empty(), HCCL_ERROR("[CcuTransport][%s] failed, local resources is empty.", __func__),
     716              :         HcclResult::HCCL_E_PARA);
     717              : 
     718            2 :     CHK_PRT_RET(
     719              :         index >= rmtRes_.xns.size(),
     720              :         HCCL_ERROR(
     721              :             "[CcuTransport][%s] failed, index[%u] is larger than size[%u].", __func__, index, rmtRes_.xns.size()),
     722              :         HcclResult::HCCL_E_PARA);
     723              : 
     724            1 :     rmtXnId = rmtRes_.xns[index];
     725            1 :     return HcclResult::HCCL_SUCCESS;
     726              : }
     727              : 
     728            1 : HcclResult CcuTransport::GetRmtWishCntXnAddr(const std::string& resGroupTag, uint64_t& wishCntXnAddr) const
     729              : {
     730            1 :     auto iter = rmtRes_.cntXns.find(resGroupTag);
     731            1 :     if (iter == rmtRes_.cntXns.end()) {
     732            1 :         HCCL_ERROR("[CcuTransport][%s] failed, resGroupTag[%s] is not found.", __func__, resGroupTag.c_str());
     733            1 :         return HCCL_E_NOT_FOUND;
     734              :     }
     735              : 
     736            0 :     const uint32_t wishCntXn = iter->second;
     737            0 :     CHK_RET(GetRmtVarAddrByXnId(wishCntXn, wishCntXnAddr));
     738            0 :     HCCL_DEBUG(
     739              :         "[CcuTransport][%s] resGroupTag[%s], wishCntXnAddr[%u][0x%llx]", __func__, resGroupTag.c_str(), wishCntXn,
     740              :         wishCntXnAddr);
     741            0 :     return HCCL_SUCCESS;
     742              : }
     743              : 
     744            1 : HcclResult CcuTransport::GetLocBuffer(CclBufferInfo& bufferInfo, const uint32_t& bufNum) const
     745              : {
     746              :     (void)bufNum;
     747            1 :     bufferInfo = locBufferInfos_[0];
     748            1 :     return HCCL_SUCCESS;
     749              : }
     750              : 
     751            1 : HcclResult CcuTransport::GetRmtBuffer(CclBufferInfo& bufferInfo, const uint32_t& bufNum) const
     752              : {
     753              :     (void)bufNum;
     754            1 :     bufferInfo = rmtHcclBufferInfo_;
     755            1 :     return HCCL_SUCCESS;
     756              : }
     757              : 
     758            1 : HcclResult CcuTransport::GetCkeNum(uint32_t& ckeNum) const
     759              : {
     760            1 :     ckeNum = locRes_.ckes.size();
     761            1 :     return HcclResult::HCCL_SUCCESS;
     762              : }
     763              : 
     764            0 : HcclResult CcuTransport::GetRmtSignalAddrByIndex(uint32_t index, uint64_t& rmtCkeAddr) const
     765              : {
     766            0 :     uint32_t rmtCkeId{0};
     767            0 :     uint64_t ckeOffsetCcumAddr{0};
     768            0 :     CHK_RET(GetRmtCkeByIndex(index, rmtCkeId));
     769            0 :     CHK_PRT_RET(
     770              :         CcuDevMgrImp::GetCkeOffsetCcumAddrById(devLogicId_, dieId_, rmtCkeId, ckeOffsetCcumAddr),
     771              :         HCCL_ERROR(
     772              :             "[CcuTransport][%s] Failed to get cke offset address. devLogicId = %d, dieId = %u.", __func__, devLogicId_,
     773              :             dieId_),
     774              :         HCCL_E_INTERNAL);
     775            0 :     uint64_t rmtResourceAddr = ccuConnection_->GetRmtCcuBufAddr();
     776            0 :     HCCL_DEBUG(
     777              :         "[CcuTransport][%s] index[%u] rmtCcuBufAddr[0x%llx], ckeAddr[%u][0x%llx]", __func__, index, rmtResourceAddr,
     778              :         rmtCkeId, ckeOffsetCcumAddr);
     779            0 :     if (ckeOffsetCcumAddr > UINT64_MAX - rmtResourceAddr) {
     780            0 :         HCCL_ERROR(
     781              :             "[CcuTransport][%s] failed, rmtResourceAddr[%llx] + ckeOffsetCcumAddr[%llx] is overflow.", __func__,
     782              :             rmtResourceAddr, ckeOffsetCcumAddr);
     783            0 :         return HcclResult::HCCL_E_INTERNAL;
     784              :     }
     785            0 :     rmtCkeAddr = rmtResourceAddr + ckeOffsetCcumAddr;
     786            0 :     return HCCL_SUCCESS;
     787              : }
     788              : 
     789            0 : HcclResult CcuTransport::GetRmtVarAddrByIndex(uint32_t index, uint64_t& rmtXnAddr) const
     790              : {
     791            0 :     uint32_t rmtXnId{0};
     792            0 :     CHK_RET(GetRmtXnByIndex(index, rmtXnId));
     793            0 :     CHK_RET(GetRmtVarAddrByXnId(rmtXnId, rmtXnAddr));
     794            0 :     HCCL_DEBUG("[CcuTransport][%s] index[%u], xnAddr[%u][0x%llx]", __func__, index, rmtXnId, rmtXnAddr);
     795            0 :     return HCCL_SUCCESS;
     796              : }
     797              : 
     798            0 : HcclResult CcuTransport::GetRmtVarAddrByXnId(const uint32_t rmtXnId, uint64_t& rmtXnAddr) const
     799              : {
     800            0 :     uint64_t xnOffsetCcumAddr = 0;
     801            0 :     CHK_PRT_RET(
     802              :         CcuDevMgrImp::GetXnOffsetCcumAddrById(devLogicId_, dieId_, rmtXnId, xnOffsetCcumAddr),
     803              :         HCCL_ERROR(
     804              :             "[CcuTransport][%s] Failed to get xn offset address. devLogicId = %d, dieId = %u.", __func__, devLogicId_,
     805              :             dieId_),
     806              :         HCCL_E_INTERNAL);
     807            0 :     const uint64_t rmtResourceAddr = ccuConnection_->GetRmtCcuBufAddr();
     808            0 :     HCCL_DEBUG(
     809              :         "[CcuTransport][%s]rmtCcuBufAddr[0x%llx], xnAddr[%u][0x%llx]", __func__, rmtResourceAddr, rmtXnId,
     810              :         xnOffsetCcumAddr);
     811            0 :     if (rmtResourceAddr > UINT64_MAX - xnOffsetCcumAddr) {
     812            0 :         HCCL_ERROR(
     813              :             "[CcuTransport][%s] failed, CCU resource base address[%llu] is "
     814              :             "greater than expected, ccu xn offset[%llu], their sum will exceed the range "
     815              :             "of uint64_t.",
     816              :             __func__, rmtResourceAddr, xnOffsetCcumAddr);
     817            0 :         return HCCL_E_INTERNAL;
     818              :     }
     819            0 :     rmtXnAddr = rmtResourceAddr + xnOffsetCcumAddr;
     820            0 :     return HCCL_SUCCESS;
     821              : }
     822              : 
     823            8 : HcclResult CcuTransport::GetRmtCcuBufferTokenInfo(uint32_t& rmtTokenId, uint32_t& rmtTokenValue) const
     824              : {
     825            8 :     rmtTokenId = ccuConnection_->GetRmtCcuBufTokenId();
     826            8 :     rmtTokenValue = ccuConnection_->GetRmtCcuBufTokenValue();
     827            8 :     return HcclResult::HCCL_SUCCESS;
     828              : }
     829              : 
     830           62 : CcuTransport::~CcuTransport() { (void)ReleaseTransRes(); }
     831              : 
     832            1 : std::string CcuTransport::Describe() const
     833              : {
     834            1 :     std::string description = "";
     835              : 
     836            1 :     description = Hccl::StringFormat("DieId: %u, ", dieId_);
     837            1 :     description += transStatus_.Describe();
     838            1 :     description += Hccl::StringFormat(", LocRes: {%u Ckes, %u Xns}, ", locRes_.ckes.size(), locRes_.xns.size());
     839            1 :     description += Hccl::StringFormat("RmtRes: {%u Ckes, %u Xns}, ", rmtRes_.ckes.size(), rmtRes_.xns.size());
     840            1 :     description += Hccl::StringFormat("CkesRes size: %u, ", ckesRes_.size());
     841            1 :     description += Hccl::StringFormat("XnsRes size: %u.", xnsRes_.size());
     842            1 :     return description;
     843            0 : }
     844              : 
     845            2 : HcclResult CcuTransport::Describe(std::string& dfxMsg)
     846              : {
     847            2 :     CHK_RET(ccuConnection_->Describe(dfxMsg));
     848            1 :     return HcclResult::HCCL_SUCCESS;
     849              : }
     850              : 
     851            1 : void CcuTransport::Clean()
     852              : {
     853            1 :     transStatus_ = TransStatus::INIT;
     854            1 :     sendData_.clear();
     855              :     // msg-only(资源不足)transport 无 ccuConnection_,直接跳过 connection 清理
     856            1 :     if (ccuConnection_ != nullptr) {
     857            1 :         ccuConnection_->Clean();
     858              :     }
     859            1 : }
     860              : 
     861            0 : HcclResult CcuTransport::GetRemoteMems(uint32_t* memNum, CommMem** remoteMem, char*** memInfos)
     862              : {
     863            0 :     std::lock_guard<std::mutex> lock(remoteMemsMutex_);
     864              :     Hccl::RemoteMemCtx<std::unique_ptr<Hccl::RemoteUbRmaBuffer>> remoteMemCtx{
     865            0 :         cacheValid_, rmtBufferVec_, remoteUserMems_, memInfoCopies_, memInfoPointers_, remoteMem, memInfos, memNum};
     866            0 :     CHK_RET(Hccl::GetRemoteUserMems(remoteMemCtx));
     867            0 :     return HCCL_SUCCESS;
     868            0 : }
     869              : 
     870            0 : HcclResult CcuTransport::CheckSocketStatus()
     871              : {
     872            0 :     CHK_PTR_NULL(socket_);
     873            0 :     auto timeout = std::chrono::seconds(Hccl::EnvConfig::GetInstance().GetSocketConfig().GetLinkTimeOut());
     874            0 :     auto startTime = std::chrono::steady_clock::now();
     875            0 :     uint32_t retryCount = 0;
     876              :     while (true) {
     877              :         EXCEPTION_HANDLE_BEGIN
     878            0 :         Hccl::SocketStatus socketStatus = socket_->GetAsyncStatus();
     879            0 :         if (socketStatus == Hccl::SocketStatus::OK) {
     880              :             auto elapsed
     881            0 :                 = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - startTime)
     882            0 :                       .count();
     883            0 :             HCCL_INFO("[CcuTransport][%s] success, elapsed[%lld]ms, retryCount[%u]", __func__, elapsed, retryCount);
     884            0 :             break;
     885              :         }
     886            0 :         if ((std::chrono::steady_clock::now() - startTime) >= timeout || socketStatus == Hccl::SocketStatus::TIMEOUT) {
     887              :             auto elapsed
     888            0 :                 = std::chrono::duration_cast<std::chrono::milliseconds>(std::chrono::steady_clock::now() - startTime)
     889            0 :                       .count();
     890            0 :             HCCL_ERROR(
     891              :                 "[CcuTransport][%s] channel connect timeout after %lld sec, elapsed[%lld]ms, retryCount[%u]", __func__,
     892              :                 timeout.count(), elapsed, retryCount);
     893            0 :             return HCCL_E_TIMEOUT;
     894              :         }
     895            0 :         EXCEPTION_HANDLE_END
     896            0 :         retryCount++;
     897            0 :     }
     898            0 :     return HCCL_SUCCESS;
     899              : }
     900              : 
     901            0 : HcclResult CcuTransport::UpdateMemInfo(std::vector<CcuTransport::CclBufferInfo>& bufferVecTemp)
     902              : {
     903            0 :     if (bufferVecTemp.size() == 0) {
     904            0 :         HCCL_WARNING("[CcuTransport][UpdateMemInfo] bufferNum is 0.");
     905            0 :         return HCCL_SUCCESS;
     906              :     }
     907            0 :     uint32_t totalBufferNum = locBufferInfos_.size() + bufferVecTemp.size();
     908            0 :     if (UNLIKELY(totalBufferNum > MAX_BUFFER_NUM)) {
     909            0 :         HCCL_ERROR(
     910              :             "[CcuTransport][UpdateMemInfo] totalBufferNum[%u] exceeds limit[%u]", totalBufferNum, MAX_BUFFER_NUM);
     911            0 :         return HCCL_E_PARA;
     912              :     }
     913            0 :     HCCL_INFO("[CcuTransport][UpdateMemInfo] bufferNum[%zu]", bufferVecTemp.size());
     914            0 :     sendData_.clear();
     915            0 :     Hccl::BinaryStream sendStream;
     916            0 :     CHK_RET(BufferInfoPack(sendStream, bufferVecTemp));
     917            0 :     sendStream.Dump(sendData_);
     918            0 :     u32 sendSize = sendData_.size();
     919              :     EXCEPTION_HANDLE_BEGIN
     920            0 :     socket_->SendAsync(&sendSize, sizeof(sendSize));
     921            0 :     EXCEPTION_HANDLE_END
     922            0 :     HCCL_INFO(
     923              :         "[CcuTransport][UpdateMemInfo] Send size[%u] of data success. [%zu] bytes sent.", sendSize, sizeof(sendSize));
     924            0 :     CHK_RET(CheckSocketStatus());
     925            0 :     CHK_RET(RecvDataSize());
     926            0 :     CHK_RET(CheckSocketStatus());
     927            0 :     CHK_RET(SendConnAndTransInfo());
     928            0 :     CHK_RET(CheckSocketStatus());
     929            0 :     CHK_RET(RecvConnAndTransInfo());
     930            0 :     CHK_RET(CheckSocketStatus());
     931            0 :     Hccl::BinaryStream recvStream(recvData_);
     932            0 :     CHK_RET(BufferInfoUnpack(recvStream));
     933            0 :     locBufferInfos_.insert(locBufferInfos_.end(), bufferVecTemp.begin(), bufferVecTemp.end());
     934              :     // 流程中已有新增内存数量判断,故执行到此位置一定存在新增内存,需要将标识置位false,使得再次调用GetRemoteMems时重新构造缓存
     935            0 :     cacheValid_ = false;
     936            0 :     return HcclResult::HCCL_SUCCESS;
     937            0 : }
     938              : 
     939            2 : HcclResult CcuTransport::ResUpdate(std::vector<std::string>& resGroupTags)
     940              : {
     941            2 :     if (resGroupTags.size() == 0) {
     942            1 :         return HCCL_SUCCESS;
     943              :     }
     944              : 
     945            3 :     for (auto& resGroupTag : resGroupTags) {
     946            2 :         if (locRes_.cntXns.find(resGroupTag) == locRes_.cntXns.end()) {
     947            2 :             locRes_.cntXns.insert(std::make_pair(resGroupTag, INVALID_UINT));
     948              :         }
     949              :     }
     950              : 
     951            1 :     CHK_RET(AppendCntXns());
     952              : 
     953            1 :     switch (transStatus_) {
     954            0 :         case CcuTransport::TransStatus::INIT:
     955            0 :             break;
     956            1 :         case CcuTransport::TransStatus::READY:
     957            1 :             transStatus_ = CcuTransport::TransStatus::SEND_TRANS_RES;
     958            1 :             break;
     959            0 :         default:
     960            0 :             HCCL_ERROR("[CcuTransport][%s] failed, error status[%s].", __func__, transStatus_.Describe().c_str());
     961            0 :             transStatus_ = CcuTransport::TransStatus::CONNECT_FAILED;
     962            0 :             break;
     963              :     }
     964              : 
     965            1 :     return HcclResult::HCCL_SUCCESS;
     966              : }
     967              : 
     968              : HcclResult
     969            4 : CcuTransport::ConstructMsgOnlyTransport(Hccl::Socket* socket, std::unique_ptr<CcuTransport>& impl, CcuResStatus status)
     970              : {
     971            4 :     HCCL_INFO("[CcuTransport][%s] construct msg-only transport, status[%u].", __func__, static_cast<uint8_t>(status));
     972            4 :     CHK_PTR_NULL(socket);
     973            2 :     std::vector<CclBufferInfo> emptyBufferInfos{};
     974            2 :     EXCEPTION_CATCH((impl = std::make_unique<CcuTransport>(socket, nullptr, emptyBufferInfos)), return HCCL_E_PTR);
     975            2 :     CHK_SMART_PTR_NULL(impl);
     976            2 :     impl->locResStatus_ = status;
     977            2 :     impl->transStatus_ = CcuTransport::TransStatus::INIT;
     978            2 :     return HCCL_SUCCESS;
     979            2 : }
     980              : } // namespace hcomm
        

Generated by: LCOV version 2.0-1