From ea3a5026ad76028562ee4aa6b70c79c94fb17d4b Mon Sep 17 00:00:00 2001 From: "Somhairle H. Marisol" Date: Mon, 21 Sep 2026 03:03:59 +0800 Subject: fix(api): 加固行情采集子进程超时、取消与进程组清理并脱敏错误 MIME-Version: 1.0 Content-Type: text/plain; charset=UTF-8 Content-Transfer-Encoding: 8bit - MarketDataService: setsid 独立会话启动采集器,硬超时覆盖子进程退出与管道 EOF 两个阶段;超时、取消与异常路径按进程组杀灭(含持有管道的后台子进程),不遗留孤儿进程 - App.ts/Search/RefreshNav 传入 ctx.RequestAborted,客户端断开即取消采集 - 对外错误仅返回统一短消息(503 MARKET_DATA_UNAVAILABLE 等),不泄露路径、stderr 或密钥;stderr 仅记录服务端日志 - 新增 9 项子进程回归(成功/stderr 洪泛/超时杀灭/取消杀灭/孤儿管道恢复/畸形载荷/非零退出/启动失败/缺脚本)与 HTTP 脱敏回归;全文套件 66 通过(Domain 19 / Web 17 / API 30) - 实机验证:挂起采集器 503 2.4s 无进程残留;真实 akshare 1.18.96 搜索 000001 返回 200,净值刷新持久化 6010 条观测 - README 与 qa/README 补充环境变量、回归命令、G1 过滤断言口径与真实建档标签辨析 --- qa/README.md | 4 ++-- 1 file changed, 2 insertions(+), 2 deletions(-) (limited to 'qa') diff --git a/qa/README.md b/qa/README.md index 96aea72..3c4adf0 100644 --- a/qa/README.md +++ b/qa/README.md @@ -42,7 +42,7 @@ bash qa/lifecycle-test.sh - D 重新读取:恰好 1 次 GET,金额持久化复核。 - E token 失效:换 token 立即清空档案;拦截并延迟的旧 GET 响应落地后被忽略(stale 防护)。 - F 幂等重试:首 POST 被掐断显示错误横幅,重试复用同一 `Idempotency-Key` 成功。 -- G 全程无浏览器 console/page 错误。 +- G 全程无浏览器 console/page 错误。判定口径(见 `qa/driver/browser-test.js` 的 `pageerror`/`response`/`console` 监听):任何非预期 ≥400 的资源响应、任何 pageerror、以及未被显式过滤的 console error 都记为失败;仅预期内的行情探测 `401 (Unauthorized)`、favicon 噪音和非 API 的 "Failed to load resource" 被过滤。 ## 真实行情模式 @@ -52,7 +52,7 @@ QA 默认走合成桩。需要真实 AKShare 时,不运行 `run.sh`,而是 PYTHONPATH=/tmp/opencode/fund-lab-akshare-site /usr/bin/python3 -c "import akshare" # 1.18.96 ``` -真实模式输出的 envelope 不含 `_synthetic`,来源为真实数据源;前端“数据来源”行相应显示“真实建档”。 +真实模式输出的 envelope 不含 `_synthetic`,来源为真实数据源。注意两处口径不同:基金档案行的"数据来源:真实建档"描述的是基金建档本身(对应 `isSynthetic=false`,无论行情模式),而行情面板固定显示"AKShare · exact match"并始终只承载行情数据的来源;不要把档案标签当作行情模式的指示器。 ## 不变量 -- cgit v1.2.3