组件版本
旧版分片列举设计已被覆盖 · Earlier multipart-listing designs superseded (2026-10-17)
中文: 本页保留的 #79 分片列举旧模式及预检、排空启用建议,已被最新设计决策(中文)覆盖,请参考新版设计。旧说明仍适用于其明确标注的已发布版本;统一持久列举已合入主干、尚未发布,不能据此认定现有二进制已改变。本提示只针对分片列举,不替代其他兼容性或 IAM 升级要求。
English: The earlier #79 listing-mode and preflight/drain enablement design retained here is superseded by the latest design decision (English). Dated instructions still describe their named releases. Unified persistent listing is merged into main but remains unreleased; existing binaries do not gain it from a documentation update. This notice concerns multipart listing only and does not replace other compatibility or IAM upgrade requirements.
Server 发布状态更新于 2026-10-15;其他组件身份核验于 2026-09-17。 SILO 的四个组件独立发布。依赖更新合入主分支,不会改变已经发布的二进制或镜像。
已发布组件
| 组件 | 发行版本 | 实际包含内容 |
|---|---|---|
| Server | 20261015 | 首次完整修复 SN-2026-015/016 对象锁问题;Go 1.27.2;pkg v3.14.1;上游 SDK 32e1f32cb176;mcli 20260916;内嵌 Console v2.4.1,源码 1360e26d976d |
| 独立 Console |
v2.4.1 | pkg v3.14.1;mcli 20260916;上游 SDK 32e1f32cb176;共享下载限制、流式 ZIP 与签名制品 |
| mcli | 20260916 | pkg v3.14.1;上游 SDK 32e1f32cb176;软件包版本 20260916000000.0.0 |
| 共享 pkg | v3.14.1 | 独立模块路径 github.com/pgsty/silo-pkg/v3;CopyObject 内嵌错误处理;JWX v3.3.0 字段名转义;上游 SDK 32e1f32cb176 |
发布说明:Server 20261015、 Console v2.4.1、 mcli 20260916、pkg v3.14.1。 内嵌部署需要在 Server 构建中显式选择 Console 与 MC。 软件包仓库镜像可能晚于 GitHub 更新;下载页直接链接已发布的制品。
独立 Console 镜像: 2026-09-17 匿名访问 docker.io/pgsty/silo-console 的 token 请求返回 HTTP 401,尚不能确认公开拉取。v2.4.1 的 GitHub 二进制、软件包和源码已发布;此限制不影响 Server 内嵌的源码选择。
Server 20261015 安全更新
Server 20261015 首次包含 SN-2026-015/016 对象锁问题的完整修复。请升级全部 Server 进程与接受 S3 写入的复制站点。该版沿用下列 Console、mcli、pkg 与上游 SDK 身份;这些组件无需为此次 Server 修复重新发布。Go 更新为 1.27.2,golang.org/x/net 更新为 v0.60.0。
本版同时包含 #233 旧元数据与扫描响应复用修复、#225 校验和错误文案对齐、#220 Lambda 目标集合判空修复。准确制品身份与验收结果见发布记录。升级不重写已有数据,生产部署仍需运维人员实际升级。
9 月 16 日依赖图
Console v2.4.1 选择以下已发布的 pkg 与 MC 源码, 各模块身份已通过公共 Go proxy 与校验和数据库验证。
- Console:
v0.0.0-20260916075814-1360e26d976d→1360e26d976d,标签v2.4.1。 - pkg:
v3.14.1→fa657ef431ae22e720df37e5144cf00f67102945。 - MC:
v0.0.0-20260916070421-e952aa78f10a→e952aa78f10a,标签RELEASE.2026-09-16T00-00-00Z。 - 上游 minio-go:
v7.3.1-0.20260915093545-32e1f32cb176。 - JWX / strfmt / React Router: v3.3.0 / v0.27.2 / v7.18.4。
Console 嵌入前端已按此依赖图重新构建。历史 Go 模块路径没有 /v2 后缀,
所以通过规范伪版本引用 Console。Server 嵌入方必须同时复制 Console 与 MC replacement,
见Console 集成说明。
升级前请检查密码权限迁移:
admin:ChangeMyPassword 与 admin:CreateUser 分别控制不同操作。
Server changelog 和下列源码链接
说明协调升级 Server 时涉及的存储、IAM 与 HTTP 变化。
存储、IAM 与 HTTP 修复
以下改动已随 Server 20260916 发布;Server 20260903 不包含这些修复。实现范围可通过所链接的 PR 与源码记录核对。
| 范围 | 已合并 PR | 运维可见行为 |
|---|---|---|
| 多池存储 | #188 #189 |
普通单对象版本 DELETE 协调各池副本,副本协调保留标签状态;移除可选的 GET 访问频率池间分层功能。 |
| 分片完成条件 | #190 | 前置条件使用所有池中的逻辑最新对象,避免旧副本接受过期 ETag,或拒绝当前 ETag。 |
| 分片发现与取消 | #198 | 跨 pool/set 发现持久上传,原生 marker 对应上传消失后仍能续页,取消需要多数盘确认。严格模式要求所有 writer 升级并排空旧上传,见升级契约。 |
| 普通条件 PUT | #207 | 公开写入条件使用所有池中的逻辑当前对象,包括正在退役或再平衡的池;可读性及目标版本行为变化见下文。 |
| IAM 撤销 | #191 #192 |
节点间删除通知重新加载已提交状态;持久化删除版本与撤销边界,防止旧站点事件重放恢复已撤销身份或旧授权。 |
| 删除标记清除 | eb4f5e5b3254b19ac0358ab38fb |
指定版本的清除不再在缺少该标记的盘上创建标记;对已缺失版本的重试须有写仲裁多数的缺失票才确认;heal 后的标记保留复制与清除元数据;排队中的标记创建任务在发送前先在复制锁内复核源端。剩余边界见下文、#217 与复制可靠性记录第三轮。 |
| 盘间分歧下的列举 | 8d06424b1 |
当更新的少数盘排在前面时,仍保留达到列举仲裁的 null 对象版本。滚动重启叠加并发覆盖写时,成功的 LIST 仍可能漏掉可读的 key;见下文、#218 与设计记录。 |
| 跨池迁移标签 | fced86303 |
rebalance 与 decommission 对普通和分片写入都把对象标签及其修订字段带到目标池。此前迁移已丢失的标签不会恢复;见多池对象一致性。 |
| 标签与删除标记 | #193 #196 |
SSE-KMS 复制保留标签修订时间;删除标签推进修订并抵御延迟事件;删除标记清除在 MRF 恢复时保留标记身份和重试状态。 |
| 复制元数据 | #194 | 恢复复制元数据时,不再把传输用的 aws-chunked 编码重新写入对象元数据。 |
| 请求头超时 | #196 | --read-header-timeout / MINIO_READ_HEADER_TIMEOUT 正确传入 HTTP 服务,对 HTTP/1 请求头设置绝对读取期限,持续少量发送字节也无法延长;正文保留既有滚动空闲超时。 |
升级与兼容性要求:
- IAM 要求所有参与服务器协调升级。 不支持共享 IAM 后端的新旧节点混用,也不支持滚动降级。备份完整 IAM 存储及所需加密材料,普通管理导出不包含删除历史。同名父身份重建前签发的旧凭据可能需要重新签发;升级前已经丢失的删除历史无法自动重建。具体操作见 IAM 升级与回滚说明。
- 不可读池会更一致地使写入、删除失败。 即使另一个池还能处理 GET/HEAD,只要任一池元数据不可读,条件式分片上传完成就会失败。普通版本 DELETE 在池不可读或清理失败时也返回错误;读取仲裁不足返回
503 SlowDownRead,应在恢复后重试。出站删除复制尚未完成时,请求成功不代表每块磁盘都已立即物理删除。 - Server 20260903 从未包含访问频率池间分层。 只有使用过该实验功能的构建需要按迁移说明清理配置和 XML。普通生命周期过期、远程层迁移、再平衡与池退役仍可使用。
- 清除操作的审计状态由
COMPLETE规范为COMPLETED。历史异常标签修订可能失败并重试,本次修复不会重建其历史。较短的请求头超时也会限制 TLS 握手读取窗口;它不会给 HTTP/1 上传、下载新增总时长限制。 - 带已记录标签修订的对象在显式 resync 或 heal 时每对象多一次元数据 COPY;当目的端按桶默认做 KMS 加密时,该复制会重写对象数据。带标签过滤的复制规则仍按删除后的(空)标签状态评估目标资格;任意站点时钟偏差不在修复后的顺序保证之内。复制双方必须都运行修复后的构建,墓碑才会被尊重——旧对端仍会丢弃空值修订。见复制标签排序。
R4–R8 集成记录保留了源码哈希、本地测试及验收边界。PR #196 合并前的 11 项检查全部通过;这些结果证明源码验收,不代表新版本发布或生产集群升级。
Console 分享下载
Console #56 与 Server #209 修复了 Console #52 报告的匿名代理边界问题。 代理只允许访问已配置 S3 源地址上的对象内容 GET,拒绝跳转、系统路径以及 通过查询参数选择的非下载操作。没有新增关闭分享的环境变量,正常公共对象、 预签名和版本下载继续可用,详见行为与设计权衡。
修复已随 Console v2.4.1 发布。 精确发布源码通过完整 CI 矩阵、漏洞检查与发布工作流;真实 API 和浏览器分享测试 覆盖独立与内嵌部署,实际下载的独立二进制也连接 SILO 测试服务通过了分享回归。
普通条件 PUT
#199 的跨 pool 条件 PUT 问题已在发布版 Server 20260903 上复现。
PR #207 的提交 4620be394b52 于 2026-09-16 通过全部 8 项 CI,
随后以 9b4ae82a29cc 合入。
修复已随 Server 20260916 发布。 具体行为如下:
- 普通多 pool
If-Match/If-None-Match条件使用所有池中的逻辑当前对象。 即使另一个池仍可处理 GET,只要无法核实某池元数据,条件写入就可能失败;读取仲裁不足返回 503,应恢复可读性或完成 heal 后重试。 - 请求指定目标
versionId时,公开写入条件仍比较当前对象,写入的目标版本保持请求指定的值; 内部复制保留按指定版本检查的语义。无条件 PUT 与单 pool 条件写入保持既有行为。 - 条件覆盖成功不会清理其他池中的旧副本,升级也不能恢复历史上已接受的覆盖。 仍沿用既有修改时间与 pool 排序,不新增全局时钟排序保证。
#190 的分片完成修复既未引入、也未修复此 PUT 问题。 最终打包候选及部署验收仍由 #203 单独跟踪。
仍待完成的工作
- 升级与存量准备: #200 跟踪 IAM 升级及恢复演练;#201 跟踪历史复制状态检查及修复验证。源码修复不会自动修复旧状态。
- 发布交付: #202 汇总说明和组件身份;#203 单独验收最终制品与多进程栈,发布制品和实际生产升级分别验收。
- 多站删除标记收敛:
254b19ac0的源端复核覆盖不了已经在网络上在途、或由另一站点重放的创建;多数确认的清除之后崩溃留下的少数标记副本,也没有证明持久的清理责任人。#217 跟踪接收端方案。清除修复的三站证据来自组合构建,不是最终 main;见设计记录。 - 滚动重启期间的列举: #239 承接 #218,对符合条件的最新对象分歧进行确认,区分真实删除与读取故障,并把最终错误传递到分页响应。不增加磁盘格式、客户端参数或迁移开关;最新设计与验收边界已覆盖早期调查中的方案说明。在运行包含此修复的正式版本之前,仍应避免在滚动重启期间使用会删除目标端对象的同步方式。源码合并不会自动更新已安装的二进制。
- 跨池迁移标签:
fced86303有单元与 race 覆盖,修复后的八节点 rebalance/decommission 验收尚未完成。此前迁移丢失的标签需要审计,不能默认仍在。 - 分片上传列表: #79 保留开放,继续跟踪容量、发布验收和迟到创建写入边界。PR #198 已修复持久发现、全局分页与静态残留取消确认,但没有新增创建屏障,也没有完成大规模扫描验收。临时 10,000 上传试验未达到暂定的单页五秒目标,见设计记录。
依赖与发布顺序
- 核验上游 SDK 提交与需要的修复,继续使用
github.com/minio/minio-go/v7;退役的silo-go不再属于维护依赖图。 - 验证并以
github.com/pgsty/silo-pkg/v3发布 pkg,同时提供迁移说明;通过 Go proxy 与校验和数据库解析标签。 - MC 更新到该 pkg/SDK,验证后发布日历标签的 mcli。Go 消费者引用其规范伪版本。
- Console 更新直接 pkg 依赖与 MC replacement,验证嵌入前端和集成;需要正式发布时单独发布 Console,也可明确选择已合入的不可变源码提交。
- Server 更新直接 pkg/SDK 依赖、两个 PGSTY replacement、客户端归档哈希、镜像和 Helm 客户端版本。验证完整依赖图后,再分别完成 Server 发布、镜像发布与集群升级。
Go 不继承依赖模块的 replace。即使 Console 已选择 MC,Server 仍必须显式选择受维护的 Console 与 MC。
Console 和 MC 保留历史 MinIO 模块路径,pkg 直接使用自己的路径。
colorjson/dperf 带入的旧 minio/pkg/v3 传递依赖与维护中的策略实现相互独立。
Server 20261015 使用 Go 1.27.2,9 月版栈使用 Go 1.27.1;pkg 保留 Go 1.26 库兼容下限,并通过 Go 1.26.8 race 测试。 Go x/* 依赖已刷新。go-systemd 实际仍选 v22.6.0,因为 v22.7.0 在 NetBSD 编译失败; Console 保留 tablewriter v0.0.5 replacement 以兼容所用 MC API。这些是有原因的兼容性固定版本。
其他依赖按具体 CVE/BUG 更新,不机械追逐新主版本。 9 月 13 日 Go 扫描没有发现可达或已导入的易受攻击包,但未使用的 OpenPGP 代码仍有模块级 GO-2026-5932 告警。 可达性扫描通过,不等于整个依赖图没有任何漏洞通告。
正式支持的集成对象是协调后的 PGSTY 栈;与原版上游 MinIO/MC 和其他 S3 实现的兼容属于尽力保留。
9 月 16 日 Server 源码核对补充
Server 20260916 源码 2a4d51406b7e 已选择 pkg v3.14.1、上游 minio-go 32e1f32cb176、Console v2.4.1 源码 1360e26d976d 和 MC e952aa78f10a(mcli 20260916)。正式 Server 标签为 RELEASE.2026-09-16T00-00-00Z,包版本 20260916000000.0.0。
- 分段列表经 #213 保持 legacy 默认;strict 仅由
MINIO_API_MULTIPART_LISTING进程环境显式启用并重启,不支持共享动态配置键。严格取消的多数确认也只用于 strict。见设置参考与升级契约。 - 多池对象一致性、条件删除与 Object Lock 复制排序区分逻辑当前对象、指定版本与持久化锁。
- 联邦 CopyObject和 SSE-C 副本完整性记录明文字节校验、复制加密与历史对象限制。
- IAM 持久撤销与桶配置收敛分别说明协调升级、删除历史及默认关闭的
MINIO_SITE_REPLICATION_METADATA_TOMBSTONES。 - 请求头超时与 Go 1.27 TLS/OIDC说明各自范围。
- 九月安全纪事列出 SN-2026-012/013/014 及不同组件的发布边界。
相关 Server 后续修复均未进入 20260903;文章中的原有 Object Lock 修复及其它已发布前置项按各自明确的版本记载。
最后的存储修复还包括 fced86303 的迁移标签保留、8d06424b1 的 null 版本 quorum,以及 eb4f5e5b3 / 254b19ac0 / 358ab38fb 的版本 purge、标记元数据和排队创建修复。仍需注意 #217 的迟到创建/崩溃残留和 #218 的重启期间列表遗漏。
10 月 15 日源码验收
已随 Server 20261015 发布;Server 20260916 不包含。
PR #233 已以
d94b3b3c9251
合入,修复旧版 xl.meta 头部复用时的缺失字段残留,并使扫描更新与最终缓存保持互斥。
存储格式、RPC 字段与依赖版本均未变化。问题与修复说明
记录了确定性回归测试、双进程扫描验证、合并后 CI 和运维核验方法。
该源码修复已包含在 Server 20261015 中;正式制品发布不代表生产集群已经升级。
20261015 之后的 Server 修复
以下修复面向下一次 Server 发布,未包含在 RELEASE.2026-10-15T00-00-00Z 中。
源码合并不会更新已安装的二进制或容器镜像。
- PR #232 将最终写入提交时暂存
xl.meta缺失,与客户端上传不完整、对象不存在区分开。PUT 和分片上传完成操作在该提交失败时 返回 HTTP 503SlowDownWrite,存储 RPC 和修复路径也保留这一错误分类。 客户端是否重试仍取决于 SDK 策略;该修复不会恢复已丢失的暂存数据,也不保证重试成功。 - PR #236 优先解析分片上传目录原生的明文时间戳,
再尝试已有的 Base64 兼容路径,避免不必要的本地
xl.meta读取。合法明文 UUID 恰好 能被 Base64 解码时,也能正确走快速路径。旧格式或无法识别的目录名仍回退读取元数据。 存储格式、S3 上传 ID 和清理配置均不变:默认过期时间为 24 小时,默认扫描间隔为 6 小时。 - PR #243 于 10 月 17 日合入,统一公开分片 列表为持久扫描并退役迁移开关。确认可读且两个身份字段都不存在的历史上传逐条省略, 非法元数据或扫描覆盖不足仍报错,默认 Abort 可用性得到保留。重复扫描成本、容量 限制和取消后的迟到创建仍属于明确边界,见设计决策。