已合并
fix: dflow对aclInit重复初始化场景做兼容处理 #4441
lining23666创建于 1 天前
fix: dflow对aclInit重复初始化场景做兼容处理 #4441
已合并
Pull Request已成功合入, 合并人@CANN-robot
(感谢 lining23666 的贡献)1 天前 创建了 pull request,commit a090417e
atomgit-bot
1 天前 评论:
1 天前 评论:
变更摘要
本 PR 修复 dflow 在 aclInit 重复初始化场景下的兼容问题。DFlowInitialize(dflow_api.cc)和 EngineDaemon::InitializeWithArgs(engine_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.cc的DFlowInitialize和engine_daemon.cc的InitializeWithArgs中,将条件改为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_init(dflow_api_unittest.cc):引入MockAclApiStubRepeatInitmockaclInit返回ACL_ERROR_REPEAT_INITIALIZE,断言DFlowInitialize返回SUCCESS。 - 新增 UT:
TestEngineDaemonAclRepeatInit(engine_daemon_unittest.cc):同样通过 mockaclInit返回ACL_ERROR_REPEAT_INITIALIZE,断言InitializeWithArgs返回SUCCESS。


atomgit-bot
1 天前 评论:
1 天前 评论:
1 天前 添加了label:cann-cla/yes
CANN-robot
1 天前 评论:
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
/approveor/lgtm- Commenting
/approveimplies 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. 👍


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


1 天前 添加了label:lgtm
1 天前 添加了label:approved
1 天前 合入了pull request
Pull Request
描述
dflow 两处
aclInit调用(dflow_api.cc的DFlowInitialize和engine_daemon.cc的InitializeWithArgs)用进程内局部acl_initializedflag 判断是否已初始化,存在两个问题:问题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 了。修复方案
ACL_ERROR_REPEAT_INITIALIZE当成功处理(置acl_initialized = true,继续执行),同时失败日志补充 acl 返回码便于定位acl_owned_by_dflow标志区分 ACL 生命周期归属,仅当 dflow 自己aclInit成功(返回ACL_SUCCESS)时才置 true,Finalize时仅在该标志为 true 时才调用aclFinalizeaclInit返回acl_owned_by_dflowFinalize时调aclFinalize?ACL_SUCCESSACL_ERROR_REPEAT_INITIALIZE变更类型
关联的Issue
如何测试
UT(
ut_libge_helper_utest)DFlowInitialize_acl_repeat_init:mockaclInit返回ACL_ERROR_REPEAT_INITIALIZE,断言DFlowInitialize返回SUCCESS,且DFlowFinalize后不调用aclFinalizeDFlowInitialize_acl_init_failed:mockaclInit返回ACL_ERROR_INVALID_PARAM,断言DFlowInitialize返回FAILED,且不调用aclFinalizeTestEngineDaemonAclRepeatInit:同上,针对EngineDaemon::InitializeWithArgsTestEngineDaemonAclInitFailed:同上,针对EngineDaemon::InitializeWithArgsST(
helper_runtime_test)DataFlowApiTest.DFlowInitialize_acl_repeat_init:同 UT 场景1DataFlowApiTest.DFlowInitialize_acl_init_failed:同 UT 场景2STEST_helper_runtime.TestEngineDaemonAclRepeatInit:同 UT 场景3STEST_helper_runtime.TestEngineDaemonAclInitFailed:同 UT 场景4覆盖率
UT 和 ST 新增分支覆盖率均为 100%(4/4 分支),覆盖了
ACL_SUCCESS、ACL_ERROR_REPEAT_INITIALIZE、其他错误码三个路径。回归验证
核对清单
其他信息
无