Repository navigation
Releases: erikwang2013/oss
Release list
v1.28.5
v1.28.5(2026-11-01)
性能与 CI 加固版。无 API、配置、Wire/OSSCTL 或数据格式变更,可从 v1.28.0–v1.28.4 直接替换升级。
性能与内存
- DeleteObjects:账户、桶策略、会话策略与表三档权限改为请求级预加载,逐 key 只做策略求值,消除 1000 键场景的重复 SQL/JSON 解析。
- 对象/版本列表:按 32 条批量并发读 xl.meta;单节点多盘读、集群 peer fan-out 并发,保持顺序、分页、去重和 delete marker 语义。
- 健康/指标探测:peer 探测并发,3 个 peer 不可达时最坏等待从约 2.4s 降到约 800ms。
- 索引:新增 0012 迁移,补复制积压版本链、站点目标清理与审计过滤索引;启动重放幂等。
- aether ingest:8 permit 信号量限制并发阻塞摄取,避免大上传收尾占满阻塞执行线程。
- sync:直接流式发送已 fsync 的 tee,不再整对象
fs::read进内存;SigV4 复用 staging SHA-256。
CI / 发布
- CI 加入 rust-cache、45 分钟超时、并发取消、
--locked、--no-fail-fast。 - 新增
scripts/release.sh prepare|check与 57 项发布自检,覆盖版本锚点、changelog、sitemap、社交图与 lockfile。
升级
从 v1.28.0–v1.28.4 直接替换二进制即可;新增的 0012 迁移只建索引,无数据迁移。发布仍为源码归档,无预编译二进制。
验证结果
- GitHub Actions CI(手动触发,commit
0c7d639):rust 与 web 均通过。 - 本地:xl-store lib 383/0;observability 4/0;aether 7/0;sync_gate 38/0;DeleteObjects 4/0;旧库升级 1/0;clippy/fmt 通过;release 自检 57/0。
v1.28.4
v1.28.4(2026-11-01)
补丁版。仅测试稳定性修复;无功能、配置、Wire/OSSCTL 或数据格式变更,可从 v1.28.0–v1.28.3 直接替换升级。
变更
raft_access的 AP/OLAP 缓存断言改为等待 apply 后的异步副作用完成(最多 10s),避免慢盘 CI 在last_applied已推进、缓存重载尚未完成时误判。- 目标用例
ap_and_olap_writes_route_one_command_and_refresh_caches连跑 10 次通过。 - 包含 v1.28.3 的 OLAP 流式输入超限修复(400
EntityTooLarge)。
升级
从 v1.28.0 / v1.28.1 / v1.28.2 / v1.28.3 直接替换二进制即可;无新增配置项,无数据迁移。发布仍为源码归档,无预编译二进制。
验证结果
- GitHub Actions CI(手动触发):rust 与 web 均通过。
v1.28.3
v1.28.3(2026-11-01)
补丁版。修复 OLAP 变换流式输入超限的错误映射;无配置、Wire/OSSCTL 或数据格式变更,可从 v1.28.0–v1.28.2 直接替换升级。
修复
- OLAP 输入上限:变换读取流式请求体超限时,
http_body_util::Limited返回LengthLimitError,原先只识别已缓冲 body 的BodySizeLimitExceeded,导致 500。现两者都映射为 400EntityTooLarge,与 DeleteObjects 的请求体上限处理一致。 - 本地
cargo test -p xl-s3 --test olap_ops19/0;cargo fmt --all --check通过。 - v1.28.2 的桶配额并发测试夹具修复仍包含在本版本中。
升级
从 v1.28.0 / v1.28.1 / v1.28.2 直接替换二进制即可;无新增配置项,无数据迁移。发布仍为源码归档,无预编译二进制。
验证结果
- GitHub Actions CI(手动触发):rust 与 web 均通过。
- 另有一个仅测试的异步缓存等待修复提交在主分支
c6c38a0,不改变二进制或发布内容。
v1.28.2
v1.28.2(2026-11-01)
补丁版。无功能、配置、Wire/OSSCTL 或数据格式变更,可从 v1.28.0 / v1.28.1 直接替换升级。
修复
- 修复 v1.28.1 CI 暴露的桶配额并发测试夹具:并发创建 3 个桶时,被配额拒绝的不一定是
r-0;测试原先固定重建r-0,会随机得到QuotaExceeded。现收集实际创建成功的桶名,再验证满配额下重建放行。 - 本地
cargo test -p oss-server --test raft_accounts6/0;目标用例连续运行 5 次均通过;cargo fmt --all --check通过。 - v1.28.1 的功能内容与 v1.28.2 相同;v1.28.2 仅修正测试夹具。
升级
从 v1.28.0 或 v1.28.1 直接替换二进制即可;无新增配置项,无数据迁移。发布仍为源码归档,无预编译二进制。
后续
该版本 CI 暴露的 OLAP 流式输入超限错误映射问题由 v1.28.3 修复;请使用 v1.28.3。
v1.28.1
v1.28.1(2026-11-01)
补丁版。无功能、配置、Wire/OSSCTL 或数据格式变更,可从 v1.28.0 直接替换升级。
修复与工程
- CI:安装
protobuf-compiler,workspace 测试可在 GitHub Actions 正常构建。 - 测试夹具:xl-s3 最小配额夹具把缺失
users表识别为测试环境,lock_ops恢复 6/0。 - 测试收紧:AWS 端点测试补充断言;mixed-MPU e2e 修复 shell 局部变量。
- 文档:删除历史计划与 SDD 日志,只保留中英文 README、规范文档(
docs/superpowers/specs)与站点;同步更新全部文档、站点与社交预览图。
验证
- 本地
cargo test -p xl-s3 --test lock_ops:6/0。 - workspace 全量测试由手动触发的 CI 复核。
升级
从 v1.28.0 直接替换二进制即可;无新增配置项,无数据迁移。发布仍为源码归档,无预编译二进制。
后续
该版本 CI 暴露的桶配额并发测试夹具与 OLAP 流式超限错误映射问题分别由 v1.28.2、v1.28.3 修复;请使用 v1.28.3。
v1.28.0
v1.28.0
升级与安全加固版:Raft 日志格式标记与旧区间有界压缩,M8 follower restore 以 applied 行自身 fence_term 收口,AP 新增直连 mTLS 与 AWS PrivateLink API 验证,CMK 支持离线全量迁移回 legacy provider,Level C 只读排空,JWT 多密钥轮换,feature 9 提供 opt-in 复制用量账本(严格硬配额),并补上真实 v1.26.0 蓝绿、MPU 排空与单机→集群 e2e。
新增
- Raft 日志加固:
raft_meta.raft_log_format记录日志格式(缺失/1= 旧格式,2= 压缩/分段;更高或无法解析的值 fail-closed)。v1.27 建库但尚无标记的库,open 时若发现z1:行或分段即在同一BEGIN IMMEDIATE事务内补写2;append每次最多做两段有界压缩(最新连续段 + 一段更旧区间,各 ≤1024 行/16 MiB),旧区间不会永久停滞;20k entry soak 通过。 - M8 Restore fencing:follower 发起的
TierRestoreDelete在UNFENCED(term 0)时不再盲删,改用本地 applied 行自身的fence_term作为 token;行缺失时不 append(由 leader reaper 收敛),apply 端按fence_term <= token幂等删除。新增 3-voterraft_restore_failover演练。 - AP 端点身份:新增
OSS_AP_ENDPOINT_VERIFIER=mtls与aws-api。mtls把 rustls 握手已验证的客户端叶证书 SHA-256 经ApConnInfo映射到端点,配置OSS_AP_MTLS_ENDPOINTS=<sha256>=<vpce>[=<vpc>[=<account>]];...(重复指纹/畸形 ID 拒绝启动);aws-api用 SigV4 调 EC2DescribeNetworkInterfaces/DescribeVpcEndpoints,按直连源 IP 解析 ENI→VPC endpoint(唯一命中且State=available),源 IP+60s TTL 缓存,API 错误 fail-closed;要求 NLB/网关保留客户端源 IP,可选OSS_AP_VPC_ID/OSS_AP_AWS_ACCOUNT_ID交叉校验。 - CMK→legacy 迁移:
oss-server cmk rewrap --name <cmk> --to-legacy sse-s3|sse-kms [--apply]把引用该 CMK 的对象版本逐版本全量重加密为 pre-CMK provider(sse-s3file key,或sse-kms默认环当前k<n>)。在扫描/写入前 fail-closed 拒绝在途 MPU、桶默认引用与缺失目标 provider;每个版本独立重加密,绝不自动删除 CMK。旧文档中「不能迁移到 legacy」的说法已更正:现在可以显式离线迁移,但 meta-only 降级仍不可能。 - Level C 只读排空:顶层
read_only = true让节点从客户端写路径摘除;写请求返回 503 并带x-oss-read-only: 1,GET/HEAD/OPTIONS、精确POST /api/v1/login、健康/指标与 Raft RPC 保持可用,/health/cluster暴露read_only。 - JWT 密钥轮换:
jwt_previous_secrets接受旧签名密钥数组(每项 ≥32 字节、互不重复且不同于jwt_secret);验证阶段多密钥共享黑名单与过期检查。轮换顺序:把当前密钥加入jwt_previous_secrets→ 全部节点重启 → 切换jwt_secret→ 全部节点重启 → 12 小时后移除旧密钥。登录限流与审计仍为节点本地。 - 严格硬配额(feature level 9):新增
AccountUsageReserve/AccountUsageRelease/AccountUsageAdjust复制账户用量账本(account_usage_ledger,OSSCTL3 快照ControlData携带);[quota].strict = true(或OSS_ACCOUNT_QUOTA_STRICT=1)时 xl-s3 的 Put/Complete/Copy 经 Raft 预留,删除/失败释放或校准,判定只读复制后的账本。默认仍为各节点account_usage本地缓存(30s 惰性/60s 采样、有界陈旧),非严格模式行为不变。Raft 模式要求[raft].feature_level = 9,全 peer 生效 9 才可 append;level <9 快照装到已有账本行的库会拒绝。严格模式是保守口径:首次触达按 leader 本地缓存播种(最旧 60s)、未知长度 Put 写后校准可短暂超额、版本定向/SSE-C 删除不释放、预留后崩溃留账、命令非幂等且结果不明 fail-closed 不重试;会多记/阻塞至人工对账。 - 升级与运维:
tests/e2e_blue_green.sh用真实 v1.26.0 → 当前二进制在同一数据目录切换并验证冷备回滚(22/22 PASS);scripts/mpu-drain.sh列出/中止在途 MPU(只处理未完成上传,绝不删除已提交对象),自检 43/0;tests/e2e_single_to_cluster_real.sh用两个回环服务器跑 plan/copy/verify/resume(6/6 PASS);upgrade-preflight.sh自检 109/0、blue-green-preflight.sh自检 78/0。混合 v1.16 MPU e2e(tests/e2e_mpu_mixed.sh)已编写但未执行。
兼容性 / 升级前置
- Raft 日志格式是单向门:新二进制写过格式
2后旧二进制无法读取;升级仍按停写蓝绿执行,回滚只在未发生新格式/CMK 写入时成立。日志格式没有 feature-level 门控。 - CMK 迁移守卫:
--to-legacy仅在离线 CLI、非集群([cluster]/[stretch]会拒绝)下可用;迁移前必须 Complete/Abort 全部 MPU、把桶默认加密切到目标 provider,并确认目标 provider 已配置。迁移不删除 CMK;meta-only 降级仍不可能;回滚到 pre-CMK 二进制必须完成全量迁移或迁移到新集群。 - 只读排空:
read_only只约束新二进制。旧二进制没有该开关,混版窗口内必须由 LB/客户端移除旧节点的写流量;不能把只读开关当作跨版本写保护。 - JWT 轮换:多节点必须逐台重启,旧密钥保留至少 12 小时;登录限流与审计仍按节点本地,不做集群级复制。
- 严格硬配额(feature 9):opt-in,默认关闭;Raft 模式要求全集群
[raft].feature_level = 9且所有 peer 生效 9,旧节点会在 append 前被拒。账本命令非幂等,append 结果不明时写入 fail-closed 且不重试;版本定向/SSE-C 删除不释放、预留后崩溃留账、首次触达播种最旧 60s、未知长度写后校准可短暂超额。启用后不要按本地缓存口径对账;自动对账/存量精确迁移未交付。 - OSSCTL3 快照:feature 9 账本行随快照复制;level <9 快照装到本机已有账本行的库会拒绝安装(避免整表替换静默丢用量),需要先按 level 9 恢复或人工导出账本。
- 真实 AWS PrivateLink 验收:
aws-api只用本地 mock 覆盖签名请求形状、响应解析、状态判定与缓存;上线前必须在真实 AWS 账号中验证,并确认 NLB/网关保留客户端源 IP。 - 混合 v1.16 MPU e2e 未执行:受宿主 I/O 饱和影响,v1.16 二进制未能构建,
tests/e2e_mpu_mixed.sh未运行;不得据此宣称混合版本 MPU 通过。
验证
wave-5 分套件闸门:
raft::store26/0(含 20k entry soak、格式 marker 回归、旧区间压缩、未知格式 fail-closed)。xl-s3ap 37/0、m8_ap_trust22/0、ap_aws4/0。xl-storecmk 23/0、CLI 18/0。read_only2/0、config 1/0;jwt_rotation4/0、config 2/0。- lib restore 3/0、
raft_restore_failover1/0、restore/lease 3/0。 - feature 9:lib
quota2/0、accounts --testquota 7/0、raft_quota_ledger4/0、snapshot 18/0、compat 20/0;xl-s3 lib 通过(未单独计数);合并后oss-server --lib279/0。 - 脚本:蓝绿 e2e 22/22 PASS、
mpu-drain.sh自检 43/0、upgrade-preflight109/0、blue-green-preflight78/0;单机→集群真实 e2e 6/6 PASS。
完整 cargo test --workspace 未在宿主高负载下聚合运行,发布以分 crate/分套件闸门为准。
仍未交付
- 严格配额账本的自动对账/存量精确迁移:feature 9 已提供 opt-in 复制账本,但严格模式会多记/阻塞至人工对账(首次触达播种最旧 60s、未知长度写后校准可短暂超额、版本定向/SSE-C 删除不释放、预留后崩溃留账、命令非幂等且结果不明不重试);默认硬配额仍为 30s/60s 有界陈旧本地缓存。
- 集群级登录限流与审计复制:两者按设计保持节点本地,JWT 轮换不改变这一点。
- 真实 AWS PrivateLink 端到端验收:仅 mock 测试,需要真实 AWS 账号并保留客户端源 IP。
- 混合 v1.16 MPU e2e 执行:脚本已编写,v1.16 二进制在宿主负载下构建失败。
- 任意双向混写:不打补丁的旧二进制无法安全写新数据;安全运维模型是只读排空 + 从 LB 移除旧节点。
- 集群在线 CMK→legacy 迁移:
--to-legacy是离线 CLI,[cluster]/[stretch]配置会拒绝。 - 站点部署凭据:仓库没有 deploy target,线上站点为人工 VPS 发布。
- Raft 日志格式的 feature-level 门控:当前只能按停写蓝绿约束。
v1.27.0
v1.27.0
分布式存储与升级安全版:feature level 8 交付账户硬配额配置与动态 VPC 端点注册表,跨版本 MPU 增加 wire-1 有界回退,Level C 落地 Ext 类型能力协商,AP 增加 attested-proxy 端点身份,Raft 快照分块与日志压缩/分段,并补上停写蓝绿升级闸门与单机→集群工具。
新增
- feature level 8:
AccountHardQuotaSet让 Raft 模式的账户硬配额配置(PUT /accounts/{id}/hard-quota)不再 501;VpcEndpointUpsert/VpcEndpointDelete把动态 VPC 端点注册表纳入 OSSCTL3 快照,新增管理员/api/v1/vpc-endpoints列表/注册/删除。全 peer ≥8 才启用,旧节点单向门。 - 跨版本 MPU:wire-1 属主走有界回退——预落盘、5 GiB 上限、本地 MD5 与属主 ETag 核对后经既有 UploadPart RPC 转发(v1.16+);裸 UUID 上传的 ListParts/Complete/Abort 归属发现与 Complete 幂等重放;≤v1.15 无 MPU RPC,明确不支持。
- Level C:Ext 类型能力协商(
x-oss-raft-ext-types握手头;leader 在 append 前按REGISTERED_EXT_TYPES与全体当前 voter/learner 宣告集双重校验;成员变更 preflight 拒绝缺类型节点);在途 MPU 的sse_kind计入 CMK 引用,cmk scan --json暴露mpu_references,删除守卫在引用归零前拒绝。生产REGISTERED_EXT_TYPES仍为空,任意双向混写未支持。 - AP 端点身份:新增可插拔
EndpointIdentityVerifier与trusted-proxy验证器;attested-proxy由可信网段内终止 mTLS/PrivateLink 的代理签发 HS256 短期 JWT(vpce/vpc/account/iat/exp),服务端验签、校验时效、要求可信直连 peer 并核对声明;证据写入审计,registry 检查不放宽。配置:OSS_AP_ENDPOINT_VERIFIER=attested-proxy、OSS_AP_ATTESTATION_SECRET(≥32 B)、OSS_AP_TRUSTED_PEER_CIDRS、OSS_AP_ATTESTATION_MAX_AGE_SECS(默认 60)。 - Raft 存储:快照 >256 KiB 分块(旧整行透明读);日志 ≥1024 B entry 压缩为
z1:,append 事务内把连续 ≥256 条压成raft_log_segment,读/truncate/purge 透明合并/切分;写事务先读后写改用BEGIN IMMEDIATE,修复 WAL 下并发 apply 的 BUSY_SNAPSHOT 误报。 - 运维与升级:
upgrade-preflight.sh新增--health-json(强制data_wire_version >= 2、data_plane_compatible: true)与--require-no-mpu(任一在途 MPU 即 BLOCK);新增只读blue-green-preflight.sh(冷备非空、旧服务仍响应即 BLOCK、新二进制版本校验、输出停写蓝绿手册与回滚边界);新增oss-server --version/-V。 - 单机→集群工具:
single-to-cluster.sh支持 plan/resume/verify、include/exclude 桶过滤、versioned/object-lock fail-closed 与 JSON 输出;新增single-to-cluster-verify.sh与网络无关自检。
兼容性 / 升级前置
- feature 8 是单向门:v1.26.0 及更早节点 advertise ≤7,全集群升级并移除/升级旧节点前 effective 停在 7,
AccountHardQuotaSet/VpcEndpoint*在 append 前被拒。配置[raft].feature_level=8后逐节点重启。 - Raft 日志新格式单向:新二进制写过压缩/分段日志后,旧二进制无法读取(fail-closed);数据面升级按停写蓝绿执行,写后不可回退。快照格式仍为 OSSCTL3,旧整行快照透明读回。
- CMK 激活为不归点:DARE AAD 绑定
key_id,不存在 meta-only 降级;cmk rewrap只能在同一 CMK 内升版本。回滚到 pre-CMK 二进制需要完整重加密或迁移到新集群,绝不删除 CMK 强降。 - ≤v1.15 不支持跨版本 MPU:v1.16+ 走有界回退/wire-2 流式;升级/降级前必须 Complete/Abort/排空在途 MPU,并用
upgrade-preflight.sh --require-no-mpu --health-json强制门槛。 - 真实 PrivateLink/mTLS 端点身份未实现:attested-proxy 依赖可信网段内的终止代理与共享密钥;没有“证书→vpce”注册表,不把“有证书”当成“是该端点”,也不伪造 AWS API 身份。
验证
cargo fmt --all --check、clippy -p oss-server -p xl-store -p xl-s3 --all-targets -D warnings通过。- 合并后
oss-server --lib265/0、xl-s3 --lib202/0、xl-store --lib376/0/1。 - 集成:
m8_ap_trust18/0、raft_cutover7/0、raft_inventory_replication12/0、raft_jobs_replication11/0、raft_lifecycle_cursor_replication8/0、raft_restore_lease_replication3/0。 - 脚本自检:
upgrade-preflight109/0、blue-green-preflight78/0;真实二进制--version输出oss-server 1.27.0。 - 完整
cargo test --workspace未在宿主高负载下聚合运行,发布以分 crate/分套件闸门为准。
仍未交付
任意双向混写、CMK→legacy 全量迁移、真实 AWS PrivateLink/mTLS 证书映射、≤v1.15 MPU、Raft 日志格式的 feature-level 门控(当前按停写蓝绿约束)。
v1.26.0
v1.26.0
控制面与租户硬化版:feature level 7 交付 tier restore 后续状态复制与调度租约,账户硬字节/对象数配额与 legacy 账户规范化 worker 落地,并补齐流式读、缓存、审计与复制的一批数据面优化。
新增
- M8 feature level 7:
TierRestoreUpsert/TierRestoreDelete复制 tier restore 后续状态(restored/清理/回滚),leader 切换不再丢在途 Restore 状态;ScheduleLeaseAcquire实现调度租约 acquire/renew/takeover(TTL 默认 30s,OSS_SCHEDULE_LEASE_SECS),job worker、inventory、lifecycle 与 tier sweep 统一经租约 fencing。apply 幂等、fence 单调;快照仍为 OSSCTL3,无迁移。 - 账户硬配额:账户当前版本字节数与对象数上限;Put/Complete/Copy 写入前单条条件 UPDATE 原子预留,Delete/DeleteObjects 释放;跨节点用量按 30s 惰性/60s 采样(mesh 合并列举),对端不可达时只按已知下界拒绝、未知增量 fail-open,DB 错误 fail-closed。
PUT /accounts/{id}/hard-quota在 standalone 生效。 - legacy 账户规范化 worker:serve 启动后 leader 门控补齐账户/成员行;standalone 单事务 + marker(失败回滚),Raft leader 复用既有
AccountCreate/AccountMemberAttach。 - 流式 GET 批量读:远端 EC 分片按
OSS_SHARD_READ_BATCH_BYTES(默认 1 MiB,上限 16 MiB)一次读取多块,显著减少 RPC;CRC32C、加密 unit 解密与明文 SHA-256 语义不变。 - 缓存与保留:MPU 索引增加
OSS_MPU_INDEX_TTL_SECS(默认 300s)并收敛clean/加载竞态;0009为terminal_jobs_before增加(state, updated_at)索引;/metrics导出oss_audit_dropped_total。 - 桶复制:支持
Prefix/Tag/And过滤器与回读归一化;复制体改为 256 KiB 分块令牌桶,跨请求共享远端配额。
兼容性 / 启用前置
- feature 7 是单向门:v1.25.0 及更早节点 advertise ≤6,全集群升级并移除/升级旧节点前 effective 停在 6,
TierRestore*/ScheduleLeaseAcquire在 append 前被拒。配置[raft].feature_level=7后逐节点重启;快照仍为 OSSCTL3。 - 硬配额配置暂仅 standalone:Raft 模式
PUT /accounts/{id}/hard-quota返回 501,待复制命令;限额已写入后配额执行在集群生效。用量为有界陈旧(30s/60s),未知 content-length 与版本定向删除依赖采样器收敛。 - Tag 复制规则不复制删除事件:删除请求没有标签快照,规则会跳过删除(代码已标
shortcut:);Prefix 规则行为不变。 - 远端分片批量读的单次缓冲上限 16 MiB,与 mesh
MAX_BLOCK_READ对齐;MPU 索引 TTL 到点后首次列举会增加一次桶目录扫描。
验证
cargo fmt --all --check、五 crateclippy --all-targets -D warnings通过。- 合并后
xl-store --lib369/0、xl-s3 --lib194/0、oss-server --lib248/0;raft_command_contract3/0/1。 - Agent 套件:复制 35/0、账户 12/0、3-voter restore/lease 3/0、observability 4/0;新增流式批量读、并行写、MPU TTL、保留索引与配额边界测试。
- 完整
cargo test --workspace在宿主高负载下未完成,本次发布以分 crate/分套件闸门为准。
仍未交付
Raft 模式硬配额配置命令、follower Restore 清理的即时 fencing、Level C 双向混写与数据面滚动、跨版本 MPU、AP 动态 registry(需 feature 8)、真实 PrivateLink、单机→集群工具化、Raft 日志/快照增量存储。
v1.25.0
v1.25.0
性能与安全硬化版:全对象 GET 流式直出、列举键缓存、分片并行写、异步审计队列、feature level 6 作业历史保留,并合入一轮授权/DoS/运维审计修复。
新增
- 全对象 GET 流式直出:无 Range 的 GET 在 EC 形态按 64 KiB 块、旧 parts 按文件块直出;加密对象按 unit 解密(至多缓存一个 unit),内存不再随对象大小增长。逐片 CRC32C 与流末明文 SHA-256 终验;首字节前探测数据片,缺失回退受
OSS_MAX_BUFFERED_GET_BYTES约束的重建;开流后缺失/短读报错,绝不跳字节。Range/partNumber 仍有界缓冲,CopyObject 源读取同样流式。 - 列举键缓存与在途 MPU 索引:每节点按桶懒加载键集,每批 1024 键;
OSS_KEY_CACHE_MAX_KEYS/OSS_KEY_CACHE_MAX_TOTAL_KEYS默认各 200 万、OSS_KEY_CACHE_TTL_SECS默认 300;超限或加载失败回退逐页扫描。在途 MPU 索引按 create/abort/complete 增量维护,clean回收暂存区后同步失效。 - 分片并行写:同一块编码后的本地盘/远端 RPC 分片写并发执行,单片失败只作废该片,quorum 计数不变;断电注入测试保留逐片顺序路径。
- 异步审计队列:有界 4096 行,单 worker 每 100 ms 或 256 行批量事务落库;队列满时丢弃并计数(首次/每 1000 条告警),审计不阻塞也不改变请求结果。仅 serve 路径挂 worker,测试与离线命令保持同步直写。
- feature level 6
JobPurge:终态作业按OSS_JOB_RETENTION_DAYS(默认 30,0 关,上限 3650)由 leader 每小时最多 10×1000 批清理;只删done/error/cancelled,同事务清inventory_runs/tier_restores/parent_job_id引用,queued/running/preempted永不删除。
修复
- S3 授权与策略:补全 Select/加密/通知/复制/策略/ListBuckets 等操作授权映射;未映射操作与无桶会话 fail-closed;桶/会话策略 Deny 优先语义覆盖新操作;
ListBuckets仅返回有权限的桶。 - DoS 与输入边界:登录用户名/口令长度上限与通用 400;Argon2id 改为信号量限流的异步卸载;CopyObject 预 HEAD 上限;列举
OSS_LIST_MAX_KEYS;GET 条件判断与 body 使用同一次 meta 读取,消除 TOCTOU。 - 运维与部署:Docker secret 目录/文件权限 0700/0600、
.dockerignore、JWT 占位密钥 fail-closed、Compose 健康检查与监听端口环回;Web 控制台懒路由、无限分页与 Playwright 临时数据隔离。
验证
cargo fmt --all --check、workspace 五 crateclippy --all-targets -D warnings通过。xl-store --lib363/0、xl-s3 --lib189/0、object_ops57/0、oss-server --lib240/0、raft_command_contract3/0/1。policy_audit2/0、m8_ap23/0、m8_ap_trust9/0、m8_batch20/0、m8_inventory23/0、console_api33/0;raft_jobs_activation4/0、raft_runstate_snapshot14/0、raft_cutover_provenance6/0、raft_handshake2/0、kill91/0。
兼容性 / 启用前置
- feature 6 是单向门:v1.24.0 及更早节点 advertise ≤5,全集群升级并移除/升级旧节点前 effective 停在 5,
JobPurge在 append 前被拒;marker 6 后旧二进制按既有守卫拒绝启动。快照仍为 OSSCTL3,无新格式与 schema 迁移。 - 流式 GET 不改变 Range/partNumber 语义;EC 数据片缺失时整读重建仍受
OSS_MAX_BUFFERED_GET_BYTES限制。 - 键缓存是 advisory:TTL 内可能看不到带外写入,默认 300 秒重建;超限桶回退逐页扫描。
- 审计为 best-effort:队列满会丢行并计数,落库延迟至多约 100 ms。
仍未交付
tier restore 后续状态与 schedule lease/takeover、硬字节/对象数配额、真实 PrivateLink 身份、AP 动态 registry(需 feature level 7)、完整数据面滚动升级。
v1.24.0
v1.24.0
M8-2 运行态复制继续推进:inventory 与 lifecycle 游标纳入 Raft,作为 feature level 5。
新增
- inventory 运行态复制(feature 5):
inventory_runs/inventory_cursors/inventory_incremental经 level-5 Raft 命令复制;leader 读改写经门面,follower fail-closed;整批只读预检、零写Conflict、状态/水位单调;独立m8_inventory_activated标记,配置 5 首次激活要求三表为空。 - lifecycle 游标复制(feature 5):
lifecycle_cursors经 level-5 命令复制,真实 sweep 走门面;首次 feature-5 激活清理 v1.23.0 遗留本地游标(重扫安全)。 - 桶删除一致性:桶删除只经 apply 的
delete_bucket_cascade同事务级联 inventory/tier 行,移除服务节点本地直删;follower 转发一致、同run_key重建 id 不复用。
修复
sync_gate删桶 quiesce 用例的固定 sleep 改为轮询本地deleting标志,消除高负载 flake。- lifecycle 内嵌的旧本地游标在 feature-5 激活时清理,避免副本旧
updated_at导致持续Conflict。
验证
- 合并后
cargo test -p oss-server:70 suites / 0 failed;clippy-D warnings、fmt 0。 - 新增
raft_inventory_replication12、raft_lifecycle_cursor_replication8,均含 3-voter 收敛/leader 死亡/feature 4 拒绝/契约 fixture。
兼容性 / 启用前置
- feature 5 是单向门:v1.23.0(feature 4)及更早节点不会收到 Inventory*/Lifecycle* 命令,也不会解码;启用前必须全集群升级并移除/升级旧节点,再显式配置
[raft].feature_level=5并逐节点重启。marker 5 后旧二进制按既有守卫拒绝启动。 - 旧本地 inventory/lifecycle 历史不迁移:v1.23.0 的本地行在 feature-5 首次激活被拒绝(inventory)或清理(lifecycle 游标,重扫安全);需保留的 inventory 数据人工另存/重跑。
- 快照仍为 OSSCTL3
m8.runstate,无新格式。
仍未交付
schedule lease/takeover、tier restore 后续状态、硬字节/对象数配额、真实 PrivateLink 身份、AP 动态 registry(需 feature ≥6)。