Skip to content

[Paper/M1][P0] Add revision-addressable tree backends and immutable SnapshotId semantics #42

Description

@Ivanbeethoven

Parent research epic: #39

背景

当前 worktree API 能记录 base_revision,但 lower tree 仍主要通过 path 查询当前服务端视图。系统无法证明绑定 revision 与实际可见文件树一致,也无法可靠地让 revision A 和 revision B 同时挂载。

目标

将 Dicfuse lower 的身份从:

(store_root, base_path)

升级为:

(repository_id, root_tree_oid, base_path, storage_schema_version)

revision 名称只用于解析,真正的数据身份必须落到不可变 commit/tree OID。

Proposed API

#[derive(Clone, Eq, Hash)]
pub struct SnapshotId {
    pub repository_id: String,
    pub revision_oid: String,
    pub root_tree_oid: String,
    pub base_path: String,
}

#[async_trait]
pub trait RevisionBackend {
    async fn resolve_revision(
        &self,
        repository: &str,
        revision: &str,
    ) -> Result<SnapshotId>;

    async fn list_tree(
        &self,
        tree_oid: &str,
    ) -> Result<Vec<TreeEntry>>;

    async fn get_blob(
        &self,
        blob_oid: &str,
    ) -> Result<Bytes>;
}

优先按 tree OID 遍历,不依赖会随 branch 移动的 path-only API。

Tasks

  • 引入 SnapshotIdRevisionBackend
  • 提供 mock/in-memory backend,支持完整 CI;
  • 提供 Mega HTTP backend;
  • 定义 Mega 侧 revision-addressable API contract;
  • 修改 Dicfuse 构造函数,使 snapshot 在 mount 对外可见前完成解析;
  • DicfuseManager cache key 纳入 SnapshotId
  • immutable snapshot 禁止 TTL 自动刷新到最新 branch;
  • 保留显式 mutable/latest compatibility mode,但不能用于论文主路径;
  • mount status 返回 resolved revision 和 root tree OID;
  • health/capability 增加 snapshot.v1
  • 更新 state file schema 与 migration;
  • 为 A/B 两个 revision 并存增加集成测试;
  • 为 branch 移动但旧 workspace 不变化增加回归测试。

Acceptance Criteria

  • revision A 挂载后,即使远端 branch 前进到 B,A 的可见树仍不变化;
  • A 和 B 可以同时挂载,并正确显示各自 snapshot identity;
  • 相同 (repository, tree_oid, base_path) 返回同一个共享 lower identity;
  • 不同 tree OID 永远不会误复用同一个 mutable metadata namespace;
  • daemon restart 后能恢复相同 snapshot;
  • 所有 tree/blob 数据都可追溯到 SnapshotId;
  • path-only 最新视图不能伪装成 immutable snapshot;
  • 文档明确 revision label、commit OID 和 root tree OID 的区别。

Paper Correctness Test

创建 revision A/B,其中同一路径内容不同。挂载 A 后移动 branch,再并发创建 B。验证:

workspace-A always reads A
workspace-B always reads B
shared equal blobs are physically stored once after Issue 4

Relevant Files

src/dicfuse/manager.rs
src/dicfuse/store.rs
src/dicfuse/mod.rs
src/daemon/antares.rs
docs/worktree-api.md
docs/worktree-state-transitions.md

Dependencies

Issue 1 用于观测;Issue 2 用于 correctness/performance harness。


Activity

Sign up for free to join this conversation on GitHub. Already have an account? Sign in to comment

Metadata

Metadata

Assignees

No one assigned

    Type

    No type

    Projects

    No projects

      Relationships

      None yet

      Development

      No branches or pull requests

      Issue actions