Record the U7 release-gate specs
Why: The remaining U7 release gates needed a durable spec before anyone replays them or wires CI.
Evidence: Run 2832 on head 72763c9 has test, test-pg, and svc-realcombo success on home-runner. Review found docs only and unchanged evidence grades.
Impact: Docs and the task card. Checklist grades stay SELF or not started. Second-instance writes stay closed.
Refs: .task/feature-u7-release-roadmap.md
This commit was merged in pull request #501.
This commit is contained in:
File diff suppressed because one or more lines are too long
@@ -49,6 +49,25 @@
|
||||
**仍不放行第二实例承接写请求**——缺独立 REPLAY/GATE,C3 未做。C5 的工件恢复(K4)已有 2026-10-13 本机 SELF,不是 GATE。
|
||||
- **双主机档**:未开始(C3),不放行。
|
||||
|
||||
## 下一步规格(2026-10-13,未执行)
|
||||
|
||||
上表的证据等级保持原样:C4 与 C5 仍是 SELF,C3 仍是未开始。
|
||||
独立重放、CI 快速档和双主机都还没有做。可执行规格:
|
||||
|
||||
- [独立重放](u7-release-replay.md)
|
||||
- [CI 快速档可行性](u7-release-ci-feasibility.md)
|
||||
- [第二台主机清单](u7-release-c3-host.md)
|
||||
|
||||
PR、提交同树与 CI 运行的读取记录在任务卡
|
||||
`.task/feature-u7-release-roadmap.md` 的证据表,来源 SELF。
|
||||
`policy/facts.md` 仍只登记长期基础设施事实;上述 PR 与运行不写入该表,
|
||||
因为它们不是长期事实,而且核验命令含管道与引号,不符合该表的命令格式。
|
||||
|
||||
协作存储方案正文仍是 Documents `05c13a42b14d70f878cc8a51c543e018a7f7a663` 的 r2.3。
|
||||
本次没有改 Documents 仓,也没有推进 gitlink。下面这段是准备写入方案、尚未写入的修订:
|
||||
|
||||
> r2.4:2026-10-13 只补了放行规格,没有做独立重放,没有把 C4/C5 接进 CI,没有第二台主机。证据等级不变。第二实例写流量仍不开放。规格见 Dev `docs/release-multi-instance.md` 的「下一步规格」。
|
||||
|
||||
## 已知边界与诚实声明
|
||||
|
||||
- U7 期间经双进程验收发现并修复三个跨实例缺陷(详见
|
||||
@@ -58,4 +77,4 @@
|
||||
- 容量详情与 SHA 绑定见 Documents
|
||||
`docs/records/2026-10-12-u7-capacity-window-report.md`;原始
|
||||
`results/<ts>/` 在测量 worktree(gitignore),不入库。
|
||||
- B6 pgbench、C4 断连演练与 C5 备份恢复(含 K4 工件)已有本机 SELF。C3 双主机仍待第二台机器。证据等级仍缺独立 REPLAY 或 CI GATE。
|
||||
- B6 pgbench、C4 断连演练与 C5 备份恢复(含 K4 工件)已有本机 SELF。C3 双主机仍待第二台机器。证据等级仍缺独立 REPLAY 或 CI GATE。下一步规格见上文「下一步规格」,规格本身不提升证据等级。
|
||||
|
||||
@@ -0,0 +1,41 @@
|
||||
# C3 第二台主机清单(主机未指定)
|
||||
|
||||
状态:清单。第二台主机还没有。本文件不申请机器,不部署,也不开放第二实例写流量。
|
||||
双主机档在 [放行检查单](release-multi-instance.md) 里保持「未开始」。
|
||||
|
||||
## 要验证的事
|
||||
|
||||
C3 是同一套 A6 验收在两台主机上各跑一遍,数据库连接走跨机网络。
|
||||
`make test-multi-instance` 在跑测试的那台机器上本地构建 `AGENT_BIN`,
|
||||
再按 `AGENT_PG_TEST_DSN` 连接 PostgreSQL。参见
|
||||
`tests/integration/multi-instance/README.md`。
|
||||
|
||||
做法:
|
||||
|
||||
1. 两台主机使用同一 Dev SHA,并物化相同的 backend gitlink。默认 SHA 与
|
||||
[重放规格](u7-release-replay.md) 相同;main 前进时两台一起改,并写明新 SHA。
|
||||
2. PostgreSQL 只建在其中一台。另一台把 DSN 指到这台的地址,连接要跨网络,
|
||||
而不是两台各用一个本机库假装跨机。
|
||||
3. 两台分别执行 `make test-multi-instance`。退出码、SHA 和 DSN 的主机与端口记入证据。
|
||||
密码只放在环境或受保护文件里,不进入任务卡、PR 和本清单。
|
||||
4. 演练用的 `u7drill` / `u7bk` 与端口 18980–18999 留给 C4/C5。
|
||||
A6 使用自己的库和文档中的示例端口,避免和演练栈抢资源。
|
||||
|
||||
## 负责人填写
|
||||
|
||||
| 项 | 内容 |
|
||||
|---|---|
|
||||
| 第二台主机的名称与到达方式 | 待填写 |
|
||||
| 系统、架构、PostgreSQL 版本 | 待填写 |
|
||||
| 哪一台放置数据库,另一台如何访问该端口 | 待填写 |
|
||||
| 时钟同步方式 | 待填写 |
|
||||
| 可用窗口 | 待填写 |
|
||||
| 主机负责人 | 待填写 |
|
||||
|
||||
时钟要先对齐再跑。A6 的租约和跨实例等待依赖两台时钟接近。本次没有测量任何第二台主机。
|
||||
|
||||
## 完成后才改检查单
|
||||
|
||||
两台都退出码为 0,且证据写明 SHA、主机和命令之后,才把 C3 从「未开始」改为已执行,
|
||||
并标明 REPLAY 或 GATE。那次修改另需授权。C3 做完也不单独开放写流量;
|
||||
写流量还要独立 REPLAY 或已准入的 CI GATE。
|
||||
@@ -0,0 +1,54 @@
|
||||
# C4/C5 快速档接入 CI 的可行性(未改 workflow)
|
||||
|
||||
状态:只读评估。本次没有修改 `.gitea/workflows/ci.yaml`,没有在 `home-runner` 上执行演练,
|
||||
也没有形成 GATE。第二实例写流量保持关闭。
|
||||
|
||||
## 平台准入(2026-10-13 只读)
|
||||
|
||||
Dev `main` 的分支保护由 API 读出,证据在任务卡 `.task/feature-u7-release-roadmap.md`,
|
||||
来源 SELF:
|
||||
|
||||
- `enable_push` 为 false,`block_on_outdated_branch` 为 true
|
||||
- `enable_status_check` 为 false,`status_check_contexts` 为空,`required_approvals` 为 0
|
||||
|
||||
这与 `policy/platform-admission.md` 在 2026-10-05 的观察一致,只说明配置当前如此。
|
||||
它没有证明失败检查或陈旧候选会被拒绝。runner 隔离、token 权限和工作流来源本次没有核验。
|
||||
|
||||
因此,即便以后某个 job 变绿,在所有者按该文件完成准入之前,检查单不能把该次运行写成 GATE。
|
||||
改分支保护属于高后果操作,本评估不准备执行命令。
|
||||
|
||||
## 现有 CI 能提供什么
|
||||
|
||||
`test-pg` 在 `ubuntu-latest` 上安装 PostgreSQL、pgvector 和 Redis,并以 root 容器、
|
||||
无 sudo 为前提,用 `runuser` 或 `su` 切到 `postgres` 用户操作已有集群。
|
||||
现有库端口是 5432,Redis 是 6399。演练端口 18980–18999 与这两个端口不重叠。
|
||||
|
||||
workflow 没有写 `timeout-minutes`。平台默认时限本次没有读取。
|
||||
|
||||
## 脚本直接放进 CI 时会碰到的差异
|
||||
|
||||
这些差异来自当前脚本和 workflow 文本。除资源数字外,都还没有在 `home-runner` 上实测。
|
||||
|
||||
1. **磁盘与负载门禁。** `tests/ops/lib.sh` 的 `ops_resource_gate` 要求可用空间至少
|
||||
100GiB,且 load1 不超过 16,否则退出 3。作者机器在核验命令里打印了
|
||||
`local_avail_kb=1164165728`、`local_id=1000`。这是作者主机,不是 runner。
|
||||
runner 的磁盘和负载未测。未测通过前,job 不能假设自己过得了这道门。
|
||||
2. **`pg_ctl` 的 PATH。** `tests/ops/run_backup_drill.sh` 用 `command -v pg_ctl`,
|
||||
找不到就退出。`scripts/svc.sh` 的 `pg_bindir` 还会找 `pg_config --bindir` 和
|
||||
`/usr/lib/postgresql/*/bin`。Ubuntu 包里的 `pg_ctl` 通常在版本目录,不一定在 PATH。
|
||||
作者机器的 `pg_ctl` 来自 Homebrew,不能外推到 runner。
|
||||
3. **root 下的 `initdb`。** 演练通过 `scripts/svc.sh db create` 调用 `initdb`。
|
||||
workflow 写明运行器容器以 root 运行。PostgreSQL 的 `initdb` 拒绝 root。
|
||||
`test-pg` 避开了这条路,它启动发行版集群再切到 `postgres` 用户。
|
||||
本次没有在 runner 上执行 `initdb`。
|
||||
4. **C5 的固定等待。** `run_backup_drill.sh` 把标记写入时长写成 `-dur 5m`,
|
||||
恢复后还有 `sleep 120`。脚本没有快速档参数。K1–K7、工件 sha256 和跨用户 404 保持原判据。
|
||||
缩短标记窗口需要改脚本,并仍能测出不超过 300 秒的 RPO。本次不改脚本。
|
||||
5. **C4 的固定等待。** `run_fault_drill.sh --fault all` 含约 60 秒的断连窗口和若干秒级等待。
|
||||
本次没有计时一次完整演练。
|
||||
|
||||
## 若以后要做 job
|
||||
|
||||
job 与现有 `test`、`test-pg`、`svc-realcombo` 并列。实现前先在 runner 上确认磁盘、
|
||||
`pg_ctl` 位置,以及非 root 用户能否 `initdb`。通过后的证据要带运行链接、执行身份和完整 SHA。
|
||||
平台准入未完成时,检查单的写法保持「CI 运行已绿,GATE 未成立」。
|
||||
@@ -0,0 +1,101 @@
|
||||
# U7 独立重放规格(未执行)
|
||||
|
||||
状态:规格。本文件不记录一次已经完成的重放,也不改变
|
||||
[放行检查单](release-multi-instance.md) 的证据等级。第二实例写流量保持关闭。
|
||||
|
||||
2026-10-12 已决定不做容量重放。本规格只覆盖 C5、C4 和 A6,以及对象存储回落。
|
||||
|
||||
## 固定对象
|
||||
|
||||
从干净检出开始,物化子模块后再跑命令。默认对象是 Dev
|
||||
`3fb8210f6495a78e70a67af3661bdfe9c00fb9de`,其 gitlink 为:
|
||||
|
||||
| 组件 | SHA |
|
||||
|---|---|
|
||||
| Backend | `dc736e339d01c59e658abc63c81909059bd6ea02` |
|
||||
| Documents | `05c13a42b14d70f878cc8a51c543e018a7f7a663` |
|
||||
|
||||
合入提交与对应 PR head 在本地 `git rev-parse ^{tree}` 上同树。核验输出在任务卡
|
||||
`.task/feature-u7-release-roadmap.md` 的证据表,来源 SELF。若重放日 main 已前进,
|
||||
重放者改用新的完整 SHA,并重新读出 backend 与 documents 的 gitlink,写进重放记录。
|
||||
|
||||
## 重放者
|
||||
|
||||
重放者是另一个人,或另一台由该人操作的机器。先跑完命令并写出结论,再打开作者收据。
|
||||
作者保全目录 `u7-k4-retest-preserved-20261013` 与其中的 `task-finish.txt` 属于作者证据。
|
||||
|
||||
同一账号下另开一个 agent 会话、或切换角色,不能记成 REPLAY。
|
||||
`policy/platform-admission.md` 已写明不能把切换 Agent 角色当独立账号。
|
||||
重放者身份未指定前,本规格不启动。
|
||||
|
||||
## 环境
|
||||
|
||||
- 只使用名称前缀 `u7drill` 或 `u7bk` 的实例,端口落在 18980–18999。
|
||||
- 启动前确认环境里没有 `BLOBSTORE_S3_ENDPOINT`。演练脚本本身不设置该变量。
|
||||
应用把 `NewS3FromEnv` 返回的空 `*S3` 放进 `blobstore.Store` 接口,
|
||||
`blobstore.IsNil` 把它当成未配置,工件写入 `--artifacts` 目录。
|
||||
- 已构造的对象存储由 `TestFinishOpenKeepsConfiguredBlobStore` 覆盖,重放时一并跑该测试。
|
||||
本次不要求另起一台对象存储。
|
||||
- `tests/ops/lib.sh` 的资源门禁要求数据目录所在盘可用空间至少 100GiB,且 1 分钟负载不超过 16。
|
||||
不满足时脚本会停,不能改门禁来换一次通过。
|
||||
|
||||
## 最小重放集
|
||||
|
||||
按这个顺序执行。每条用 `CMD="<命令>" make evidence` 写入重放者自己的任务卡。
|
||||
工具写入的来源标签仍是 SELF;审阅记录里另行声明 REPLAY,并写明重放者、主机、命令和对象 SHA。
|
||||
|
||||
1. `tests/ops/self_check.sh`
|
||||
2. `tests/ops/run_backup_drill.sh`
|
||||
3. `tests/ops/run_fault_drill.sh --fault all`
|
||||
4. 用隔离的 PostgreSQL 跑 `make test-multi-instance`(见
|
||||
`tests/integration/multi-instance/README.md`)。这套库使用文档中的示例端口时,
|
||||
不要占用演练的 18980–18999。
|
||||
5. 在 `modules/backend` 执行:
|
||||
|
||||
```bash
|
||||
go test -count=1 -timeout 15m ./internal/blobstore/ ./internal/store/ \
|
||||
-run 'TestIsNil|TestNewS3FromEnvFallback|TestFinishOpenTypedNilS3UsesLocalArtifacts|TestFinishOpenKeepsConfiguredBlobStore|TestOpenPostgresTypedNilS3UsesLocalArtifacts'
|
||||
```
|
||||
|
||||
`TestOpenPostgresTypedNilS3UsesLocalArtifacts` 需要真实 PostgreSQL。没有 DSN 时该项记
|
||||
NOT_RUN,其余四项仍要跑。
|
||||
|
||||
## 判据
|
||||
|
||||
C5 以 `tests/ops/run_backup_drill.sh` 写出的 `verdict.json` 为准:
|
||||
|
||||
| 项 | 通过条件 |
|
||||
|---|---|
|
||||
| K1 | 归档成功且 `failed_count` 为 0,基础备份与逻辑备份清单校验通过 |
|
||||
| K2 | RPO 在 0 到 300 秒之间 |
|
||||
| K3 | 恢复后登录、项目、会话均为 200,且 RTO 不超过 3600 秒 |
|
||||
| K4 | 工件 `checked > 0`、`missing = 0`、`mismatch = 0`,跨用户访问项目和工件均为拒绝 |
|
||||
| K5 | `dup_seq = 0`、`seq_gap_convs = 0`,恢复后的行数落在备份点与故障点之间 |
|
||||
| K6 | 逻辑恢复的行数与备份点一致 |
|
||||
| K7 | 备份文件权限收紧,结果目录无凭据泄漏 |
|
||||
|
||||
C4 以故障脚本的 F1–F5 与 Redis 轨 G1–G3 为准。G4 降级不可见、G5 启动时 Redis 不通则拒绝,
|
||||
沿用检查单里的「发现」,不把它们改成产品失败。
|
||||
|
||||
A6 以 `make test-multi-instance` 退出码 0 为准。
|
||||
|
||||
K4 还要看应用日志里没有 `blobstore.(*S3).Put` 的空指针 panic,并且工件文件出现在该次
|
||||
`--artifacts` 目录。脚本只在拿不到工件 id 时才写 `finding-upload.txt`;那个文件里的
|
||||
panic 句子是脚本自带的说明,重放时以应用日志和 `artifacts-verify.json` 为准。
|
||||
|
||||
与 2026-10-13 SELF 目录 `backup-20261013-013354` 对照时,比较的是上述判据。
|
||||
RPO、RTO 的秒数可以不同。判据不一致则阻塞,并按失实登记。
|
||||
|
||||
## 重放记录模板
|
||||
|
||||
重放完成后把记录放到 Documents 的 `docs/records/`,并回写检查单的 C4、C5、A6 证据等级。
|
||||
那一步另需授权。记录至少包含:
|
||||
|
||||
- 重放者与主机(人,或人操作的另一台机器)
|
||||
- 开始前读取的 Dev、Backend、Documents 完整 SHA
|
||||
- 每条命令、退出码、结果目录名
|
||||
- `verdict.json` 里的 K1–K7、`rpo_s`、`rto_s`
|
||||
- C4 的 F1–F5 与 G1–G5
|
||||
- A6 退出码
|
||||
- 五项单测的通过或 NOT_RUN
|
||||
- 来源声明:审阅记录为 REPLAY;`make evidence` 行仍为 SELF
|
||||
Reference in New Issue
Block a user