Repository navigation
v3.3.12 — 团队同步活锁 / 缺幂等键 / 响应无上限
一句话
服务端记录只增不减 + 客户端每 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_CONFIG156 → 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.jsonl0 命中)⇒ 「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 套件)。 - 既有团队套件全绿:
issue34346/0、issue364PASS×2、issue370PASS、team-identity-seam17/0、settings-parityPASS、iter5-skinPASS、l3-team100/0、client-loadable17/0。 - 基线锁按实测重钉并附归因:
r26E355A407E3…→72C0DA04…;iter5-skin08aa7ef7…→127db190…;settings-archive-intervalf4ce3086…→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。