这次要你回两件事
1
第 6 条:哪些工具可以并行 有 A / B / C 三个选项,建议 A。看详情 ↓
2
#379 合并时能不能带一个小迁移 Computer 内部新加一张表,不动 D1 和正式环境,建议同意。看详情 ↓
两条一起回,比如:「同意 A,同意迁移」
进展
- 已合 #376
- 解冲突中 #377(bash 白名单分流)和 #378(拉回失败 10 分钟上限)审查和预发测试都过了,在解合并冲突,解完就合。
1第 6 条修改方案:哪些工具可以并行
一句话
读文件这类只读操作改成并行,不再跟着长命令干等;会改东西的操作(bash、write、edit)照旧排队。有 A / B / C 三个选项,建议选 A。
readglobgrep
← 只读,A 方案里可并行
bashwriteedit
← 会改东西,继续排队
问题
现在的设计里,所有工具(bash、write、edit、read、glob、grep)排成一条队,一个一个执行。模型一次发好几个读文件,或者一条长命令(容器里可能跑几分钟)在跑时去读文件,都得干等。你希望读文件这类操作能并行。
现在:模型同时发出 1 条长 bash + 3 个 read
bash
read 1
read 2
read 3
开始时间 →全部完成
为什么当初要排队
有三类事不能和别的操作同时做:
①
后台维护:还原被改坏的只读文件、memory 同步、收 outputs。它们要在两条命令之间做,并且要在容器改动确认拉回之后。
②
写操作(write、edit、bash)如果同时改同一个文件,会互相覆盖。
③
容器同步要求同一时刻最多一条命令在跑。
关键:只读操作不改任何东西,本来就不需要排队。
A只读完全并行 推荐
只读工具(read、glob、grep)完全并行,不等正在跑的 bash,只在后台维护那几秒里稍等。bash、write、edit 继续排队。
同样是 1 条长 bash + 3 个 read
bash
read 1
read 2
read 3
开始时间 →
好处:读立刻出结果,长命令卡不住读。
代价:命令还在容器里跑的时候去读,读到的是这条命令开始之前的内容。不过同一批里并行发出的调用本来就没有先后保证,CMA 也是这样;命令跑完后再读,就是新内容。
B读写锁
读和读之间并行,但只要 bash 或 write 在跑,读就要等它结束(读写锁)。
同样是 1 条长 bash + 3 个 read
bash
read 1
read 2
read 3
开始时间 →
好处:读到的内容总是最新的。
代价:长命令会把读卡住,你想解决的问题只解决了一半(读和读之间不用等了,但还得等长命令)。
C全部并行 不推荐
所有操作都并行,包括 bash。
两条 bash 同时改同一个文件
bash 1
bash 2
结果
read
开始时间 →
代价:两条命令同时改文件会互相覆盖,容器同步的前提(同一时刻最多一条命令)也被打破,可能丢文件。
三个选项对比
| A | B | C | |
|---|---|---|---|
| 读和读并行 | ✅ | ✅ | ✅ |
| 长命令在跑时能读 | ✅ | ❌ 要等 | ✅ |
| 读到的一定是最新 | 命令跑完后是 | ✅ | 不保证 |
| 会丢文件 / 互相覆盖 | 不会 | 不会 | ⚠️ 可能 |
| 结论 | 推荐 | 只解决一半 | 不推荐 |
A 方案执行时的顺序
一回合里的时间线(数字对应下面的步骤)
模型
read×3
bash 队列
后台维护
新 read
开始时间 →
bash / write / edit(排队)
只读工具
拉回容器改动
后台维护
等待
1
模型同时发出 read×3 + bash。
2
三个 read 立刻并行读,不等 bash。
3
bash 按队列执行,跑完后拉回容器改动。
4
拉回确认完成后,后台维护(还原、同步、收 outputs)只在两条命令之间做;这几秒内新来的 read 稍等。
5
下一个 bash、write、edit 继续排队。
第 1 条怎么回
建议选 A。回「同意 A」,或者回别的字母(B / C)就行。
- 实现会在 #379 上补改,审查排在 #376–#378 之后,不耽误进度。
- #379 其余 9 条已按你的同意执行。
2#379 合并是否允许带一个小迁移
问题
为了知道哪些只读文件被改了、需要还原,#379 在每台 Computer 自己的小数据库里新加了一张表 mount_file,记录每个拷进来的文件的大小、修改时间和哈希。按规矩,带迁移的 PR 要你批了才合。
每台 Computer 自己的小数据库
① computer_row已有
这台 Computer 自己的记录
② container_run已有
容器运行的记录
③ mount_file#379 新加
每个拷进来的只读文件一行,用来判断要不要还原:
文件路径大小修改时间哈希
D1(共享数据库)
不动
不动
DO 版本标签
仍是 v6-computer
仍是 v6-computer
正式环境
没动
没动
范围
- 只是 Computer 内部的第三张表。
- 不动 D1。
- 不改 DO 类的版本标签(仍是 v6-computer)。
- 建表可以重复执行,对已有数据没影响。
- 预发上已经跑过,全套测试都过了;正式环境没动。
选项
同意 建议
第 6 条改完、复测通过后就合。
第 6 条改完、复测通过后就合。
不同意
换成每回合重算一遍哈希,不建表。
代价:每回合要多读最多 256 MiB,会慢不少。
换成每回合重算一遍哈希,不建表。
代价:每回合要多读最多 256 MiB,会慢不少。
每回合检查只读文件要花的功夫(示意)
同意·建表
不建表
两条一起怎么回
微信回「同意 A,同意迁移」
不同意的话写出来,比如「同意 B,不同意迁移」
不同意的话写出来,比如「同意 B,不同意迁移」