跳转到主要内容

设计归档

设计归档记录 PGSTY SILO 的核心工程决策:缺陷根因、S3 与 IAM 协议不变量、备选方案取舍、运维边界与回归测试索引。

2026-11-09 Console 多语言

2026-11-06 发布验收中发现

2026-11-04 发布阻塞的生命周期修复

  • 多池生命周期过期:按整个对象决策(#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 修复覆盖了什么。
  • 大型单池集群的锁域:解释在 18 台及以上主机的单池集群中,DELETE 与 CopyObject 为何无法与同一 key 上的 PUT 互斥,哪些布局受影响,以及关闭它的路由改动。

2026-11-01 存储池迁移完整性审查

2026-10-24 FULL_OBJECT 校验和复制

2026-10-24 多池删除与放置决策

  • 多池删除:失败时保住最新副本(#256、#257):解释在线磁盘预检查为何挡不住执行中的 I/O 故障,分阶段清理如何保住每项的权威副本,以及已合并修复的重试、分层引用、性能和兼容性边界。

  • 多池覆盖亲和:为何最终没有采纳 #245(#245):记录原始放置问题、请求级 quorum 与健康判断改进、仅限普通无版本覆盖的收窄设计、两轮 m3 性能实测,以及小对象覆盖仍未达标后的停止决定。实验修改没有合并。

2026-10-23 Alias 区域

2026-10-23 IAM 与 KMS 设计记录

Server 20261018 核心设计记录

围绕 Server 20261018 正式版的核心架构改动,请参阅:

  • 为 SILO 提供多语言支持

    发布于 设计

    DesignConsoleInternationalization

    为 SILO 提供多语言支持

    Eduardo Andrade Machado 的 Console PR #83 提供了巴西葡萄牙语翻译。siyahkut 在 silo#277 中请求土耳其语。这两项贡献推动 Console 扩展为可配置的十语言界面。 **截至 2026-11-09 的状态:**十语言界面、审校后的译文、逐语言压缩、静态全量加载和长期缓存已合入 Console main,并随 Console 2.7.0 发布。最终复核保留了紧凑标签要求,并检查了相关控件在手机、平板和桌面宽度下的显示。源码合入、打标与正式产品 …

    Eduardo Andrade Machado 的 Console PR #83 提供了巴西葡萄牙语翻译。siyahkut 在 silo#277 中请求土耳其语。这两项贡献推动 Console 扩展为可配置的十语言界面。 **截至 2026-11-09 的状态:**十语言界面、审校后的译文、逐语言压缩、静态全量加载和长期缓存已合入 Console main,并随 Console 2.7.0 发布。最终复核保留了紧凑标签要求,并检查了相关控件在手机、平板和桌面宽度下的显示。源码合入、打标与正式产品 …

  • 两阶段原生恢复

    发布于 设计

    设计分层存储锁可用性

    两阶段原生恢复

    本文覆盖 issue #284,以及 #281 第一版原生恢复防护带来的两处回归;那些防护记录在恢复副本:过期的是副本,不是对象中。本文基于 main 69fcf50cd 和下个版本的集成分支评估。这个设计取代 #281 防护中私有 upload 的部分,其余部分保留。 状态: 设计经六轮审查通过,实现经两轮审查通过,已在下个版本的集成分支上本地提交。尚未合并或发布。 简短结论 原生恢复(对已转储版本发起 POST ?restore)会从 tier 下载该版本,并写出一份本地副本。两个问题来自这 …

    本文覆盖 issue #284,以及 #281 第一版原生恢复防护带来的两处回归;那些防护记录在恢复副本:过期的是副本,不是对象中。本文基于 main 69fcf50cd 和下个版本的集成分支评估。这个设计取代 #281 防护中私有 upload 的部分,其余部分保留。 状态: 设计经六轮审查通过,实现经两轮审查通过,已在下个版本的集成分支上本地提交。尚未合并或发布。 简短结论 原生恢复(对已转储版本发起 POST ?restore)会从 tier 下载该版本,并写出一份本地副本。两个问题来自这 …

  • 局部视图不能把存在的对象报成不存在

    发布于 设计

    设计纠删码可用性S3 兼容性

    局部视图不能把存在的对象报成不存在

    本记录说明在下一版本地验收中发现的一个缺陷。下一版的本地集成和 69fcf50cd 上都能复现。目前还没有对应的 GitHub issue。 **状态:**修复已通过对抗评审(附若干小意见,均已采纳),并已在本地分支实现。尚未合并或发布。 简短回答 刚重启的节点,或者短暂与部分节点断开连接的节点,只能看到纠删集里的一部分盘。如果它能看到的盘上,对象元数据分属两个修订版本,而哪个版本都凑不够读 quorum,GET 和 HEAD 就会对一个存在的对象返回 404 NoSuchKey。 数据不会丢失 …

    本记录说明在下一版本地验收中发现的一个缺陷。下一版的本地集成和 69fcf50cd 上都能复现。目前还没有对应的 GitHub issue。 **状态:**修复已通过对抗评审(附若干小意见,均已采纳),并已在本地分支实现。尚未合并或发布。 简短回答 刚重启的节点,或者短暂与部分节点断开连接的节点,只能看到纠删集里的一部分盘。如果它能看到的盘上,对象元数据分属两个修订版本,而哪个版本都凑不够读 quorum,GET 和 HEAD 就会对一个存在的对象返回 404 NoSuchKey。 数据不会丢失 …

  • Multipart 提交失败可能让上传卡死

    发布于 设计

    设计Multipart纠删码S3 兼容性

    Multipart 提交失败可能让上传卡死

    本记录说明在下一版本地验收中发现的一个缺陷。它在 69fcf50cd 上能复现,继承自上游 MinIO。目前还没有对应的 GitHub issue。 **状态:**已分析并复现。起草过一版修复,但对抗评审认为它对本版风险太大,予以否决。修复推迟到下一版,与存储操作的完成确认(fencing)一起做。下一版把它列为已知问题。 简短回答 CompleteMultipartUpload 没有达到写 quorum 时,这个上传可能变得无法使用,即使之后所有盘都恢复正常: 再次 Complete 返回 …

    本记录说明在下一版本地验收中发现的一个缺陷。它在 69fcf50cd 上能复现,继承自上游 MinIO。目前还没有对应的 GitHub issue。 **状态:**已分析并复现。起草过一版修复,但对抗评审认为它对本版风险太大,予以否决。修复推迟到下一版,与存储操作的完成确认(fencing)一起做。下一版把它列为已知问题。 简短回答 CompleteMultipartUpload 没有达到写 quorum 时,这个上传可能变得无法使用,即使之后所有盘都恢复正常: 再次 Complete 返回 …

  • 失败写入与幽灵空前缀

    发布于 设计

    设计存储ListObjects运维

    失败写入与幽灵空前缀

    本文覆盖 issue #285 和 Denis Babchuk 提交的 PR #286,基于 main 69fcf50cd 与 PR head ed05d982a 评估。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性审查,全部通过。尚未合并或发布。修复保留 PR #286 的提交不变,并增加一个维护者提交。 简短结论 报告属实。调用方已 …

    本文覆盖 issue #285 和 Denis Babchuk 提交的 PR #286,基于 main 69fcf50cd 与 PR head ed05d982a 评估。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性审查,全部通过。尚未合并或发布。修复保留 PR #286 的提交不变,并增加一个维护者提交。 简短结论 报告属实。调用方已 …

  • Peer 重载后的审计 Webhook

    发布于 设计

    设计审计日志配置运维

    Peer 重载后的审计 Webhook

    本文覆盖 Henrik Feldt 报告的 issue #259,基于 main 69fcf50cd 评估。本修复完成了维护者此前未提交的工作:补上 Kafka 调用点,在目标从未启动时把排队记录交给替代者,并增加 Kafka 测试覆盖。修复已在本地提交,尚未提交 pull request。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性 …

    本文覆盖 Henrik Feldt 报告的 issue #259,基于 main 69fcf50cd 评估。本修复完成了维护者此前未提交的工作:补上 Kafka 调用点,在目标从未启动时把排队记录交给替代者,并增加 Kafka 测试覆盖。修复已在本地提交,尚未提交 pull request。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性 …

  • 生命周期"删除全部版本"只能作用于一个 key

    发布于 设计

    DesignLifecycleBatch ExpirationData Safety

    生命周期"删除全部版本"只能作用于一个 key

    本文记录的缺陷是在审查 #278 的修复(多池生命周期过期)时发现的。评估基于 main 69fcf50cd,以及 #278 和 #281 的维护者集成分支;该分支尚未公开。 状态: 修复已通过审查,并已合入 main。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性审查,全部通过。尚未进入已打标的 SILO 发布。 简短结论 缺陷属实,并阻塞下一个版本。有三种操作会删除一个 …

    本文记录的缺陷是在审查 #278 的修复(多池生命周期过期)时发现的。评估基于 main 69fcf50cd,以及 #278 和 #281 的维护者集成分支;该分支尚未公开。 状态: 修复已通过审查,并已合入 main。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性审查,全部通过。尚未进入已打标的 SILO 发布。 简短结论 缺陷属实,并阻塞下一个版本。有三种操作会删除一个 …

  • 恢复副本:过期的是副本,不是对象

    发布于 设计

    设计生命周期分层存储数据安全

    恢复副本:过期的是副本,不是对象

    本文覆盖 issue #281 和 Denis Babchuk 提交的 PR #282,基于 main 69fcf50cd 评估。修复与多池生命周期修复(多池生命周期过期,#278)在同一个维护者集成 PR 中交付:贡献者提交原样保留,并附加下文所述的防护。本修复还依赖单池锁域修复,必须与它一起或在它之后合并。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复 …

    本文覆盖 issue #281 和 Denis Babchuk 提交的 PR #282,基于 main 69fcf50cd 评估。修复与多池生命周期修复(多池生命周期过期,#278)在同一个维护者集成 PR 中交付:贡献者提交原样保留,并附加下文所述的防护。本修复还依赖单池锁域修复,必须与它一起或在它之后合并。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复 …

  • 多池生命周期过期:按整个对象决策

    发布于 设计

    设计生命周期存储池数据安全

    多池生命周期过期:按整个对象决策

    本文覆盖 issue #278 和 Denis Babchuk 提交的 PR #279,基于 main 69fcf50cd 评估。修复将通过维护者集成 PR 合入:贡献者提交原样保留,并附加下文所述的维护者后续修正。恢复副本过期的修复(#281)在同一个集成 PR 中交付,另有单独记录。 状态: 修复的第一版通过了两轮维护者审查。随后对抗性审查要求修改,即修复方案中的第 6–9 部分。实现这些修改的补丁经过四轮审查后获得批准。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 …

    本文覆盖 issue #278 和 Denis Babchuk 提交的 PR #279,基于 main 69fcf50cd 评估。修复将通过维护者集成 PR 合入:贡献者提交原样保留,并附加下文所述的维护者后续修正。恢复副本过期的修复(#281)在同一个集成 PR 中交付,另有单独记录。 状态: 修复的第一版通过了两轮维护者审查。随后对抗性审查要求修改,即修复方案中的第 6–9 部分。实现这些修改的补丁经过四轮审查后获得批准。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 …

  • 大型单池集群的锁域

    发布于 设计

    设计锁存储运维

    大型单池集群的锁域

    本文覆盖在审查恢复副本修复(恢复副本:过期的是副本,不是对象)时发现的锁域缺陷,评估基线为 main 上的 69fcf50cd。目前尚未提交 issue。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性审查,全部通过。尚未合并或发布。 简短结论 锁域分裂是真实的,继承自上游 MinIO,并且只在一个池中的各纠删集并不使用相同主机时才存在。 …

    本文覆盖在审查恢复副本修复(恢复副本:过期的是副本,不是对象)时发现的锁域缺陷,评估基线为 main 上的 69fcf50cd。目前尚未提交 issue。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性审查,全部通过。尚未合并或发布。 简短结论 锁域分裂是真实的,继承自上游 MinIO,并且只在一个池中的各纠删集并不使用相同主机时才存在。 …

  • Heal 演练不能删除数据

    发布于 设计

    设计Heal数据安全运维

    Heal 演练不能删除数据

    本文覆盖 Jasper Bernhardt(@dihmandrake)提交的 PR #280 中与演练(dry run)相关的部分,基于 main 69fcf50cd 评估。同一个 PR 还让深度扫描并发校验一个对象的各块盘。这项优化另行评审,不在本文范围内。该 PR 尚未运行 CI。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性审查, …

    本文覆盖 Jasper Bernhardt(@dihmandrake)提交的 PR #280 中与演练(dry run)相关的部分,基于 main 69fcf50cd 评估。同一个 PR 还让深度扫描并发校验一个对象的各块盘。这项优化另行评审,不在本文范围内。该 PR 尚未运行 CI。 状态: 修复已通过审查,已在本地提交。它已和下个版本的其他修复放在同一个集成分支上一起测试:带 kqueue,dev 标签的本地完整测试套件、本地执行的 CI 竞态检测选集,以及针对修复之间相互作用的对抗性审查, …

  • Console 的桶配额:列表显示与数值校验

    发布于 设计

    DesignConsoleQuotaRetention

    Console 的桶配额:列表显示与数值校验

    本文覆盖 silo-console#72(在 Web Console 中设置的配额在桶列表里显示为短横线)和 silo-console#73(创建桶表单的数值校验)。评估基于修复之前的 Console 源码 3d264aea9,以及修复提交 a85665814 至 5a34232e7。 状态: 已随 Console 2.6.0 发布。修复提交已合入 Console main(PR #74,合并提交 3d1dd56eb,2026-11-04),之后又有数值相关的后续修复(PR …

    本文覆盖 silo-console#72(在 Web Console 中设置的配额在桶列表里显示为短横线)和 silo-console#73(创建桶表单的数值校验)。评估基于修复之前的 Console 源码 3d264aea9,以及修复提交 a85665814 至 5a34232e7。 状态: 已随 Console 2.6.0 发布。修复提交已合入 Console main(PR #74,合并提交 3d1dd56eb,2026-11-04),之后又有数值相关的后续修复(PR …

  • ILM 过期与存储池迁移顺序

    发布于 设计

    设计生命周期存储池复制

    ILM 过期与存储池迁移顺序

    本文记录 issue #265、贡献者修复 PR #266 与维护者后续修复 #276,并说明已经合入的 #264 与 #267 是相关前置修复。本文已于 2026-11-02 按 #276 合入后的 main 更新。#266 的 decommission 提交是 19910230a,rebalance 提交是 a995921e5。 更新(2026-11-06)。 生命周期删除不复制,S3 如此,SILO 的每个发布版本也是如此。#276 曾在 main 上短暂地让它们复制 …

    本文记录 issue #265、贡献者修复 PR #266 与维护者后续修复 #276,并说明已经合入的 #264 与 #267 是相关前置修复。本文已于 2026-11-02 按 #276 合入后的 main 更新。#266 的 decommission 提交是 19910230a,rebalance 提交是 a995921e5。 更新(2026-11-06)。 生命周期删除不复制,S3 如此,SILO 的每个发布版本也是如此。#276 曾在 main 上短暂地让它们复制 …

  • Tier free version 是内部清理记录

    发布于 设计

    设计Tier生命周期存储池兼容性

    Tier free version 是内部清理记录

    本文记录 issue #263 与 PR #264 的审查结论,本文已按 #276 后的 main 0fc5a0b5 更新;#264 的合入提交记录为 0cfca29c。这个 PR 的三个提交是一组相互配合的修复,不是三个互不相关的 workaround。 先说结论 问题成立。free version 是 SILO 在删除 tier 远端对象期间留在 xl.meta 中的内部清理记录。它带有 delete-marker 类型和被删除版本的时间,但它不是用户版本。GET 已经忽略它,若干批处理路径 …

    本文记录 issue #263 与 PR #264 的审查结论,本文已按 #276 后的 main 0fc5a0b5 更新;#264 的合入提交记录为 0cfca29c。这个 PR 的三个提交是一组相互配合的修复,不是三个互不相关的 workaround。 先说结论 问题成立。free version 是 SILO 在删除 tier 远端对象期间留在 xl.meta 中的内部清理记录。它带有 delete-marker 类型和被删除版本的时间,但它不是用户版本。GET 已经忽略它,若干批处理路径 …

  • 混合 EC 布局与迁移列表

    发布于 设计

    设计存储池纠删码迁移

    混合 EC 布局与迁移列表

    本文记录 issue #261 与 PR #262 的审查结论,本文已按 #276 后的 main 0fc5a0b5 更新。实际修复通过维护者 PR #267 合入,#262 是后来被取代的重复 PR。 先说结论 问题成立。一次成功的降级覆写可能让一个无版本对象同时存在两种 EC 布局:在线磁盘上有更新的副本,离线磁盘上保留旧副本。GET 与 ListObjectsV2 能选出更新的可读多数;decommission 与 rebalance 使用 all-versions 遍历,此时元数据合并可 …

    本文记录 issue #261 与 PR #262 的审查结论,本文已按 #276 后的 main 0fc5a0b5 更新。实际修复通过维护者 PR #267 合入,#262 是后来被取代的重复 PR。 先说结论 问题成立。一次成功的降级覆写可能让一个无版本对象同时存在两种 EC 布局:在线磁盘上有更新的副本,离线磁盘上保留旧副本。GET 与 ListObjectsV2 能选出更新的可读多数;decommission 与 rebalance 使用 all-versions 遍历,此时元数据合并可 …

  • 存储池迁移完整性审查:#261、#263 与 #265

    发布于 设计

    设计存储池生命周期兼容性

    存储池迁移完整性审查:#261、#263 与 #265

    本文审查 #261、#263、#265 及其对应的修复 #262、#264、#266,并记录维护者后续修复 #276。这是设计与审查记录,不是发布说明。本文已更新到 2026-11-02 的 #276 合入后 main。#264、#266、#276 已合入,#262 已被取代并关闭。 先看结论 问题 是否成立 对应 PR 的判断 建议处理 #261 成立。可读的混合 EC 对象可能从迁移列表消失,旧池删除后丢失。 窄范围修复已通过维护者 PR #267 合入;#262 已被取代。 已由 #267 …

    本文审查 #261、#263、#265 及其对应的修复 #262、#264、#266,并记录维护者后续修复 #276。这是设计与审查记录,不是发布说明。本文已更新到 2026-11-02 的 #276 合入后 main。#264、#266、#276 已合入,#262 已被取代并关闭。 先看结论 问题 是否成立 对应 PR 的判断 建议处理 #261 成立。可读的混合 EC 对象可能从迁移列表消失,旧池删除后丢失。 窄范围修复已通过维护者 PR #267 合入;#262 已被取代。 已由 #267 …

  • 多池删除:失败时保住最新副本

    发布于 设计

    DesignS3StoragePerformance

    多池删除:失败时保住最新副本

    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

    发布于 设计

    DesignS3StoragePerformanceReview

    多池覆盖亲和:为何最终没有采纳 #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 校验和复制:在初始化上传时保留类型

    发布于 设计

    DesignReplicationS3Checksum

    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 发布,共 …

  • LDAP 长 DN:恢复登录可用性并守住 IAM 撤销安全边界

    发布于 设计

    DesignLDAPIAMOperations

    LDAP 长 DN:恢复登录可用性并守住 IAM 撤销安全边界

    Server PR #250(合入提交 d43adc0f2,已随 Server 20261026 发布)修复了 LDAP 用户在规范化可分辨名称(Distinguished Name,DN)超过对象存储 IAM 后端单路径分量 255 字节上限时无法登录的问题,同时严格保留了对真实存储故障与持久化 IAM 撤销记录的 Fail-Closed 错误传播。 原始问题报告、初版补丁(9faeb7a11)及长 DN 回归测试由社区贡献者 @910patin 提交。在合并前的设计复核中,维护者进一步收窄了 …

    Server PR #250(合入提交 d43adc0f2,已随 Server 20261026 发布)修复了 LDAP 用户在规范化可分辨名称(Distinguished Name,DN)超过对象存储 IAM 后端单路径分量 255 字节上限时无法登录的问题,同时严格保留了对真实存储故障与持久化 IAM 撤销记录的 Fail-Closed 错误传播。 原始问题报告、初版补丁(9faeb7a11)及长 DN 回归测试由社区贡献者 @910patin 提交。在合并前的设计复核中,维护者进一步收窄了 …