已合并
[bugfix]for oneside communication destory channel and socket resource #5004
[bugfix]for oneside communication destory channel and socket resource #5004
已合并
LQ_oy创建于 9月1日
LQ_oy
LQ_oy成员
9月1日

描述

memcache故障场景,2P 2D,client端销毁重建链,重建链失败,server端白名单配额耗尽,当前HcommChannelDestroy时,没有进行socket资源的销毁,需要对socket资源进行引用计数统计,进行资源销毁。

变更类型

请选择本次引入的变更类型:

关联的Issue

测试

已完成的测试用例和场景:

  1. memcache故障场景重建链通过
  2. host dpu用例通过
  3. 910、950基础用例验证通过

补充的UT用例:
UT 变更说明
文件:ut_socket_process.cc(复用既有 SocketProcessTest 测试夹具与 ResetSocketMgrForTest、StubSocketMgrHrtGetDeviceCountNoDevice 等辅助函数,无需改动 CMakeLists)。

新增两个辅助函数(匿名命名空间内):

BuildRefCountConfig(tag):构造一个 SocketConfig,不同 tag 即不同 key,避免相互影响。
InsertSocketEntryForRefCount(mgr, config, refCount):直接向 socketMap_/socketInUseMap_ 预置一个未 Listen/Connect 的 Hccl::Socket(Destroy() 为空操作),绕过真实建链,聚焦验证引用计数逻辑。
新增 3 个用例:

用例 覆盖点
1、Ut_SocketMgr_RefCount_TwoDestroySocket_RemoveAtZero 复用路径 GetSocket 使 refCount 1→2;首次 DestroySocket 减到 1(entry 仍在),再次 DestroySocket 归 0 后才从 socketMap_ 移除
2、Ut_SocketMgr_DestroySocket_MissConfig_NotAffectOtherEntries DestroySocket 未命中 config 时不影响其他 entry 的引用计数
3、Ut_SocketMgr_PutSocket_RefCount_Pairing GetSocket 递增 refCount 并置借用标记,PutSocket 对称递减并释放借用标记

要点说明:用例①按"已有 holder 持引用(refCount=1)并已释放借用,第二个 holder 复用同一 socket"建模,因复用路径在借用标记为 true 时会阻塞等待,单纯串行 GetSocket 两次无法达到 refCount=2。

文档更新

合入检查

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 LQ_oy 的贡献)
LQ_oyLQ_oy成员
9月1日 创建了 pull request,commit 07801a5f
atomgit-bot
atomgit-bot
9月1日 评论:

变更摘要

该 PR 主要修复单边通信场景下 channel 与 socket 资源的释放问题。此前各 channel 析构时通过 SocketMgr::PutSocket 归还 socket,且依赖的 socketConfig_ 指针指向的是 BuildSocket 内的栈上局部配置对象,析构时可能已失效。本次改动将归还语义改为按配置销毁:SocketMgr 新增 DestroySocket(const Hccl::SocketConfig&) 重载,并引入引用计数机制;各 channel 在 BuildSocket 时通过新增的 socketConfigHolder_ 持有 SocketConfig 副本,保证 socketConfig_ 在整个生命周期内有效,析构时统一调用 DestroySocket,仅在引用计数归零时真正销毁 socket。

主要改动

  • 析构改为按配置销毁 socket:AicpuTsP2pChannel、AicpuTsRoceChannelV2、AicpuTsUboeUbRtpChannelHelper、AicpuTsUrmaChannel、HostCpuRoceChannel、HostCpuUrmaChannel、AivUrmaChannel 的析构/回收逻辑从 PutSocket(socketConfig_, socket_) 改为 SocketMgr::DestroySocket(*socketConfig_),并增加 socketConfig_ != nullptr 判断,确保单边通信结束时释放 socket 资源。
  • 新增 socketConfigHolder_ 持有配置副本:多个 channel 的 BuildSocket 中通过 std::make_unique<Hccl::SocketConfig> 保存 socket 配置的拷贝并赋值给 socketConfig_,避免 socketConfig_ 指向函数内临时对象导致析构时悬垂。
  • SocketMgr 新增 DestroySocket(const SocketConfig&) 并引入引用计数:GetSocket 在命中或新建 socket 时对 refCount_ 自增;新接口按配置查找 socket,释放占用标记并通知等待者,refCount_ 减一后仅在归零时调用 socket->Destroy() 并移除 socketInUseMap_ 与 socketMap_ 中的记录,未找到时仅告警不报错。
  • SocketConfig 增加 mutable refCount_ 字段:socket_config.h 新增由 SocketMgr 维护的引用计数字段(mutable 以支持作为 unordered_map 的 const key 时修改),且不参与 hash/equal 比较。
likedislike
不准确?
atomgit-bot
atomgit-bot
9月1日 评论:

代码审查

✅ 未发现问题

likedislike
不准确?
CANN-robotCANN-robot成员
9月1日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
9月1日 评论:

Thanks for your pull-request.
The full list of commands accepted by me can be found at here.
You can get sig-info at here.
You can self-configure the PR merge rules for this repository. For more details, please refer to Here.
For more, you also can visit HICANN.


PR Approval Progress

✅ Congratulations! All modules have met the lgtm and approve requirements.

Module Approval Details

module lgtm status approve status
src/base_comm ✅ 孙哲芃, 欧阳茜, 严正行 (3/2) ✅ 孙哲芃 (1/1)
src/base_comm/resources/endpoint_pairs/channels/channel.h ✅ 严正行, 欧阳茜 (2/2) ✅ 严正行 (1/1)
test ✅ 孙哲芃, 欧阳茜, 严正行 (3/2) ✅ 孙哲芃 (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)

CLA Signature Pass

LQ_OY, thanks for your pull request. All authors of the commits have signed the CLA. 👍

likedislike
此处折叠了159条消息 查看更多
严正行
严正行成员
9月16日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
9月16日 添加了label:approved
欧阳茜
欧阳茜成员
9月16日 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
9月16日 添加了label:lgtm
CANN-robotCANN-robot成员
9月16日 合入了pull request