设计归档
设计归档记录 PGSTY SILO 的核心工程决策:缺陷根因、S3 与 IAM 协议不变量、备选方案取舍、运维边界与回归测试索引。
2026-11-10 发布复查中发现
- 生命周期版本历史:同一个版本,两个发行版写的头部(#332):2024-04-28 之前的 MinIO 写入的数据,在纠删集里换过一部分盘之后,生命周期过期为什么会被永久拒绝,以及为什么把两个随写入版本而变的头部字段从修订标识里拿掉就是最小而完整的修复。
2026-11-09 Console 多语言
- 为 SILO 提供多语言支持:随 Console 2.7.0 发布并内嵌于 SILO Server 20261109 的十语言界面(Console 2.6.0 仅含中英文;涵盖 #83 葡语贡献与 silo#277 土耳其语需求),记录维护分级、英文回退与阿拉伯语 RTL,以及支持逐语言分包、全量加载决策的 gzip 和缓存实测。
2026-11-06 发布验收中发现
- 局部视图不能把存在的对象报成不存在(已随 SILO Server 20261109 发布):只能连上部分盘的节点,为什么会对存在的对象返回 404,以及为什么判定“不存在”必须要求每块盘都应答。
- Multipart 提交失败可能让上传卡死(推迟至 SILO Server 20261109 之后):未达到写 quorum 的提交为什么会让上传一直卡到过期清理,以及为什么修复推迟至
SILO Server 20261109之后的版本与存储 RPC fencing 一并交付。
2026-11-04 发布阻塞的生命周期修复
本节所有服务端设计记录对应的修复已随 SILO Server 20261109 发布;Console 配额校验修复已随独立版 Console 2.6.0 与 Console 2.7.0 发布,并内嵌于 SILO Server 20261109。
- 多池生命周期过期:按整个对象决策(#278、#279):解释只按单个池内版本做出的过期判断,为何会隐藏、删除或复活另一个池中的版本,以及为什么在对象锁内按合并版本列表复核是最小而完整的修复。
- 恢复副本:过期的是副本,不是对象(#281、#282):解释当前版本的恢复副本过期为何会隐藏对象或抹掉更早的 null 版本,以及哪些存储层与原生恢复防护要与精确版本修复一起交付。
- 两阶段原生恢复(#284):解释原生恢复为何在整个 tier 下载期间持有对象锁,#281 的第一版防护为何还会让失败的普通上传卡住,以及在锁外暂存、再做一次短暂且经过核验的提交,如何取代私有 upload。
- Peer 重载后的审计 Webhook(#259):解释运行时修改 audit_webhook 为何会让除处理请求的服务器外其他所有服务器上的目标停止工作,哪些日志子系统存在同样问题,以及为什么用服务器上下文构建日志目标、并先打开队列存储是最小而完整的修复。
- 失败写入与幽灵空前缀(#285、#286):解释暂存数据在远端 rename 之前消失的写入,为何会留下空对象目录并在之后被列为空前缀,以及为什么在两条 rename 失败路径上清理它就足够。
- Heal 演练不能删除数据(源自 #280):解释 heal 演练为何会删掉 dangling 对象最后的元数据副本,并在远端节点上执行真实的桶 heal,以及为什么提前返回加上把演练标志传给 peer 能同时关闭这两条路径。
- 生命周期"删除全部版本"只能作用于一个 key(在审查 #278 修复时发现):解释 ExpiredObjectAllVersions、DelMarkerExpiration 和批量过期的默认 purge 为何会删除过期 key 名下的所有其他 key,以及为什么在复核后按版本 ID 只清理该 key 自身的版本,是最小而安全的修复。
- Console 的桶配额:列表显示与数值校验(silo-console#72、silo-console#73):解释 Console 设置的配额为何在桶列表中显示为"-"、创建桶时为何会把超大配额变成 1 字节、两者的来源,以及随独立版 Console 2.6.0 与 Console 2.7.0 发布并内嵌于 SILO Server 20261109 的修复范围。
- 大型单池集群的锁域:解释在 18 台及以上主机的单池集群中,DELETE 与 CopyObject 为何无法与同一 key 上的 PUT 互斥,哪些布局受影响,以及关闭它的路由改动。
2026-11-01 存储池迁移完整性审查
本节所有存储池迁移与分层清理修复已随 SILO Server 20261109 发布。
- 存储池迁移完整性审查:#261、#263 与 #265:维护者对三个问题及其修复的审查,记录 #266 的贡献合并、#276 的维护者后续修复、验证证据与合并顺序。
- 混合 EC 布局与迁移列表(#261、#262):解释一次未完成的降级覆写为何会让可读对象从 decommission/rebalance 列表中消失,以及 #262 为何以最小范围解决问题。
- Tier free version 是内部清理记录(#263、#264):解释 free version 为何必须继续供 healing 使用,但不能作为用户可见的删除标记或迁移版本。
- ILM 过期与存储池迁移顺序(#265、#266、#276):解释版本桶的 Expiration 删除标记为何不能让当前版本被跳过,以及维护者后续修复如何保留 tier 清理和完成语义。
2026-10-24 FULL_OBJECT 校验和复制
- FULL_OBJECT 校验和复制:在初始化上传时保留类型(
#254、#255):解释遗漏类型为何让有效的分片 CRC 对象复制失败,共享请求头的一处修复如何同时恢复已有 CopyObject 路径,以及发送端升级与验收边界。
2026-10-24 多池删除与放置决策
-
多池删除:失败时保住最新副本(
#256、#257):解释在线磁盘预检查为何挡不住执行中的 I/O 故障,分阶段清理如何保住每项的权威副本,以及已合并修复的重试、分层引用、性能和兼容性边界。 -
多池覆盖亲和:为何最终没有采纳 #245(
#245):记录原始放置问题、请求级 quorum 与健康判断改进、仅限普通无版本覆盖的收窄设计、两轮 m3 性能实测,以及小对象覆盖仍未达标后的停止决定。实验修改没有合并。
2026-10-23 Alias 区域
- Alias 区域:小配置改动的兼容性边界:按 alias 保存区域、客户端缓存隔离,以及升级、降级和凭据轮换的边界;已按 mcli 20261109 复核。
2026-10-23 IAM 与 KMS 设计记录
- LDAP 长 DN:恢复登录可用性并守住 IAM 撤销安全边界(
#250):解析NormalizeDN的\xx十六进制转义为何触发对象 IAM 后端的单路径分量 255 字节上限,以及为何仅将物理上无法落盘的纯 ASCII 超长分量归类为errConfigNotFound。 - IAM 策略重载:锁粒度、请求取消与超时预算隔离(
#251):在保留writeMu写串行锁的前提下将慢速策略加载与 KMS 解密移出内存鉴权缓存锁,将取消信号贯通至KES.Decrypt,并将etcd单步读取超时与整批解密预算解耦。
Server 20261018 核心设计记录
围绕 Server 20261018 正式版的核心架构改动,请参阅:
- Object Lock 治理保留期与覆写防护(
SN-2026-015、SN-2026-016) - IAM Admin 凭据授权边界(
SN-2026-017) - 持久化 IAM 撤销与按范围撤销 STS(
SN-2026-013) - LIST 恢复锁开销优化
- ListMultipartUploads 回退决策与容量边界
- 多池对象一致性与迁移保护
- KES 与 OpenBao 集成
-
生命周期版本历史:同一个版本,两个发行版写的头部
本记录说明维护者复查 RELEASE.2026-11-09T00-00-00Z(d99829238)时发现的一个缺陷。它由该版本中的 9f7b49369 引入,这个提交是多池生命周期修复(#278)的一部分。修复见 PR #332,没有单独的 GitHub issue。 **状态:**已通过 PR #332 合并到 main,提交为 36c8d1683;合并前在第二轮对抗评审中获得通过,第一轮评审改动了修复方案,见评审记录。尚未发布:RELEASE.2026-11-09T00-00-00Z 受影 …
本记录说明维护者复查 RELEASE.2026-11-09T00-00-00Z(d99829238)时发现的一个缺陷。它由该版本中的 9f7b49369 引入,这个提交是多池生命周期修复(#278)的一部分。修复见 PR #332,没有单独的 GitHub issue。 **状态:**已通过 PR #332 合并到 main,提交为 36c8d1683;合并前在第二轮对抗评审中获得通过,第一轮评审改动了修复方案,见评审记录。尚未发布:RELEASE.2026-11-09T00-00-00Z 受影 …
-
为 SILO 提供多语言支持
Eduardo Andrade Machado 的 Console PR #83 提供了巴西葡萄牙语翻译。siyahkut 在 silo#277 中请求土耳其语。这两项贡献推动 Console 扩展为可配置的十语言界面。 状态: 已随 Console 2.7.0(4e91ae506e70,pgsty/silo-console:v2.7.0)正式发布,并内嵌于 SILO Server 20261109(d998292387cc)。发布前复核验证了紧凑标签、RTL 输入控件,以及手机、平板和桌面宽度 …
Eduardo Andrade Machado 的 Console PR #83 提供了巴西葡萄牙语翻译。siyahkut 在 silo#277 中请求土耳其语。这两项贡献推动 Console 扩展为可配置的十语言界面。 状态: 已随 Console 2.7.0(4e91ae506e70,pgsty/silo-console:v2.7.0)正式发布,并内嵌于 SILO Server 20261109(d998292387cc)。发布前复核验证了紧凑标签、RTL 输入控件,以及手机、平板和桌面宽度 …
-
两阶段原生恢复
本文覆盖 issue #284,以及 #281 第一版原生恢复防护带来的两处回归;那些防护记录在恢复副本:过期的是副本,不是对象中。本文基于 main 69fcf50cd 和发布前的 SILO Server 20261109 集成分支评估。这个设计取代 #281 防护中私有 upload 的部分,其余部分保留。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 原生恢复(对已转储版本发起 POST ?restore)会从 tier 下载该版本 …
本文覆盖 issue #284,以及 #281 第一版原生恢复防护带来的两处回归;那些防护记录在恢复副本:过期的是副本,不是对象中。本文基于 main 69fcf50cd 和发布前的 SILO Server 20261109 集成分支评估。这个设计取代 #281 防护中私有 upload 的部分,其余部分保留。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 原生恢复(对已转储版本发起 POST ?restore)会从 tier 下载该版本 …
-
局部视图不能把存在的对象报成不存在
本记录说明在 SILO Server 20261109 本地验收中发现的一个缺陷。修复前的 SILO Server 20261109 集成分支和 69fcf50cd 上都能复现。对应 #302。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短回答 刚重启的节点,或者短暂与部分节点断开连接的节点,只能看到纠删集里的一部分盘。如果它能看到的盘上,对象元数据分属两个修订版本,而哪个版本都凑不够读 quorum,GET 和 HEAD 就会对一个存在的对 …
本记录说明在 SILO Server 20261109 本地验收中发现的一个缺陷。修复前的 SILO Server 20261109 集成分支和 69fcf50cd 上都能复现。对应 #302。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短回答 刚重启的节点,或者短暂与部分节点断开连接的节点,只能看到纠删集里的一部分盘。如果它能看到的盘上,对象元数据分属两个修订版本,而哪个版本都凑不够读 quorum,GET 和 HEAD 就会对一个存在的对 …
-
Multipart 提交失败可能让上传卡死
本记录说明在 SILO Server 20261109 发布验收中发现的一个缺陷。它在 69fcf50cd 与 SILO Server 20261109(d998292387cc)上都能复现,继承自上游 MinIO,尚无单独的 GitHub issue 编号。 状态: 已在 SILO Server 20261109 发布验收中完成分析与复现。曾起草一版候选修复,但对抗评审认定其对 SILO Server 20261109 风险过高而予以否决。SILO Server 20261109 将该缺陷记录 …
本记录说明在 SILO Server 20261109 发布验收中发现的一个缺陷。它在 69fcf50cd 与 SILO Server 20261109(d998292387cc)上都能复现,继承自上游 MinIO,尚无单独的 GitHub issue 编号。 状态: 已在 SILO Server 20261109 发布验收中完成分析与复现。曾起草一版候选修复,但对抗评审认定其对 SILO Server 20261109 风险过高而予以否决。SILO Server 20261109 将该缺陷记录 …
-
失败写入与幽灵空前缀
本文覆盖 issue #285 和 Denis Babchuk 提交的 PR #286,基于 main 69fcf50cd 与 PR head ed05d982a 评估。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 报告属实。调用方已经放弃并删除了暂存数据之后,某块磁盘仍可能执行 xlStorage.RenameData。此时数据目录的重命名会失败,但为这次重命名创建的对象目录会留下来,而且是空的。只要它的父目录下还有其他对象,它就不可 …
本文覆盖 issue #285 和 Denis Babchuk 提交的 PR #286,基于 main 69fcf50cd 与 PR head ed05d982a 评估。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 报告属实。调用方已经放弃并删除了暂存数据之后,某块磁盘仍可能执行 xlStorage.RenameData。此时数据目录的重命名会失败,但为这次重命名创建的对象目录会留下来,而且是空的。只要它的父目录下还有其他对象,它就不可 …
-
Peer 重载后的审计 Webhook
本文覆盖 Henrik Feldt 报告的 issue #259,基于 main 69fcf50cd 评估。本修复完成了维护者此前未提交的工作:补上 Kafka 调用点,在目标从未启动时把排队记录交给替代者,并增加 Kafka 测试覆盖。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 报告属实,一个定向测试即可复现。管理员在运行时修改 audit_webhook 时,接收请求的服务器用进程上下文应用这次修改;其他每台服务器在 peer 重 …
本文覆盖 Henrik Feldt 报告的 issue #259,基于 main 69fcf50cd 评估。本修复完成了维护者此前未提交的工作:补上 Kafka 调用点,在目标从未启动时把排队记录交给替代者,并增加 Kafka 测试覆盖。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 报告属实,一个定向测试即可复现。管理员在运行时修改 audit_webhook 时,接收请求的服务器用进程上下文应用这次修改;其他每台服务器在 peer 重 …
-
生命周期"删除全部版本"只能作用于一个 key
本文记录的缺陷是在审查 #278 的修复(多池生命周期过期)时发现的。评估基于 main 69fcf50cd,以及 #278 和 #281 的维护者集成分支;保留当时的评估快照。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 缺陷属实,也是 SILO Server 20261109 的发布阻塞项。有三种操作会删除一个 key 的"全部版本": 生命周期扩展 ExpiredObjectAllVersions; 生命周期动作 …
本文记录的缺陷是在审查 #278 的修复(多池生命周期过期)时发现的。评估基于 main 69fcf50cd,以及 #278 和 #281 的维护者集成分支;保留当时的评估快照。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 缺陷属实,也是 SILO Server 20261109 的发布阻塞项。有三种操作会删除一个 key 的"全部版本": 生命周期扩展 ExpiredObjectAllVersions; 生命周期动作 …
-
恢复副本:过期的是副本,不是对象
本文覆盖 issue #281 和 Denis Babchuk 提交的 PR #282,基于 main 69fcf50cd 评估。修复与多池生命周期修复(多池生命周期过期,#278)在同一个维护者集成 PR 中交付:贡献者提交原样保留,并附加下文所述的防护,同时配合单池锁域修复一并发布。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 报告属实。执行 POST ?restore 后,已分层的版本会在本地获得一份临时副本,保留到 …
本文覆盖 issue #281 和 Denis Babchuk 提交的 PR #282,基于 main 69fcf50cd 评估。修复与多池生命周期修复(多池生命周期过期,#278)在同一个维护者集成 PR 中交付:贡献者提交原样保留,并附加下文所述的防护,同时配合单池锁域修复一并发布。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 报告属实。执行 POST ?restore 后,已分层的版本会在本地获得一份临时副本,保留到 …
-
多池生命周期过期:按整个对象决策
本文覆盖 issue #278 和 Denis Babchuk 提交的 PR #279,基于 main 69fcf50cd 评估。修复已通过维护者集成合入:贡献者提交原样保留,并附加下文所述的维护者后续修正。恢复副本过期的修复(#281)在同一个集成 PR 中交付,另有单独记录。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 报告属实,也是 SILO Server 20261109 修复的首要发布阻塞缺陷。部署有多个池时,同一个 key …
本文覆盖 issue #278 和 Denis Babchuk 提交的 PR #279,基于 main 69fcf50cd 评估。修复已通过维护者集成合入:贡献者提交原样保留,并附加下文所述的维护者后续修正。恢复副本过期的修复(#281)在同一个集成 PR 中交付,另有单独记录。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 报告属实,也是 SILO Server 20261109 修复的首要发布阻塞缺陷。部署有多个池时,同一个 key …
-
大型单池集群的锁域
本文覆盖在审查恢复副本修复(恢复副本:过期的是副本,不是对象)时发现的锁域缺陷,评估基线为 main 上的 69fcf50cd。对应 #298。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 锁域分裂是真实的,继承自上游 MinIO,并且只在一个池中的各纠删集并不使用相同主机时才存在。按自动布局,这意味着单池有 18 台或更多主机;不超过 17 台主机时,每个集都包含所有主机,锁组完全相同。 在这样的池里,DELETE、批量删除 …
本文覆盖在审查恢复副本修复(恢复副本:过期的是副本,不是对象)时发现的锁域缺陷,评估基线为 main 上的 69fcf50cd。对应 #298。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 锁域分裂是真实的,继承自上游 MinIO,并且只在一个池中的各纠删集并不使用相同主机时才存在。按自动布局,这意味着单池有 18 台或更多主机;不超过 17 台主机时,每个集都包含所有主机,锁组完全相同。 在这样的池里,DELETE、批量删除 …
-
Heal 演练不能删除数据
本文覆盖 Jasper Bernhardt(@dihmandrake)提交的 PR #280 中与演练(dry run)相关的部分,基于 main 69fcf50cd 评估。同一个 PR 还让深度扫描并发校验一个对象的各块盘。这项优化另行评审,不在本文范围内。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 缺陷属实,是 SILO 从上游 MinIO 继承来的。mc admin heal --dry-run 的说明是"只检查数据,不做修改 …
本文覆盖 Jasper Bernhardt(@dihmandrake)提交的 PR #280 中与演练(dry run)相关的部分,基于 main 69fcf50cd 评估。同一个 PR 还让深度扫描并发校验一个对象的各块盘。这项优化另行评审,不在本文范围内。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 简短结论 缺陷属实,是 SILO 从上游 MinIO 继承来的。mc admin heal --dry-run 的说明是"只检查数据,不做修改 …
-
Console 的桶配额:列表显示与数值校验
本文覆盖 silo-console#72(在 Web Console 中设置的配额在桶列表里显示为短横线)和 silo-console#73(创建桶表单的数值校验)。评估基于修复之前的 Console 源码 3d264aea9,以及修复提交 a85665814 至 5a34232e7。 状态: PR #74(3d1dd56eb,2026-11-04)已随独立版 Console 2.6.0(f8ab14669)发布。PR #74 及全部数值后续修复(#75 2b18ff854、#76 …
本文覆盖 silo-console#72(在 Web Console 中设置的配额在桶列表里显示为短横线)和 silo-console#73(创建桶表单的数值校验)。评估基于修复之前的 Console 源码 3d264aea9,以及修复提交 a85665814 至 5a34232e7。 状态: PR #74(3d1dd56eb,2026-11-04)已随独立版 Console 2.6.0(f8ab14669)发布。PR #74 及全部数值后续修复(#75 2b18ff854、#76 …
-
ILM 过期与存储池迁移顺序
本文记录 issue #265、贡献者修复 PR #266 与维护者后续修复 #276,并说明已经合入的 #264 与 #267 是相关前置修复。#266 的 decommission 提交是 19910230a,rebalance 提交是 a995921e5。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 更新(2026-11-06)。 生命周期删除不复制,S3 如此,SILO 的每个发布版本也是如此。#276 曾在 main 上短暂地让它们复制 …
本文记录 issue #265、贡献者修复 PR #266 与维护者后续修复 #276,并说明已经合入的 #264 与 #267 是相关前置修复。#266 的 decommission 提交是 19910230a,rebalance 提交是 a995921e5。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 更新(2026-11-06)。 生命周期删除不复制,S3 如此,SILO 的每个发布版本也是如此。#276 曾在 main 上短暂地让它们复制 …
-
Tier free version 是内部清理记录
本文记录 issue #263 与 PR #264 的审查结论(#276 后续更新基线 0fc5a0b5),#264 的合入提交记录为 0cfca29c。这个 PR 的三个提交是一组相互配合的修复,不是三个互不相关的 workaround。 状态: 已连同下文的 free version 清理归属与 decommission 取消后续修复一并随 SILO Server 20261109(d998292387cc)正式发布。 先说结论 问题成立。free version 是 SILO 在删除 …
本文记录 issue #263 与 PR #264 的审查结论(#276 后续更新基线 0fc5a0b5),#264 的合入提交记录为 0cfca29c。这个 PR 的三个提交是一组相互配合的修复,不是三个互不相关的 workaround。 状态: 已连同下文的 free version 清理归属与 decommission 取消后续修复一并随 SILO Server 20261109(d998292387cc)正式发布。 先说结论 问题成立。free version 是 SILO 在删除 …
-
混合 EC 布局与迁移列表
本文记录 issue #261 与 PR #262 的审查结论(#276 后续更新基线 0fc5a0b5)。实际修复通过维护者 PR #267(a7310d59f)合入,#262 是被取代的重复 PR。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 先说结论 问题成立。一次成功的降级覆写可能让一个无版本对象同时存在两种 EC 布局:在线磁盘上有更新的副本,离线磁盘上保留旧副本。GET 与 ListObjectsV2 能选出更新的可读多数 …
本文记录 issue #261 与 PR #262 的审查结论(#276 后续更新基线 0fc5a0b5)。实际修复通过维护者 PR #267(a7310d59f)合入,#262 是被取代的重复 PR。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。 先说结论 问题成立。一次成功的降级覆写可能让一个无版本对象同时存在两种 EC 布局:在线磁盘上有更新的副本,离线磁盘上保留旧副本。GET 与 ListObjectsV2 能选出更新的可读多数 …
-
存储池迁移完整性审查:#261、#263 与 #265
本文审查 #261、#263、#265 及其对应的修复 #262、#264、#266,并记录维护者后续修复 #276。这是设计与审查记录,不是发布说明。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。PR #267(取代 #262)、#264、#266 与 #276(已在发布前移除生命周期删除复制)均已随 RELEASE.2026-11-09T00-00-00Z 一并交付。 先看结论 问题 是否成立 对应 PR 的判断 建议处理 #261 成立。可读 …
本文审查 #261、#263、#265 及其对应的修复 #262、#264、#266,并记录维护者后续修复 #276。这是设计与审查记录,不是发布说明。 状态: 已随 SILO Server 20261109(d998292387cc)正式发布。PR #267(取代 #262)、#264、#266 与 #276(已在发布前移除生命周期删除复制)均已随 RELEASE.2026-11-09T00-00-00Z 一并交付。 先看结论 问题 是否成立 对应 PR 的判断 建议处理 #261 成立。可读 …
-
多池删除:失败时保住最新副本
2026 年 10 月 24 日决定:合并修正后的 PR #257(已随 Server 20261026 发布)。 提交 aafe4f8886 修复了 issue #256 报告的多池删除缺陷,并补齐请求开始之后的执行期故障保护。核心不变量是:先完成其他池的旧副本清理,再删除决定当前读取结果的权威副本。 Denis Babchuk 报告了该问题并提交了初始补丁。代码评审复现了故障,发现批量删除在通过在线盘数预检查后仍存在执行期故障窗口,随后补充分阶段执行、逐项响应身份保持、部分删除重试以及共享分 …
2026 年 10 月 24 日决定:合并修正后的 PR #257(已随 Server 20261026 发布)。 提交 aafe4f8886 修复了 issue #256 报告的多池删除缺陷,并补齐请求开始之后的执行期故障保护。核心不变量是:先完成其他池的旧副本清理,再删除决定当前读取结果的权威副本。 Denis Babchuk 报告了该问题并提交了初始补丁。代码评审复现了故障,发现批量删除在通过在线盘数预检查后仍存在执行期故障窗口,随后补充分阶段执行、逐项响应身份保持、部分删除重试以及共享分 …
-
多池覆盖亲和:为何最终没有采纳 #245
2026 年 10 月 24 日决定:不合并本次测试的多池覆盖亲和补丁(PR #245)。 该方案解决了跨池覆盖遗留旧副本的空间占用问题,但无论完整策略还是仅限普通无版本覆盖的收窄策略,都未能在性能测试中达到可接受的权衡。两个实验分支(codex/healthy-pool-affinity 与 codex/unversioned-pool-affinity)已保留归档,服务端 main 分支保持原状。 Denis Babchuk 提出的思路是:覆盖已有对象时,优先写回已存放该对象的池。代码评审发 …
2026 年 10 月 24 日决定:不合并本次测试的多池覆盖亲和补丁(PR #245)。 该方案解决了跨池覆盖遗留旧副本的空间占用问题,但无论完整策略还是仅限普通无版本覆盖的收窄策略,都未能在性能测试中达到可接受的权衡。两个实验分支(codex/healthy-pool-affinity 与 codex/unversioned-pool-affinity)已保留归档,服务端 main 分支保持原状。 Denis Babchuk 提出的思路是:覆盖已有对象时,优先写回已存放该对象的池。代码评审发 …
-
FULL_OBJECT 校验和复制:在初始化上传时保留类型
Issue #254 报告了一类复制故障:使用 FULL_OBJECT CRC32 或 CRC32C 校验和的分片上传对象在源端可正常上传和读取,但复制到目标端并在最后调用 CompleteMultipartUpload 时会因 400 BadDigest 失败。Denis Babchuk(@botdeniska)提交的 PR #255 补回了出站复制请求遗漏的校验和类型头。 该补丁于 2026 年 10 月 24 日以 6d890fc86 合入主干并随 Server 20261026 发布,共 …
Issue #254 报告了一类复制故障:使用 FULL_OBJECT CRC32 或 CRC32C 校验和的分片上传对象在源端可正常上传和读取,但复制到目标端并在最后调用 CompleteMultipartUpload 时会因 400 BadDigest 失败。Denis Babchuk(@botdeniska)提交的 PR #255 补回了出站复制请求遗漏的校验和类型头。 该补丁于 2026 年 10 月 24 日以 6d890fc86 合入主干并随 Server 20261026 发布,共 …