Skip to content

build: keep two progress pushes from clobbering each other - #244

Merged
Zakkaus merged 1 commit into
masterfrom
fix/progress-push-race
Aug 13, 2026
Merged

build: keep two progress pushes from clobbering each other#244
Zakkaus merged 1 commit into
masterfrom
fix/progress-push-race

Conversation

@Zakkaus

@Zakkaus Zakkaus commented Aug 13, 2026

Copy link
Copy Markdown
Member

2026-08-12 那轮 stable 从建置到发布全部成功,257 个包已经上镜像机,服务却报失败,日志只有一句 mv: cannot stat '/srv/mirrors/.build-status.json.new'

两个缺陷

临时档名固定。 看守进程每 60 秒推一次进度,on_exitkill 只打倒看守进程本身,它在途的 ssh 被 init 收养后继续跑;这时 finish 又开一条 ssh,两条都写同一个 .build-status.json.new。先改名的把档案搬走,后改名的拿到 ENOENT,而落地的那份是两次写入交叠的结果——build-status.json 从那一刻起就不是合法 JSON,首页 stable 的构建状态区块空了 14 小时(线上档案已单独修复)。

set -e 之下 EXIT trap 里的失败会变成脚本退出码。 一次进度回报失败把已经建好、已经发布的一轮说成失败。真出问题时站点会停在 running,ops/status.sh 本来就盯着这个。

改动

  • build-progress.sh:每次推送各自 mktemp,推送前 chmod 644,失败时清掉临时档。
  • cycle.shfinish 的推送失败不再改变退出码;看守进程改用自己的行程组,kill 一并收掉在途的 ssh。

测试

新增 tests/test-progress-push.sh(7 项,已接入 CI):ssh stub 真的执行远端那串命令,mv 包一层延迟,把原本百分之一的碰撞变成每次必现。tests/test-cycle.sh 从 9 项加到 16 项。

变异反证 5 项全部转红:换回固定临时档名、拿掉 chmodfinish 失败重新致命、看守进程丢掉频道输出档名、换回只杀看守进程本身。

2026-08-12 那轮 stable 从建置到发布全部成功,257 个包已经上镜像机,服务却报
失败,日志只有一句 `mv: cannot stat '/srv/mirrors/.build-status.json.new'`。

两个缺陷叠在一起。

一是临时档名固定。看守进程每 60 秒推一次进度,`on_exit` 里的 `kill` 只打倒看守
进程本身,它正在执行的 ssh 被 init 收养后继续跑;这时 `finish` 又开一条 ssh,
两条都往同一个 `.build-status.json.new` 写。先改名的那条把档案搬走,
后改名的那条
拿到 ENOENT,而落地的那份是两次写入交叠的结果——`build-status.json` 从那一刻起
就不是合法 JSON,首页 stable 的构建状态区块因此空了 14 小时。改成每次推送各自
`mktemp`,并在推送前 `chmod 644`。

二是 `set -e` 之下 EXIT trap 里的失败会变成整个脚本的退出码。一次进度回报失败
不该把已经建好、已经发布的一轮说成失败——真出问题时站点会停在 running,
`ops/status.sh` 本来就盯着这个。

看守进程另外改用自己的行程组,`kill` 一并收掉它在途的 ssh,否则那条 ssh 会把
running 的快照盖在最终状态上面。
@Zakkaus
Zakkaus merged commit 55bb933 into master Aug 13, 2026
7 checks passed
@Zakkaus
Zakkaus deleted the fix/progress-push-race branch August 13, 2026 00:33
Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Labels

None yet

Projects

None yet

Development

Successfully merging this pull request may close these issues.

1 participant