Skip to content

v3.3.12 — 团队同步活锁 / 缺幂等键 / 响应无上限

Choose a tag to compare

@Aik358 Aik358 released this 20 Oct 22:48
· 8 commits to main since this release

一句话

服务端记录只增不减 + 客户端每 5 秒重取全史,最终把服务端撑到 12GB 文件 / 29GB 常驻。本版修客户端侧五处、新增 2 个配置键、附一份服务端处置手册。

根因与修复(五处)

# 位置 修复
① lib/team-sync.js 推送体没有幂等键(实测顶层仅 [kind,key,at,payload,member])⇒ 服务端结构上只能 append。现补 idemKey(取 outbox 已持久化的 eventId,缺失回退 kind|key),并另带一份 eventId 兼容老服务端;重试时推送体逐字节相同
② lib/team-pull.js 游标只认数字,而契约里是 c_0001250 这类字符串 ⇒ since 永远 0 ⇒ 每 5 秒重取全史。新增 normalizeCursorPre:字符串与数字都接受,NaN/Infinity/空串明确拒收
③ lib/team-pull.js + lib/index.js 游标只在内存,重启即归零。现经注入 loadCursor/saveCursor 落到 ~/.dsh/memory/team/pull-cursor.json(原子写 + 隔离开读),reset() 同样落盘;该模块仍然不 import fs
④ lib/team-pull.js no-applier 活锁:我方唯一生产者推 handoff 而 appliers 只有 fact,服务端回抛时旧实现判 transient ⇒ 游标永久不动。现按「是否本次 requestKinds」分流:请求内仍 transient(保 #364),请求外按 business 前进
⑤ lib/team-auth.js 响应体无字节上限 ⇒ 大响应先把客户端撑爆。现加 32MB 硬上限:content-length 预检(超限不读体)+ 实测兜底,返回 response-too-large

新增

  • 配置键 teamPushPath / teamPullPageLimit(DEFAULT_CONFIG 156 → 158),设置页三面同步 +2 行;上行端点可覆盖,默认值不变保老服务端零影响。
  • docs/TEAM-SYNC-INCIDENT-PLAYBOOK.md:止血顺序、服务端三处必改、可照抄的最小实现、存量数据压缩脚本、四条验收判据、回退路径。
  • tests/smoke/smoke-test-team-sync-livelock.mjs(71 断言 + 5 组变异必红)。

仍在问题中 / 未验证

  • 服务端代码不在本仓库,也无法在本机找到(D:/E:/C: 全盘搜 team-server 目录与 records.jsonl 均 0 命中,git log -S records.jsonl 0 命中)⇒ 「29GB = 全量 JSON.parse」是按其行为推断(12GB × 2.4 ≈ 29GB,与 JS 对象膨胀量级吻合),未在真实服务端上验证。
  • 真实两机链路未端到端验证:本机 teamEnabled=false、未装该服务端;所有断言基于真构造 + 真调用 + 假服务端注入。
  • 存量数据不会自动缩小:本版只止住增长;已有的 12GB 需按手册 §4 主动压缩或换库。

验证

  • 串行全量回归 PASS 438 / FAIL 0 / TIMEOUT 0(--jobs=1 --timeout=180000,596.5s,438/438 套件)。
  • 既有团队套件全绿:issue343 46/0、issue364 PASS×2、issue370 PASS、team-identity-seam 17/0、settings-parity PASS、iter5-skin PASS、l3-team 100/0、client-loadable 17/0。
  • 基线锁按实测重钉并附归因:r26 E3 55A407E3…→72C0DA04…;iter5-skin 08aa7ef7…→127db190…;settings-archive-interval f4ce3086…→ec132f81…;l3-team 键数 23→25。两条 client.js 锁均用「删掉本批 8 行后复算 == 旧锁」正面证明漂移全来自本批。
  • verify-docs 全部一致(配置键 156→158 已同步 6 处文档);build-iter5-skin --check --strict = SYNC-OK。
  • tarball 三重校验:本地 pack SHA1 = registry dist.shasum = 下载件 SHA1 = 69f9f393174ce8b13033d070da20fa3961a23957;解包实测 246 文件、version=3.3.12、指纹行 dsh-027-team-sync-livelock、tests/ 与 docs/ 不在包内、凭据类文件 0。

建 issue 说明

注:smoke-test-external 单跑实测 66.5s,超过 runner 默认 60s 阈值;--jobs=1 会绕过双车道(run-smoke.mjs:437)故只能拿到默认阈值 ⇒ 本次统一用 --timeout=180000,该套件实测 PASS。