已合并
fix: 修复 gen_esb ASAN重试盲区与脚本缓存陈旧问题(#466) #3725
fix: 修复 gen_esb ASAN重试盲区与脚本缓存陈旧问题(#466) #3725
已合并
GengChao创建于 6月25日
GengChao
GengChao成员
6月25日

描述

本次 PR 修复 issue #466 报告的两个子问题,涉及 run_gen_esb_with_lock.sh(由 cmake/generate_es_package.cmake 自动生成)的构建脚本缺陷。

在 openEuler 24.03 LTS (x86_64) 环境下,run_test.sh 在 x86 架构默认开启 ASAN,导致 UT 在编译阶段 gen_esb 崩溃(AddressSanitizer: nested bug),0 用例执行,外部开发者按文档直接执行即可复现。

变更类型

关联的Issue

#466

修复内容

1. 重试逻辑盲区(issue #466 子问题2)

run_gen_esb_with_lock.sh 的重试逻辑原仅覆盖退出码 139/126/127,ASAN 在 nested bug 场景下返回退出码 1 被判为 Non-retriable 直接放弃,导致 x86 默认 ASAN 下 UT 编译即失败。

  • 新增"ASAN 启用且退出码为 1"的可重试分支(仅在 ASAN 启用时重试,避免非 ASAN 场景下掩盖 gen_esb 真实逻辑错误)
  • 在达到最大重试次数(MAX_RETRIES=10)时,为 ASAN 场景补充可定位的报错提示

2. 脚本缓存陈旧(issue #466 子问题3)

run_gen_esb_with_lock.sh 原由 if (NOT EXISTS ${ES_LOCK_SCRIPT}) 文件保护,首次 cmake 配置后 ASAN 开关被烘焙进脚本内容,--asan=false 形同虚设,必须 rm -rf build_ut(或删除该脚本)才能生效。

  • 改用 GLOBAL property 控制脚本生成:每个 cmake 进程都重新生成一次(property 不写入 CMakeCache.txt),同一 cmake 进程内多个 ES package 调用不重复生成
  • ENABLE_ASAN 等开关变化即时反映到脚本,无需手动清理构建目录

如何测试

  1. 重试逻辑验证:x86 环境下 bash tests/run_test.sh --ut=ge_common,观察 ASAN nested bug(退出码 1)是否触发重试而非直接放弃
  2. 缓存陈旧验证:
    • 首次 cmake 配置(ASAN=true)→ 检查 build_ut/cmake/run_gen_esb_with_lock.sh 含 "true" == "true" 分支
    • 切换 --asan=false 重新 cmake → 脚本应自动更新为 "" == "true" 分支(无需删除脚本)
  3. 语法校验:已用独立 CMake 验证脚本确认 ASAN=ON / OFF 两种配置下生成的 shell 脚本均通过 bash -n 语法校验,且退出码判定行为符合预期(ASAN=ON 时 exit 1 可重试,ASAN=OFF 时 exit 1 保持 Non-retriable)

核对清单

其他信息

  • issue #466 的子问题1(gen_esb 处理 stub_geir_ops 时的内存缺陷根因)不在本次 PR 范围,需单独排查 gen_esb 源码
  • 本次仅修改 cmake/generate_es_package.cmake 一个文件(+17/-2)
  • 重试逻辑不影响非 ASAN 场景:原有 139/126/127 重试保持不变,新增分支仅在 ENABLE_ASAN=true 时生效
likedislike
Pull Request已成功合入, 合并人@CANN-robot
(感谢 GengChao 的贡献)
GengChaoGengChao成员
6月25日 创建了 pull request,commit ec10de0f
CANN-robotCANN-robot成员
6月25日 添加了label:cann-cla/yes
CANN-robot
CANN-robot成员
6月25日 评论:

CLA Signature Pass

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

likedislike
CANN-robot
CANN-robot成员
6月25日 评论:

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


PR Approval Progress

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

Module Approval Details

module lgtm status approve status
repo-cann/ge ✅ tangqunzhang, yangyongqiang0606, stevenaw0 (3/2) ✅ yangyongqiang0606 (1/1)

💡 Tip:

  • Committer can comment /approve or /lgtm
  • Commenting /approve implies both code review (lgtm) and intent to merge (approve)
likedislike
GengChaoGengChao成员
6月25日 修改标题为 “fix: 修复 gen_esb ASAN重试盲区与脚本缓存陈旧问题(#466)”,原标题为“fix test”
GengChaoGengChao成员
6月25日 修改了pull request 的描述
GengChao
GengChao成员
6月25日 评论:

compile

likedislike
GengChaoGengChao成员
6月25日 预合并成功(commit_id: 12a362add2e0c6ad6108cf940a981700f64e86f1)
CANN-robotCANN-robot成员
6月25日 添加了label:ci-pipeline-running
CANN-robot
CANN-robot成员
6月25日 评论:

流水线任务触发成功
任务链接 [fb82f07a41e14db7b0b5856cfb09e538][流水线指导]

任务名称状态日志下载链接
pre_comment ✅ SUCCESS >>>>>
Compile_X86_compiler ✅ SUCCESS >>>>> >>>>>
Compile_X86_executor ✅ SUCCESS >>>>> >>>>>
Compile_X86_dflow ✅ SUCCESS >>>>> >>>>>
UT_Test_dflow ✅ SUCCESS
UT_Test_ge_common ✅ SUCCESS
UT_Test_parser ✅ SUCCESS
UT_Test_python ✅ SUCCESS >>>>>
UT_Test_rt ✅ SUCCESS
UT_Test_acl ✅ SUCCESS
UT_Test_autofuse ✅ SUCCESS
UT_Test_executor ✅ SUCCESS
UT_Test_autofuse_ascendc_api ✅ SUCCESS
ST_Test_dflow ✅ SUCCESS
ST_Test_ge_common ✅ SUCCESS
ST_Test_parser ✅ SUCCESS
ST_Test_python ✅ SUCCESS >>>>>
ST_Test_rt ✅ SUCCESS
ST_Test_autofuse ✅ SUCCESS
ST_Test_executor ✅ SUCCESS
ST_Test_hetero ✅ SUCCESS
ST_Test_autofuse_ascendc_api ✅ SUCCESS
ST_Test_autofuse_e2e ✅ SUCCESS
UT_Test_fe ✅ SUCCESS
UT_Test_tefusion ✅ SUCCESS
ST_Test_fe ✅ SUCCESS
ST_Test_tefusion ✅ SUCCESS
ST_Test_ge_common_atc ✅ SUCCESS
UT_Test_Report_graphengine ✅ SUCCESS >>>>>
UT_Test_Report_ge_executor_c ✅ SUCCESS >>>>>
UT_Test_Report_ge_autofuse ✅ SUCCESS >>>>>
ST_Test_Report_graphengine ✅ SUCCESS >>>>>
ST_Test_Report_ge_executor_c ✅ SUCCESS >>>>>
ST_Test_Report_ge_autofuse ✅ SUCCESS >>>>>
UT_Test_Report_fe ✅ SUCCESS >>>>>
ST_Test_Report_fe ✅ SUCCESS >>>>>

[2026-06-25 21:38:42]    CI执行结束

likedislike
CANN-robot
CANN-robot成员
6月25日 评论:

流水线任务触发成功
任务链接 [d35368bb78184d5a9f3f82f16da06fb5][流水线指导]

任务名称状态日志下载链接
pre_comment ✅ SUCCESS >>>>>
Compile_ARM_compiler ✅ SUCCESS >>>>> >>>>>
Compile_ARM_executor ✅ SUCCESS >>>>> >>>>>
Compile_ARM_dflow ✅ SUCCESS >>>>> >>>>>
API_Check ✅ SUCCESS >>>>>
PreSmoke_A900_npupool ✅ SUCCESS >>>>>

[2026-06-25 21:32:21]    CI执行结束

likedislike
atomgit-bot
atomgit-bot
6月25日 评论:

根据 PR 标题、描述及代码变更分析,此 PR 主要针对 cmake/generate_es_package.cmake 进行了两项修复性改动:一是修复 issue #466 中脚本缓存导致 --asan=false 配置不生效的问题;二是添加 es_gen_esb_serial job pool 以串行化 gen_esb 相关构建,避免 ar 和 ld 的文件竞态。

变更摘要

此变更主要修复了 generate_es_package.cmake 中锁脚本(run_gen_esb_with_lock.sh)因缓存陈旧导致 ASan 配置变更不生效的问题(issue #466),同时新增了构建 job pool 机制用于串行化 gen_esb 及其依赖的编译链接,以消除高负载下的文件竞态风险。

主要改动

  • 修复脚本缓存导致 --asan=false 不生效(issue #466):将锁脚本生成状态的跟踪机制改为 GLOBAL property(_ES_LOCK_SCRIPT_GENERATED),该 property 不会被写入 CMakeCache.txt,确保每次 CMake 配置时都会重新生成脚本,使 ENABLE_ASAN 等配置变更即时生效
  • 新增 es_gen_esb_serial job pool:通过 set_property(GLOBAL PROPERTY JOB_POOLS es_gen_esb_serial=1) 定义全局 job pool,并为 gen_esb、gen_esb_impl、geir_collector 等 target 以及代码生成自定义命令设置 JOB_POOL / JOB_POOL_COMPILE / JOB_POOL_LINK 属性,实现串行化构建,避免并行 ar 和 ld 产生的文件竞态
likedislike
不准确?
CANN-robot
CANN-robot成员
6月25日 评论:

流水线任务触发成功
任务链接 [ca18ea57e1074140a63821df57e73bf4][流水线指导]

任务名称状态日志下载链接
codecheck_Pr ✅ SUCCESS
codecheck ✅ SUCCESS >>>>>
antipoison ✅ SUCCESS >>>>>
SCA ✅ SUCCESS >>>>>
codecheck_dt ✅ SUCCESS >>>>>
codecheck_precommit ⚠️ WARNING >>>>> >>>>>
StaticCheck_codespell_check ✅ SUCCESS
StaticCheck_link_validity_check ✅ SUCCESS
StaticCheck_resource_existence_check ✅ SUCCESS
StaticCheck_tag_closed_check ✅ SUCCESS
StaticCheck_markdownlint ✅ SUCCESS

[2026-06-25 21:31:25]    CI执行结束

likedislike
CANN-robotCANN-robot成员
6月25日 添加了label:api-check-pass
atomgit-bot
atomgit-bot
6月25日 评论:

代码审查

审查结束总结

变更文件:1 个

文件 审查结果
cmake/generate_es_package.cmake 发现 1 个 P3 问题(过时的提示信息)

按严重程度统计:

严重程度 数量
P0 0
P1 0
P2 0
P3 1

整体风险评估:低风险。

本次变更正确地解决了 issue #466 中描述的两个问题:

  1. 脚本缓存陈旧导致 --asan=false 不生效 — 通过将文件存在性检查 (if (NOT EXISTS ...)) 改为基于 GLOBAL property 的每进程一次性生成策略,确保每次 cmake 配置都会重新生成 run_gen_esb_with_lock.sh,使 ENABLE_ASAN 变更即时反映到脚本中。

  2. ASAN "nested bug" 退出码 1 不被重试逻辑覆盖 — 在 ASAN 启用时增加了对退出码 1 的重试支持,与已有的 SIGSEGV(退出码 139)重试逻辑一致。

唯一的小瑕疵是最终失败提示中仍保留了"先移除缓存的 run_gen_esb_with_lock.sh"的过时指引,这对功能没有影响,仅在排查体验上可能造成轻微混淆。除此之外,该变更在逻辑正确性、Shell 脚本转义、CMake 变量作用域等方面均无问题。

类型 数量
🔴 阻塞 0
🟡 建议 1

💬 仅评论

likedislike
不准确?
atomgit-bot
atomgit-bot6月25日进行代码检视1
cmake/generate_es_package.cmake
@@ -315,1 +325,4 @@
315325 log_debug \"[Final Failure] Reached maximum retry count \$MAX_RETRIES\"
326+ if [[ \"${ENABLE_ASAN_NORMALIZED}\" == \"true\" ]]; then
327+ log_debug \"[Hint] ASan is enabled. If this reproduces consistently, gen_esb may have a real memory defect;\"
328+ log_debug \" re-run with --asan=false (after removing the cached run_gen_esb_with_lock.sh) to confirm.\"
atomgit-bot
atomgit-bot6月25日评论:

🔵 Low Priority

变更行:第 328 行(生成的 shell 脚本内容)。
本次修复将脚本生成条件从 if (NOT EXISTS ${ES_LOCK_SCRIPT}) 改为基于 GLOBAL property 的每 cmake 进程一次生成(第 185-190 行),使得脚本在每次 cmake 配置时都会重新生成,不再存在"脚本缓存陈旧"的问题。

建议:移除括号中的 "(after removing the cached run_gen_esb_with_lock.sh)",或改为提示用户需要重新执行 cmake 配置让脚本重新生成。

改动建议
328
- log_debug \" re-run with --asan=false (after removing the cached run_gen_esb_with_lock.sh) to confirm.\"
328
+ log_debug \" re-run with --asan=false (re-run cmake to regenerate this script) to confirm.\"
应用建议
likedislike
不准确?
CANN-robotCANN-robot成员
6月25日 删除了label:api-check-pass
CANN-robotCANN-robot成员
6月25日 删除了label:ci-pipeline-running
CANN-robotCANN-robot成员
6月25日 添加了label:ci-pipeline-passed
GengChaoGengChao成员
6月25日 解决了最后一个问题
黄桂军
黄桂军成员
6月25日 评论:

/lgtm

likedislike
tangqunzhang成员
6月26日 评论:

/lgtm

likedislike
tangqunzhang成员
6月26日 评论:

【MR评价】评价分数:3,
评价意见:
编码规范遵守度:无编码规范问题;
代码设计:不涉及代码设计;
DT质量:基本逻辑DT测试覆盖充足;

likedislike
CANN-robotCANN-robot成员
6月26日 添加了label:lgtm
yangyongqiang
yangyongqiang成员
6月26日 评论:

/approve

likedislike
CANN-robotCANN-robot成员
6月26日 添加了label:approved
CANN-robotCANN-robot成员
6月26日 合入了pull request