Why: collaboration storage U7 (proposal sections 3/5/7) requires two-process HTTP-level acceptance over shared PG, a reproducible load-test entry honoring the load contract, and an auditable pre-release checklist; capacity windows and dual-host runs need user-scheduled resources, so the deliverable here is the verifiable entry, not capacity claims. Evidence: make test green (composite); make test-multi-instance green locally against an isolated PG (five scenarios incl. crash-takeover and restart invariants); run_load.sh --profile smoke end-to-end green (SSE probe p95~18ms, zero seq duplicates, stack auto-recycled); backend pinned to feature branch with the three cross-instance fixes. Impact: new tests/integration/multi-instance (CI test-pg job step), new tests/load/collaboration (k6 + SSE probe + run_load.sh), release checklist at docs/release-multi-instance.md; no runtime behavior change in Dev repo itself. Refs: backend PR #164; task card feature/u7-load-fault-release.
46 lines
2.4 KiB
Markdown
46 lines
2.4 KiB
Markdown
# 双进程 HTTP 级验收(协作存储 U7)
|
||
|
||
两个**真实 backend serve 进程**共享同一 PostgreSQL 的黑盒验收,覆盖方案 §7
|
||
最小验收矩阵的进程级行(库级语义已在 backend `internal/runmgr/multi_instance_test.go`
|
||
覆盖;本目录验证 HTTP/SSE/进程生命周期层面的同一套不变量):
|
||
|
||
| 子场景 | 断言(矩阵行) |
|
||
|---|---|
|
||
| `cross_read` | A 建的项目/会话在 B 立即可见(共享权威) |
|
||
| `cross_event_sse` | A 写入的事件在 B 的 SSE 可见(R5 跨实例传播) |
|
||
| `same_session_conflict_then_cross_hitl` | 同会话并发提交明确 409 不误写;B 跨实例 resolve A 的 HITL 经命令总线到达执行者(R3/R4) |
|
||
| `cross_cancel` | B 跨实例取消 A 的 run:命令持久、唯一消费、run 收口 cancelled(R4) |
|
||
| `owner_crash_takeover` | 执行实例被 SIGKILL:租约期内 B 明确 409 不误抢;死实例不拖累其他会话;原实例重启对账收口遗留 run 后恢复推进(R4/R7/R8) |
|
||
| `restart_invariants` | 实例重启后消息俱在、SSE 从 0 重放 seq 连续无洞、写入可推进(R5/R7) |
|
||
|
||
## 运行
|
||
|
||
```bash
|
||
# 1) 隔离 PostgreSQL(示例:svc.sh 独立实例;已有实例则直接给 DSN)
|
||
scripts/svc.sh db create mi7 --port 18890
|
||
scripts/svc.sh mi7 start
|
||
DSN="$(scripts/svc.sh db dsn mi7 --reveal)"
|
||
|
||
# 2) 构建 + 运行(Make 目标自动构建二进制并注入)
|
||
make test-multi-instance AGENT_PG_TEST_DSN="$DSN?sslmode=disable"
|
||
|
||
# 3) 回收
|
||
scripts/svc.sh mi7 stop && scripts/svc.sh db rm mi7
|
||
```
|
||
|
||
门控:`AGENT_PG_TEST_DSN`(真实 PostgreSQL,CI test-pg job 必跑不跳过)与
|
||
`AGENT_BIN`(由 Make 目标构建注入)。测试自建临时数据库、自起进程并在
|
||
退出时回收;不打任何生产服务。
|
||
|
||
## 已实测发现并修复的缺陷(历史)
|
||
|
||
本验收在 U7 落地时抓出三个跨实例真实缺陷(均已有回归测试):
|
||
|
||
1. **HITL resolve 落卡短路命令路径**:非执行实例先把卡标记 resolved,
|
||
命令 fallback 的 `!card.Resolved` 判定被跳过,执行者永远等不到答案
|
||
(backend `TestCrossInstanceResolveDoesNotSettleCard`)。
|
||
2. **跨实例 cancel 命令 conversation_id 为空**:消费侧按执行权 JOIN
|
||
匹配,空串永远无法送达。
|
||
3. **CancelRun 假成功**:非执行实例无句柄时 `CancelRun` 返回 nil,HTTP
|
||
层 200 受理但 run 永远停不下(命令路径被短路)。
|