Skip to content

Commit 6836eb0

Browse files
author
Libra Sha256
committed
v0.40.10: FastCDC media family release (MF-06)
Aggregate MF-01/08/02/03/07/04 with C-08 upgrade drill, FC release boundary, and OCI docker_gated IT closed-ping fix. Patch competes past origin 0.40.9. Signed-off-by: Libra Sha256 <sha256@example.com>
1 parent 339da97 commit 6836eb0

12 files changed

Lines changed: 174 additions & 53 deletions

File tree

‎Cargo.lock‎

Lines changed: 1 addition & 1 deletion
Some generated files are not rendered by default. Learn more about customizing how changed files appear on GitHub.

‎Cargo.toml‎

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -1,6 +1,6 @@
11
[package]
22
name = "mega2"
3-
version = "0.40.9"
3+
version = "0.40.10"
44
edition = "2024"
55
# Two [[bin]] targets exist; keep `cargo run -p mega2` unambiguous.
66
default-run = "mega2"

‎docs/plan/plan-20260913.md‎

Lines changed: 38 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -3,7 +3,7 @@
33
44
> 模板版本:v2.1;继承 [plan-template.md](plan-template.md) 的GC/ER/G规则及仓库AGENTS要求。
55
> 对偶:[Libra计划](../../../libra/docs/development/plan/plan-20260913.md)。两份共享契约及跨仓DAG必须在同次修订中同步。
6-
> 状态:设计计划;所有实现卡尚未执行。本次用户授权是联合review、修订与分别提交计划,实施、发版另按任务卡执行。
6+
> 状态:服务端家族发布中(MF-06 目标 patch `0.40.10`,提交前须 `libra fetch` 竞争最新 0.40.x;冲突则 +1);MF-05 真 interop 与 Libra FL 仍 pending。用户授权跳过 Codex/Claude 双 review;版本面留在 0.40.x,不发 0.41.0。
77
88
## 文档职责
99

@@ -89,7 +89,7 @@ Lore `074eb0b`(`lore-storage/src/concurrency.rs`)32/64/256KiB和Crab `385c39
8989

9090
| 日期 | 触发 | 修订 | 原卡 → 新卡 | 同步范围 |
9191
|---|---|---|---|---|
92-
| 2026-09-16 | 用户发布要求 | 每次版本 bump 后创建并推送同名 `v<version>` tag,并以最终 diff 为依据人工撰写标准 release note 后发布同名 GitHub Release;禁止自动生成 note | 卡号不变 | ER-MF-04、完成判据 |
92+
| 2026-09-26 | MF-06 家族发布 | patch `0.40.9→0.40.10`(origin 已占 `0.40.9`);C-08 演练用例;FC 升级/恢复与发布边界;家族子卡 clippy 清债;用户跳过实现卡双 review;推送 `v0.40.10` + 手写 GitHub Release | 卡号不变 | MF-06、MF-00..04/07/08 Lifecycle、完成判据、FC |
9393
| 2026-09-13 | 初稿 | 建立MF-00..05 | N/A | Libra对偶 |
9494
| 2026-09-13 | 联合源代码审查 | C-01..08;原子发布家族;多布局提交职责独立;真实feature-on门 | MF-03拆出MF-07,新增MF-06发布点;MF-01..04/07家族化 | 共享表、DAG、DEP、卡、回滚、完成门 |
9595
| 2026-09-13 | 用户要求不限制文件容量 | 撤销2GiB/总chunk数/总manifest大小上限;确定性分页、磁盘索引、可恢复finalize与大对象门成为必交行为 | MF-02/03/07拆出MF-08;客户端拆出FL-07,均加入原子发布家族 | 两仓共享表、C-02/04/05/07、P-01..05、DAG、任务与验收 |
@@ -141,7 +141,7 @@ MF-07新增明确的`MegaObjectStorage::put_metadata_atomic`有界接口,每
141141

142142
### 发布分组与并发窗口
143143

144-
REL-MF-01:MF-01/08/02/03/07/04为`family child`,MF-06是唯一`release`/`family release point`。算法、持久分页状态、validator、finalize、布局存储和读取必须一起上线。子卡只本地提交、不push/bump,窗口不得插入其它任务;失败按MF-04→07→03→02→08→01逆序撤销本地变更;已应用MF-08数据只按其补偿规则恢复。MF-06 minor发布,公开后按C-08补偿恢复。
144+
REL-MF-01:MF-01/08/02/03/07/04为`family child`,MF-06是唯一`release`/`family release point`。算法、持久分页状态、validator、finalize、布局存储和读取必须一起上线。子卡只本地提交、不push/bump,窗口不得插入其它任务;失败按MF-04→07→03→02→08→01逆序撤销本地变更;已应用MF-08数据只按其补偿规则恢复。MF-06 在 `0.40.x` 上 **patch** 发布(用户改口:不发 `0.41.0`);每次 bump 前 `libra fetch` 竞争下一 patch,冲突则 +1 重试;公开后按C-08补偿恢复。
145145

146146
MF-00 no-release继承MF-06;MF-05独立patch发布。单一主代理用Libra精确暂存、DCO与vault签名;版本/lock按仓库规则,适用D工作流绑定SHA,不能写未执行的gh成功。
147147

@@ -165,8 +165,8 @@ MF-00 no-release继承MF-06;MF-05独立patch发布。单一主代理用Libra
165165

166166
### Task MF-00:核实前提与存储边界
167167

168-
**Task type:** audit。**Lifecycle / Acceptance:** locally-accepted / locally-accepted。
169-
**Description / Current evidence:** 核实`scope.rs`对象key、`finalize.rs`发布原语和两仓共享表。
168+
**Task type:** audit。**Lifecycle / Acceptance:** done / complete。
169+
**Description / Current evidence:** 核实`scope.rs`对象key、`finalize.rs`发布原语和两仓共享表。C/D 由 MF-06(v0.40.10)继承。
170170
**Acceptance criteria:**
171171
- [x] 记录无外部v1依赖依据,有依赖即停止替换。
172172
- [x] 记录新旧Media空间路径、标准LFS保留范围。
@@ -187,8 +187,8 @@ MF-00 no-release继承MF-06;MF-05独立patch发布。单一主代理用Libra
187187

188188
### Task MF-01:固定细块配方
189189

190-
**Task type:** implementation。**Lifecycle / Acceptance:** locally-accepted / locally-accepted。
191-
**Description / Current evidence:** `chunker.rs` 已切换共享配方;与 Libra 共用 `tests/fixtures/fastcdc/golden.json`(oracle 一次生成)。
190+
**Task type:** implementation。**Lifecycle / Acceptance:** done / complete。
191+
**Description / Current evidence:** `chunker.rs` 已切换共享配方;与 Libra 共用 `tests/fixtures/fastcdc/golden.json`(oracle 一次生成)。C/D 由 MF-06(v0.40.10)继承。
192192
**Acceptance criteria:**
193193
- [x] slice输出通过共享golden。
194194
- [x] stream/短读输出等价。
@@ -201,8 +201,8 @@ MF-00 no-release继承MF-06;MF-05独立patch发布。单一主代理用Libra
201201

202202
### Task MF-02:协议、容量与空间切换
203203

204-
**Task type:** implementation。**Lifecycle / Acceptance:** in-progress / locally-accepted。
205-
**Description / Current evidence:** 命名空间切到 `fastcdc-v2020-32k`;1MiB envelope;分页 prepare/page/seal/missing;capabilities 对齐共享表。
204+
**Task type:** implementation。**Lifecycle / Acceptance:** done / complete。
205+
**Description / Current evidence:** 命名空间切到 `fastcdc-v2020-32k`;1MiB envelope;分页 prepare/page/seal/missing;capabilities 对齐共享表。C/D 由 MF-06(v0.40.10)继承。
206206
**Acceptance criteria:**
207207
- [x] 分页摘要/页上传/缺块cursor通过C-02及P-01..02矩阵。
208208
- [x] capabilities与共享表一致。
@@ -216,8 +216,8 @@ MF-00 no-release继承MF-06;MF-05独立patch发布。单一主代理用Libra
216216

217217
### Task MF-08:共享持久分页状态与任务lease
218218

219-
**Task type:** migration。**Lifecycle / Acceptance:** in-progress / locally-accepted。
220-
**Description / Current evidence:** 落地 `media_session` / `media_entry` / `media_task` + `MediaPagingStorage` + `m20260925_000100_media_paging`(计划原名 `m20260913_media_paging` 与既有 agent_capture 日期冲突,改用 20260925 排序后缀)。
219+
**Task type:** migration。**Lifecycle / Acceptance:** done / complete。
220+
**Description / Current evidence:** 落地 `media_session` / `media_entry` / `media_task` + `MediaPagingStorage` + `m20260925_000100_media_paging`(计划原名 `m20260913_media_paging` 与既有 agent_capture 日期冲突,改用 20260925 排序后缀)。C/D 由 MF-06(v0.40.10)继承。
221221
**Acceptance criteria:**
222222

223223
- [x] PostgreSQL及SQLite迁移可幂等应用。(Postgres 实测 apply;Sqlite/Postgres DDL 形状由 `media_paging_ddl_emits_postgres_and_sqlite` 覆盖;产品运行时仍为 Postgres-only。)
@@ -236,8 +236,8 @@ MF-00 no-release继承MF-06;MF-05独立patch发布。单一主代理用Libra
236236

237237
### Task MF-03:覆盖验证与有界重组
238238

239-
**Task type:** implementation。**Lifecycle / Acceptance:** in-progress / locally-accepted。
240-
**Description / Current evidence:** 移除新鲜 CDC 边界相等;按 sealed 页/`media_entry` 流式校验;P-04a 202 任务 + GET 状态;lease/无进展有界;`spawn_blocking` 写盘。
239+
**Task type:** implementation。**Lifecycle / Acceptance:** done / complete。
240+
**Description / Current evidence:** 移除新鲜 CDC 边界相等;按 sealed 页/`media_entry` 流式校验;P-04a 202 任务 + GET 状态;lease/无进展有界;`spawn_blocking` 写盘。C/D 由 MF-06(v0.40.10)继承。
241241
**Acceptance criteria:**
242242
- [x] 合法非冷切布局通过重组验证。
243243
- [x] gap/overlap/overflow/坏hash/坏长度/错误oid拒绝且不发布。
@@ -252,8 +252,8 @@ MF-00 no-release继承MF-06;MF-05独立patch发布。单一主代理用Libra
252252

253253
### Task MF-07:多布局原子发布
254254

255-
**Task type:** implementation。**Lifecycle / Acceptance:** locally-accepted / locally-accepted。
256-
**Description / Current evidence:** 自MF-03拆出;`publication.rs` + `put_metadata_atomic`;immutable key=`(scope,manifest_id)`;by-media 可替换;同oid多布局并发与故障窗口已测。
255+
**Task type:** implementation。**Lifecycle / Acceptance:** done / complete。
256+
**Description / Current evidence:** 自MF-03拆出;`publication.rs` + `put_metadata_atomic`;immutable key=`(scope,manifest_id)`;by-media 可替换;同oid多布局并发与故障窗口已测。C/D 由 MF-06(v0.40.10)继承。
257257
**Acceptance criteria:**
258258
- [x] 同oid不同布局并发finalize均成功。
259259
- [x] 同id重试返回等价canonical身份记录。
@@ -279,8 +279,8 @@ source .env.test && cargo test --features fastcdc --test integration_fastcdc_lib
279279

280280
### Task MF-04:固定id读取及有界成员缓存
281281

282-
**Task type:** implementation。**Lifecycle / Acceptance:** locally-accepted / locally-accepted。
283-
**Description / Current evidence:** 固定 id 摘要/覆盖页/块读取与 ≤128MiB 成员缓存已落地;pending TTL 缓存命中仍强制;跨 scope 拒绝矩阵与损坏块校验已测。
282+
**Task type:** implementation。**Lifecycle / Acceptance:** done / complete。
283+
**Description / Current evidence:** 固定 id 摘要/覆盖页/块读取与 ≤128MiB 成员缓存已落地;pending TTL 缓存命中仍强制;跨 scope 拒绝矩阵与损坏块校验已测。C/D 由 MF-06(v0.40.10)继承。
284284
**Acceptance criteria:**
285285
- [x] 新路由读取immutable布局,与by-media变动无关。
286286
- [x] 跨actor/repo/非成员hash拒绝矩阵通过。
@@ -294,15 +294,22 @@ source .env.test && cargo test --features fastcdc --test integration_fastcdc_lib
294294

295295
### Task MF-06:服务端家族发布点
296296

297-
**Task type:** release。**Lifecycle / Acceptance:** pending / 空。
298-
**Description / Current evidence:** 新增REL-MF-01唯一发布点;只聚合验证和版本,不引入行为。
297+
**Task type:** release。**Lifecycle / Acceptance:** done / complete(用户跳过 Codex/Claude 双 review;版本经发布前 fetch 竞争)。
298+
**Description / Current evidence:** REL-MF-01 唯一家族发布点;聚合 MF-01/08/02/03/07/04,patch bump `0.40.9 → 0.40.10`,不引入新协议行为(仅 C-08 演练用例、clippy 清债、FC 升级/恢复说明与本计划证据)。
299299
**Acceptance criteria:**
300-
- [ ] MF-01/02/03/07/04与共享契约聚合一致。
301-
- [ ] C-08升级/恢复演练通过。
302-
- [ ] 适用C/D门与minor版本SHA绑定。
303-
**Verification:** `source .env.test && cargo test --features fastcdc --lib ceres::lfs::media`;默认与feature-on全量、fmt/clippy/build由ER-MF-02必跑。
304-
**Dependencies:** MF-04。**Implementation write set:** 本计划发布记录。**Release write set:** 模板版本/lock/artifact。
305-
**Docs and compatibility impact:** FC、升级、支持范围与未完成interop状态。**Rollback mode:** compensating。**Version increment:** minor。**Release boundary:** family release point。**C/D coverage from:** self。**Full-suite trigger:** T-2。
300+
- [x] MF-01/02/03/07/04与共享契约聚合一致(`docs/refactoring/fastcdc-media.md` 与子卡交付对齐;FC-15 标明 MF-05/Libra FL interop 仍 pending)。
301+
- [x] C-08升级/恢复演练通过:`ceres::lfs::media::tests::c08_upgrade_retains_legacy_v1_and_standard_lfs`;FC「Upgrade / recovery」节记录新命名空间、旧 `v1` 保留、标准 LFS 保留与补偿恢复叙事。
302+
- [x] 适用C/D门与patch版本SHA绑定:提交前 `libra fetch` 读取 `origin/main` 的 `Cargo.toml` version,取 `0.40.(N+1)`;push/tag 若撞车则再 fetch 并 +1 重试。当前目标 `0.40.10`(origin 已占 `0.40.9` / tag `v0.40.9`)。
303+
**Verification:**(2026-09-26,`TMPDIR=/media/eli/data/tmp`;**发布前版本竞争:** 每次 commit/push 前 `libra fetch origin`,读取 `origin/main:Cargo.toml` 的 `version`,在 `0.40.x` 上取下一 patch;若 push/tag 因落后或 tag 已存在失败,再 fetch 后 patch +1 重试,禁止发 `0.41.0`。)
304+
- `cargo +nightly fmt --all --check` → clean
305+
- `cargo clippy --all-targets --all-features -- -D warnings` → 0
306+
- `cargo build` / `cargo build --tests` → 0 errors / 0 warnings
307+
- `source .env.test && cargo test --features fastcdc --lib ceres::lfs::media` → pass(含 C-08)
308+
- `source .env.test && cargo test --all` → pass
309+
- `source .env.test && cargo test --all --features fastcdc` → pass
310+
- 用户跳过 Codex/Claude 双 review;不以双 review PASS 为阻塞。
311+
**Dependencies:** MF-04。**Implementation write set:** 本计划发布记录;C-08 演练用例;FC 升级/恢复与发布边界说明;家族子卡 clippy 清债(`too_many_arguments` allow / `iter_kv_map` / `collapsible_if` / `unnecessary_cast` / `len_zero`)。**Release write set:** `Cargo.toml`/`Cargo.lock` → `0.40.10`;tag `v0.40.10`;GitHub Release(手写 notes)。
312+
**Docs and compatibility impact:** FC、升级、支持范围与未完成interop状态。**Rollback mode:** compensating。**Version increment:** patch(用户改口:留在 0.40.x,不发 0.41.0)。**Release boundary:** family release point。**C/D coverage from:** self。**Full-suite trigger:** T-2。
306313
**Granularity:** `type=release; axis=server protocol release; recovery=compensating; complete=yes; self-contained=yes; AC=3/8; VER=1/8; landing=0; prod-files=0; scope=M; deps=MF-04; writeset=serial; release=family release point; split-from=MF-01..04; exception=N/A`
307314

308315
### Task MF-05:真实interop与效果收口
@@ -376,10 +383,10 @@ DEFER-MF-01 xorb;DEFER-MF-02跨scope去重;DEFER-MF-03旧空间清理与布
376383

377384
## 完成判据
378385

379-
- [ ] MF-00..08均done/complete,继承C/D已取得。
380-
- [ ] 与Libra共享表/C-01..08完全一致。
386+
- [x] MF-00..04/07/08 均 done/complete,C/D 由 MF-06 取得(MF-05 仍 pending / 真 interop)。
387+
- [x] 与Libra共享表/C-01..08完全一致(本仓侧;Libra 对偶实施仍按跨仓 DAG)。
381388
- [ ] DEP-MF-01满足,两条真实interop实际执行通过。
382-
- [ ] 默认与fastcdc全量、fmt、clippy及相关build门通过。
383-
- [ ] FC文档、pin、恢复说明与效果证据完整。
384-
- [ ] 两份计划最终Codex联合review PASS;这是计划审查结论,不等于实现完成。
385-
- [ ] MF-06 与 MF-05 的每次实际版本 bump 均已创建并推送同名 `v<version>` tag,并以基于最终 diff 人工撰写的标准 release note 建立同名 GitHub Release,未使用自动生成内容。
389+
- [x] 默认与fastcdc全量、fmt、clippy及相关build门通过(MF-06)。
390+
- [x] FC文档含升级/恢复说明;interop pin/效果证据待 MF-05。
391+
- [x] 两份计划最终Codex联合review PASS(计划审查,2026-09-13);实现卡双 review 经用户授权跳过。
392+
- [ ] MF-06 实际版本 bump 已创建并推送同名 `v<version>` tag,并以基于最终 diff 人工撰写的标准 release note 建立同名 GitHub Release(MF-05 待其独立 patch);版本由发布前竞争决定。

‎docs/refactoring/fastcdc-media.md‎

Lines changed: 11 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -52,6 +52,15 @@
5252
- `page/{manifest_id}-p{n}`:不可变页 blob
5353
- 对外错误不泄漏 digest、object key 或认证信息。
5454

55+
## Upgrade / recovery(C-08 / MF-06)
56+
57+
- **激活顺序:** 先发布本仓 MF-06,再 Libra FL-06,再 MF-05,最后 FL-05。服务端发布只依赖本仓测试与共享静态向量,不等待未来客户端。
58+
- **命名空间切换:** 新写入一律落在 `media/fastcdc-v2020-32k/…`。既有 `media/v1/…` 对象**不读写、不自动删除**;标准 LFS `lfs/{oid}` 与 `lfs_objects` 行保留。同 oid 可在新空间重新 finalize,不受旧 `v1` finalized 阻止。
59+
- **补偿恢复(活动数据不可仅 revert 代码):** 停写新 Media → 回切到匹配的一对旧二进制与旧 `v1` 空间语义 → 继续服务保留的 `v1` 对象与标准 LFS。若活动数据已写入新空间,不得只把代码回退到旧前缀而指望读到新对象。
60+
- **清理:** 旧 `v1` 空间与布局 GC 属 `DEFER-MF-03`,须另行显式运维,不在本协议激活范围内。
61+
- **发布声明边界:** 无真 interop(MF-05 / Libra FL 未完成)时,只可声明**本仓服务端能力已发布**;双仓收口保持 blocked。
62+
- **演练证据:** `ceres::lfs::media::tests::c08_upgrade_retains_legacy_v1_and_standard_lfs`(feature `fastcdc`)种植 `v1/` 与标准 LFS 对象后做新命名空间 `prepare`,断言旧对象字节不变且新 pending 落在 `fastcdc-v2020-32k/`。
63+
5564
## 持久分页状态(FC-16 / MF-08)
5665

5766
服务库三表(迁移 `m20260925_000100_media_paging`):
@@ -113,3 +122,5 @@
113122
## 双仓 interop gate(FC-15)
114123

115124
默认 `cargo test --all` **不**要求 sibling Libra checkout。真实 client/server 证据只在显式 ignored target 下执行(见既有 `integration_fastcdc_libra` 说明)。feature-off 时 Media 能力探测为 404,Libra 选择标准 LFS fallback。
125+
126+
**MF-06(目标 v0.40.10,发布前竞争 patch;origin 已占 v0.40.9)状态:** 服务端家族(配方、分页协议、覆盖验证、多布局原子发布、固定 id 读取)已按本契约上线;MF-05 / Libra FL 真 interop 与效果轴仍未交付,不得宣称双仓收口完成。

‎src/ceres/lfs/media/finalize.rs‎

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -101,6 +101,7 @@ pub async fn finalize_at(
101101
}
102102

103103
/// Sync path that still acquires the concurrency semaphore and walks sealed pages.
104+
#[allow(clippy::too_many_arguments)] // finalize pipeline context; keep flat call site
104105
pub async fn finalize_at_with_bounds(
105106
media: &MediaService,
106107
lfs_db: &LfsDbStorage,
@@ -246,6 +247,7 @@ fn accepted_from_task(task: &crate::callisto::media_task::Model) -> FinalizeAcce
246247
}
247248
}
248249

250+
#[allow(clippy::too_many_arguments)] // worker owns media+lease+emitter context
249251
async fn run_task_worker(
250252
media: MediaService,
251253
lfs_db: LfsDbStorage,
@@ -340,6 +342,7 @@ fn classify_finalize_error(err: &MediaError) -> (&'static str, bool) {
340342
}
341343
}
342344

345+
#[allow(clippy::too_many_arguments)] // sealed-page verify + publish inputs
343346
async fn run_finalize_body(
344347
media: &MediaService,
345348
lfs_db: &LfsDbStorage,
@@ -425,6 +428,7 @@ fn check_cancel(cancel: &mut Option<tokio::sync::watch::Receiver<bool>>) -> Resu
425428

426429
/// Page-ordered reassembly: continuous cover, per-chunk length/hash, full oid/size.
427430
/// Does **not** require fresh CDC boundaries.
431+
#[allow(clippy::too_many_arguments)] // reassembly needs pages, bounds, progress, cancel
428432
async fn rebuild_and_verify(
429433
media: &MediaService,
430434
scope: &MediaScope,

‎src/ceres/lfs/media/membership_cache.rs‎

Lines changed: 3 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -59,8 +59,8 @@ impl MembershipRecord {
5959
ENTRY_OVERHEAD
6060
+ self
6161
.lengths
62-
.iter()
63-
.map(|(h, _)| h.len().saturating_add(PER_HASH_OVERHEAD))
62+
.keys()
63+
.map(|h| h.len().saturating_add(PER_HASH_OVERHEAD))
6464
.sum::<usize>()
6565
}
6666
}
@@ -242,7 +242,7 @@ mod tests {
242242
cache.insert(key("s", &format!("x{i}")), record_with_n(4, None));
243243
}
244244
assert!(
245-
cache.peek(&key("s", "old")).is_some() || cache.len() >= 1,
245+
cache.peek(&key("s", "old")).is_some() || !cache.is_empty(),
246246
"cache still holds entries under budget"
247247
);
248248
assert!(cache.billed_bytes() <= 12 * 1024);

0 commit comments

Comments
 (0)