已开启
[Bug-Report|缺陷反馈]: CloseSubProcList 对恰好 50 条子进程列表错误执行零计数批次 #865
KaranocaVe创建于 12 天前
12 天前 添加了label:bug-report
12 天前 关联了pull request:[Fix] 避免 CloseSubProcList 执行零计数批次
Henry_ascend
12 天前 评论:
12 天前 评论:
感谢你对本项目的关注和贡献。我们会尽快安排对代码进行评审,评审过程中可能会给出修改意见,敬请留意后续动态。


12 天前 添加了label:wait-feedback
CANN-robot
5 天前 评论:
5 天前 评论:
您好,为了更准确地定位和解决问题,我们需要您提供上述提到的相关信息。如果 14 天内没有进一步更新,我们将暂时关闭此 Issue。感谢您的理解与配合。


问题描述
在
cann/runtime的CloseSubProcList实现中,非空列表会按每批 50 条发送。当列表长度恰好为 50 时,第一批 50 条已经成功处理,但实现仍然无条件执行一次
余数批次。余数为 0,而内部
ExecuteClosePidList明确将零计数视为非法参数,导致本来满足接口非空和最大数量限制的请求返回
TSD_INTERNAL_ERROR。该行为还可能造成调用方看到“关闭失败”,但设备端已经收到并处理了第一批 50
个子进程的关闭消息,产生返回状态与实际副作用不一致的问题。
环境信息
cann/runtime,681ef7610df13c8128982901142a2c869ddbb53e重现步骤
tsd_client_utest。ProcStatusParam,调用CloseSubProcList(closeList, 50);让通信响应和WaitRsp返回成功。预期结果
50 条列表应发送一个包含 50 条记录的批次并返回
TSD_OK。恰好达到批次上限不应被当作空列表,也不应执行零计数请求。
实际结果
50 条列表的第一个批次包含 50 条记录并成功发送,但函数随后调用
ExecuteClosePidList,其pidCnt为 0;该内部参数检查返回错误,最终CloseSubProcList返回TSD_INTERNAL_ERROR。临时将用例期望改为TSD_OK时,断言失败显示实际值为 1、期望值为 0。
对照结果:49 条返回成功且只发送 49 条;51 条返回成功且发送 50 条和 1 条两个
批次。固定 commit 的 6 个相关单元测试全部通过实际行为断言。
日志/最小复现
构建命令:
cmake --build source/build2 --target tsd_client_utest -j2,退出码 0。运行命令:
source/build2/tests/ut/tsd/tsdclient/tsd_client_utest \ --gtest_color=no \ --gtest_filter='SubProcessControllerTest.CloseSubProcList_*:SubProcessControllerTest.OpenAndCloseHccp_*'最终实际行为退出码为 0,6/6 用例通过;反向期望成功的单用例退出码为 1,
输出包含
Which is: 1与TSD_OK的Which is: 0。影响与规避方式
影响:调用方无法根据返回值判断设备端是否已完成全部列表处理;在恰好 50 条时,
第一批可能已经产生关闭副作用而调用仍报告失败。发生错误后上层重试还可能造成
重复关闭请求或额外错误日志。
临时规避:将列表拆成不是 50 的整批长度,例如 49 条或 51 条(由调用方按更小
批次拆分);这不是接口应有的要求。由于本次源码为 9.2 开发线、运行 Toolkit
为 9.1.0,尚未宣称匹配版本 NPU 端到端规避效果。
建议的回归测试
增加
listSize=1、49、50、51、100的批量边界回归用例,断言每次发送的批次数量和大小、返回状态以及零计数批次不会被调用。特别断言 50 和 100 条输入均
成功,并覆盖通信响应成功和失败的路径。