Skip to content

[Paper/M1][P0] Add copy-up provenance and a deterministic per-workspace delta manifest #49

Description

@Ivanbeethoven

Parent research epic: #39

背景

当前 changed-path 查询需要扫描 upper/CL 目录。随着生成文件和修改数量增加,该操作会反复遍历本地树;同时系统没有在首次 copy-up/delete 时稳定记录 lower object identity,难以进行精确冲突检测、选择性 commit cleanup 和确定性重建。

目标

为每个 workspace 维护事件驱动的 UpperManifest

struct DeltaEntry {
    path: RelativePath,
    kind: Added | Modified | Deleted | Renamed | MetadataChanged,
    base_snapshot: SnapshotId,
    base_object_oid: Option<ObjectId>,
    current_content_oid: Option<ObjectId>,
    mode: Option<u32>,
    source_path: Option<RelativePath>,
    manifest_generation: u64,
}

manifest 存放于 daemon 控制目录,不放入用户可见 upper namespace。

Tasks

  • 为 OverlayFS 操作增加 observer/hook;
  • 首次 copy-up 时记录 base snapshot 和 base object OID;
  • whiteout/delete 时记录被删除对象 OID;
  • rename 记录 source/destination provenance;
  • symlink、chmod、truncate、hardlink 等语义明确记录;
  • manifest 更新与对应 upper mutation 保证 crash-safe;
  • changed-path API 直接读取 manifest,不再递归扫描 upper;
  • 保留 scan-based repair/reconciliation 工具;
  • manifest generation 使用单调序号或内容 digest;
  • 支持导出确定性 workspace manifest;
  • 支持从 {SnapshotId, UpperManifest, CAS} 重建工作区;
  • 支持 selective clear:只清理已提交且 base 已成功切换的 entry;
  • .libra 等控制数据继续排除;
  • 增加 upper 被外部绕过 FUSE 修改时的检测/修复策略。

Acceptance Criteria

  • GET changes 的复杂度主要与 delta 数量相关,不依赖完整 upper 目录规模;
  • manifest 可以区分 added、modified、deleted 和 renamed;
  • 每个 modified/deleted lower 文件都有 base OID;
  • crash 后 manifest 与 upper 可通过 reconciliation 达到一致;
  • 导出后可在另一空目录重建相同可见工作树;
  • 重建树的 path/mode/content digest 与原工作区一致;
  • commit cleanup 不会删除未提交修改;
  • manifest generation 可用于客户端增量 status。

Paper Measurements

  • changed-path query latency vs upper tree size;
  • scan-based 与 manifest-based status 对比;
  • manifest write amplification;
  • rebuild/replay latency;
  • delta storage size;
  • crash repair cost。

Relevant Files

src/daemon/antares.rs
src/antares/fuse.rs
libfuse-fs integration points
tests/antares_test.rs

Dependencies

Issue 3–5。部分 observer 接口可提前原型化。


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