Skip to content

Releases: erikwang2013/oss

v1.28.5

Choose a tag to compare

@erikwang2013 erikwang2013 released this 01 Nov 11:54

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

Choose a tag to compare

@erikwang2013 erikwang2013 released this 01 Nov 06:46

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

Choose a tag to compare

@erikwang2013 erikwang2013 released this 01 Nov 05:36

v1.28.3(2026-11-01)

补丁版。修复 OLAP 变换流式输入超限的错误映射;无配置、Wire/OSSCTL 或数据格式变更,可从 v1.28.0–v1.28.2 直接替换升级。

修复

  • OLAP 输入上限:变换读取流式请求体超限时,http_body_util::Limited 返回 LengthLimitError,原先只识别已缓冲 body 的 BodySizeLimitExceeded,导致 500。现两者都映射为 400 EntityTooLarge,与 DeleteObjects 的请求体上限处理一致。
  • 本地 cargo test -p xl-s3 --test olap_ops 19/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

Choose a tag to compare

@erikwang2013 erikwang2013 released this 01 Nov 04:00

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_accounts 6/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

Choose a tag to compare

@erikwang2013 erikwang2013 released this 01 Nov 03:25

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

Choose a tag to compare

@erikwang2013 erikwang2013 released this 31 Oct 18:48

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-voter raft_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 调 EC2 DescribeNetworkInterfaces/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-s3 file 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::store 26/0(含 20k entry soak、格式 marker 回归、旧区间压缩、未知格式 fail-closed)。
  • xl-s3 ap 37/0、m8_ap_trust 22/0、ap_aws 4/0。
  • xl-store cmk 23/0、CLI 18/0。
  • read_only 2/0、config 1/0;jwt_rotation 4/0、config 2/0。
  • lib restore 3/0、raft_restore_failover 1/0、restore/lease 3/0。
  • feature 9:lib quota 2/0、accounts --test quota 7/0、raft_quota_ledger 4/0、snapshot 18/0、compat 20/0;xl-s3 lib 通过(未单独计数);合并后 oss-server --lib 279/0。
  • 脚本:蓝绿 e2e 22/22 PASS、mpu-drain.sh 自检 43/0、upgrade-preflight 109/0、blue-green-preflight 78/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

Choose a tag to compare

@erikwang2013 erikwang2013 released this 31 Oct 09:30

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 --lib 265/0、xl-s3 --lib 202/0、xl-store --lib 376/0/1。
  • 集成:m8_ap_trust 18/0、raft_cutover 7/0、raft_inventory_replication 12/0、raft_jobs_replication 11/0、raft_lifecycle_cursor_replication 8/0、raft_restore_lease_replication 3/0。
  • 脚本自检:upgrade-preflight 109/0、blue-green-preflight 78/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

Choose a tag to compare

@erikwang2013 erikwang2013 released this 30 Oct 20:35

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、五 crate clippy --all-targets -D warnings 通过。
  • 合并后 xl-store --lib 369/0、xl-s3 --lib 194/0、oss-server --lib 248/0;raft_command_contract 3/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

Choose a tag to compare

@erikwang2013 erikwang2013 released this 30 Oct 17:51

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 五 crate clippy --all-targets -D warnings 通过。
  • xl-store --lib 363/0、xl-s3 --lib 189/0、object_ops 57/0、oss-server --lib 240/0、raft_command_contract 3/0/1。
  • policy_audit 2/0、m8_ap 23/0、m8_ap_trust 9/0、m8_batch 20/0、m8_inventory 23/0、console_api 33/0;raft_jobs_activation 4/0、raft_runstate_snapshot 14/0、raft_cutover_provenance 6/0、raft_handshake 2/0、kill9 1/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

Choose a tag to compare

@erikwang2013 erikwang2013 released this 29 Oct 22:55

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_replication 12、raft_lifecycle_cursor_replication 8,均含 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)。