分享历史。分离突变。在发布进行协调。
名称描述了该结构:不可变的层堆栈。 写时复制描述了执行规则:代理读取共享堆栈,但只写入自己的临时层。
Layer + Stack
有序的不可变历史
manifest 按从新到旧的顺序指向可见层。读取采用每条路径最先出现的可见版本;压缩可以缩短旧层区段,而不改变这一逻辑视图。
复制 + 写入时
私人突变表面
每个会话挂载在新的 upperdir 下具有相同的只读较低历史记录。仅当会话第一次改变它时,内核才会复制较低的文件。
- 层栈
- 该商店订购了 manifest 的不可变文件系统层。 manifest 是最新优先的,因此第一个包含路径的层获胜。
- Base · B*
- 内容寻址起始工作区。每个分支都可以引用相同的物理负载,而不是克隆它。
- 已发布层·L*
- 从已解析的发布创建的不可变增量。成功的提交将其添加到 manifest 之前。
- upperdir
- 一个会话的私有可写覆盖目录。新文件、副本和删除标记一直保留在这里,直到捕获。
- 租约
- 固定的 manifest 快照,使会话的下部层保持活动状态并使其执行视图稳定。
- whiteout
- 覆盖元数据意味着“此较低路径已删除”。它允许增量删除文件而不改变旧的层。
系统故障
写操作向前传送;发布循环回到历史。
已发布堆栈
L000042最新已发布三角洲
S000041压缩的历史
B000001-base一个共享的基础有效负载
会话叠加
upperdir/ws-17rw私人写入+whiteout
lowerdir+rolease · newest-first · pinned
发布闸门
- 1捕获upperdir 变化
- 2比较路径指纹
- 3合并或拒绝冲突
- 4fsync、重命名、前置 manifest
租约
固定当前的 manifest 及其有序的较低路径。
Mount
在冻结视图上方附加一个新的 upperdir 和 workdir。
执行
阅读工会;将每个突变引导到私有 upperdir 中。
捕获
将 upperdir 扫描为写入、符号链接、删除和不透明目录。
解决
将路径 指纹 与 head 进行比较并合并符合条件的文本。
提交
前置一个不可变的层,或者拒绝整个 更改集。
恒定的基本有效负载,成比例的私有状态。
层栈删除了昂贵的 N × B 克隆。它不使总存储或每个操作恒定时间。诚实模型将共享历史与每个会话状态分开。
存储模型
模式A S(N) = B + P + ΣΔᵢ + N·Msandbox
模式B S(N) = B + P + 1 个沙箱 + ΣΔᵢ + N·Msession
- B
- 一个物理基础有效负载
- P
- 保留共享 已发布历史记录
- Δᵢ
- 在私人 COW 字节中推出
- M
- 特定于拓扑的元数据
随着 N 的增长
Θ(1)θ(N)ΣΔᵢ微小的逻辑编辑仍然可以复制整个文件,因此 Δᵢ 可能大于用户可见的差异。
运行时间模型
B = 基本字节 · L = 可见层· P = 路径组件 · R = 返回字节 · F = 复制文件 · W = 写入 · C = 已捕获路径 · H = 散列/合并字节 · K = 压缩字节
| 操作 | 时间 | 为什么 |
|---|---|---|
| 建造或填充基地 | θ(B) 一次 | 在共享之前读取并具体化 B 字节工作区。 |
| 创建一台工作区会话 | θ(L) | 构建租约和有序lowerdir列表;无 θ(B)工作区副本。 |
| 从路径读取 R 字节 | O(L·P + R) 最坏情况 | 查找可能会跨越 L层和 P 路径组件,然后返回文件字节。 |
| 首先写入仅低层文件 | O(F+W) | 覆盖复制可以在应用 W 字节写入之前复制完整的 F 字节文件。 |
| 后来写在同一个会话 | 氧(W) | 该文件已存在于私有 upperdir 中。 |
| 捕获和发布 | ≈ O(C log C + C·L·P + H) | 对 C 已捕获路径进行排序,通过堆栈解析它们,并对 H 受影响的字节进行散列或合并。 |
| 压缩选定的层区段 | 好的) | 实现 K 个压缩字节以缩短未来的 lowerdir 链。 |
让特工广泛开展。坐标在狭窄的闸门。
代理不会争夺一项可写结账。每个都在 holder 拥有的挂载命名空间中执行,并具有私有 upperdir;隔离网络可以添加单独的网络边界。并发控制转移到短发布事务。
agent-aΔ src/auth.ts
不相交的路径
agent-bΔ 自述文件.md · 大块 1
可合并文本
agent-cΔ 自述文件.md · 大块 1
重叠编辑
OCC发布闸门
根据当前 head 重新检查每个源路径。尝试对符合条件的文本进行三向合并。提交每个原子解析路径,或提交无。
策略忽略的路径故意位于此每路径验证过程之外。
层栈可实现更高的实用上限;它没有设置一个。 通过删除完整的工作区副本和共享写入竞争,它使更广泛的并发更安全、更便宜。 命令 执行仍然具有配置的限制(当前默认为 256)以及操作系统和资源上限。
N
并发执行通道
受 CPU、内存、命名空间和挂载容量的影响。
0
共享可写工作树
未发布的写入保留在其原始会话中。
1
原子发布边界
协调将被推迟,直到代理得到结果为止。
发布记录线路所有权。
这不是 Git 的责任。在冲突解决期间,层栈记录每个最终行是来自 命令 还是活动文件。在提交之后,文件域将该结构映射到不透明的运行时所有者。
归因管道
- 1
解决
来源::命令 或来源::Active(i)
- 2
Map
薄荷workspace_session:<id>或操作:<id>
- 3
附加
在层提交之后写入一个审核事件
- 4
询问
file_blame 的平铺和合并所有者范围
$ file_blame src/auth.ts
1–8original
9workspace_session:ws-17
10–12original
13–14operation:req-91
仅已发布
实时 upperdir 编辑在提交之前保持不可见。
Squash-safe
可审计性存储在压缩的层栈外部。
Best-effort
删除的提交审核后附加将未覆盖的行解析为未知。
选择隔离边界,保持共享不变。
扇出可能发生在具有 N 个沙箱的运行时外部,也可能发生在具有 N 个工作区会话的一个运行时内部。两者都避免了碱基的N个完整副本;它们的故障边界和私有开销是不同的。
这里,并行描述了生成的执行通道。当前的沙箱批量创建和工作区-会话设置会在这些环境同时运行之前序列化其设置调用。
- 01
哈希输入
导出内容寻址的工作区身份。
- 02
私人建造
填充随机数缓存条目而不暴露部分状态。
- 03
推广或重用
原子安装摘要,或重复使用比赛的获胜者。
- 04
租约只读
每个沙箱都指向相同的不可变的基本有效负载。
O(1) 基本有效负载 意味着存储由摘要共享,而不是所有设置工作都是恒定时间的。 N 个沙箱仍然需要 N 个私有运行时记录、可写树和命名空间生命周期。
模式A·隔离优先
N 个同时运行的沙箱
Docker 镜像层和内容寻址的工作区基础是共享的。容器可写状态、暂存、层栈元数据和 COW 增量保持私有。
最适合:不可信、异构或对故障敏感的部署。
模式B·密度优先
N会话在一个沙箱中
沙盒一台·层栈一台
会话共享相同的较低路径和守护程序,同时每个都拥有 upperdir、workdir、holder、租约和 COW 增量。
最适合:密集、均匀的推出批次。
B000001-base相同内容摘要 · 一个物理负载
为什么这自然地映射到强化学习的推出
廉价的分叉、孤立的轨迹、可归因的工件。
- 01
checkpoint + task
- 02
分叉环境
- 03
观察·行动·使用工具
- 04
verify + reward
- 05
收集轨迹
- 06
更新政策
快速重置语义
放弃私有状态并将下一次部署指向相同的基础摘要。
泄漏变得可测试
由一个卷展栏写入的标记绝不能出现在另一视图中。
结果仍然可以解释
基础摘要、私有字节、工具痕迹和 已发布所有者随轨迹旅行。
仔细界定索赔范围: 层栈使 N. 私有增量中的不可变基本有效负载 θ(1) 、控制元数据、轨迹、模型权重和计算仍然随着批量推出而扩展。
