已合并
fix: dflow对aclInit重复初始化场景做兼容处理 #4441
lining23666创建于 1 天前
fix: dflow对aclInit重复初始化场景做兼容处理 #4441
已合并
lining23666创建于 1 天前
lining23666成员
1 天前

Pull Request

描述

dflow 两处 aclInit 调用(dflow_api.ccDFlowInitializeengine_daemon.ccInitializeWithArgs)用进程内局部 acl_initialized flag 判断是否已初始化,存在两个问题:

问题1:重复初始化被误判为致命错误

当同进程其他组件已调过 aclInit() 时,dflow 重复调用会得到 ACL_ERROR_REPEAT_INITIALIZE(100002),被 ret != ACL_SUCCESS 误判为致命错误返回 FAILED。按 ACL 文档定义,此返回码表示"重复初始化或重复加载",ACL 已处于正确的已初始化状态,不应视为错误。

问题2:重复初始化场景下误调用 aclFinalize

aclInit 返回 ACL_ERROR_REPEAT_INITIALIZE 时表示外部已初始化 ACL,但 dflow 仍将 acl_initialized 置为 true,导致 DFlowFinalize/EngineDaemon::Finalize 时调用 aclFinalize 把外部初始化的 ACL 给 teardown 了。

修复方案

  1. 兼容重复初始化:两处调用点将 ACL_ERROR_REPEAT_INITIALIZE 当成功处理(置 acl_initialized = true,继续执行),同时失败日志补充 acl 返回码便于定位
  2. 正确管理 ACL 生命周期:引入 acl_owned_by_dflow 标志区分 ACL 生命周期归属,仅当 dflow 自己 aclInit 成功(返回 ACL_SUCCESS)时才置 true,Finalize 时仅在该标志为 true 时才调用 aclFinalize
场景 aclInit 返回 acl_owned_by_dflow Finalize 时调 aclFinalize
dflow 自己初始化 ACL_SUCCESS true
外部已初始化 ACL_ERROR_REPEAT_INITIALIZE false
初始化失败 其他错误码 false

变更类型

关联的Issue

如何测试

UT(ut_libge_helper_utest

  1. DFlowInitialize_acl_repeat_init:mock aclInit 返回 ACL_ERROR_REPEAT_INITIALIZE,断言 DFlowInitialize 返回 SUCCESS,且 DFlowFinalize 后不调用 aclFinalize
  2. DFlowInitialize_acl_init_failed:mock aclInit 返回 ACL_ERROR_INVALID_PARAM,断言 DFlowInitialize 返回 FAILED,且不调用 aclFinalize
  3. TestEngineDaemonAclRepeatInit:同上,针对 EngineDaemon::InitializeWithArgs
  4. TestEngineDaemonAclInitFailed:同上,针对 EngineDaemon::InitializeWithArgs

ST(helper_runtime_test

  1. DataFlowApiTest.DFlowInitialize_acl_repeat_init:同 UT 场景1
  2. DataFlowApiTest.DFlowInitialize_acl_init_failed:同 UT 场景2
  3. STEST_helper_runtime.TestEngineDaemonAclRepeatInit:同 UT 场景3
  4. STEST_helper_runtime.TestEngineDaemonAclInitFailed:同 UT 场景4

覆盖率

UT 和 ST 新增分支覆盖率均为 100%(4/4 分支),覆盖了 ACL_SUCCESSACL_ERROR_REPEAT_INITIALIZE、其他错误码三个路径。

回归验证

  • UT 28 个相关用例全部通过
  • ST 8 个相关用例全部通过

核对清单

其他信息

likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 lining23666 的贡献)
Llining23666成员
1 天前 创建了 pull request,commit a090417e
atomgit-bot
atomgit-bot
1 天前 评论:

变更摘要

本 PR 修复 dflow 在 aclInit 重复初始化场景下的兼容问题。DFlowInitializedflow_api.cc)和 EngineDaemon::InitializeWithArgsengine_daemon.cc)此前仅凭进程内局部 acl_initialized flag 判断是否已初始化,当同进程其他组件已调用过 aclInit() 时,dflow 重复调用会返回 ACL_ERROR_REPEAT_INITIALIZE(100002),被原有 ret != ACL_SUCCESS 的判断误判为致命错误。本次将 ACL_ERROR_REPEAT_INITIALIZE 视为成功处理(置 acl_initialized = true 并继续执行),同时在失败日志中补充 acl 返回码便于定位,并新增两个对应 UT 用例。

主要改动

  • aclInit 重复初始化视为成功:在 dflow_api.ccDFlowInitializeengine_daemon.ccInitializeWithArgs 中,将条件改为 ret != ACL_SUCCESS && ret != ACL_ERROR_REPEAT_INITIALIZE 才返回 FAILED,命中重复初始化错误码时照常置 acl_initialized 并继续执行,避免误报初始化失败。
  • 失败日志补充返回码:两处 GELOGE(FAILED, "ACL init failed.") 均改为输出 ret = %d(以 static_cast<int32_t>(ret) 传入),便于定位初始化失败的具体 ACL 错误码。
  • 新增 UT:DFlowInitialize_acl_repeat_initdflow_api_unittest.cc):引入 MockAclApiStubRepeatInit mock aclInit 返回 ACL_ERROR_REPEAT_INITIALIZE,断言 DFlowInitialize 返回 SUCCESS
  • 新增 UT:TestEngineDaemonAclRepeatInitengine_daemon_unittest.cc):同样通过 mock aclInit 返回 ACL_ERROR_REPEAT_INITIALIZE,断言 InitializeWithArgs 返回 SUCCESS
likedislike
atomgit-bot
atomgit-bot
1 天前 评论:

代码审查

✅ 未发现问题

likedislike
CANN-robotCANN-robot成员
1 天前 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
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.
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
repo-cann/ge stevenaw0, 张德鹏, xchu42 (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

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

likedislike
此处折叠了71条消息 查看更多
黄桂军
黄桂军成员
1 天前 评论:

/lgtm

likedislike
CANN-robotCANN-robot成员
1 天前 添加了label:lgtm
张德鹏成员
1 天前 评论:

/approve

likedislike
CANN-robotCANN-robot成员
1 天前 添加了label:approved
CANN-robotCANN-robot成员
1 天前 合入了pull request