Skip to content

[Paper/M1][P0] Replace inode-local content storage with a shared content-addressed snapshot cache #43

Description

@Ivanbeethoven

Parent research epic: #39

背景

当前持久化内容、size 和 path metadata 主要围绕 inode/store instance 组织。不同 snapshot 或 base path 中的相同 blob 很难安全复用;inode 也不是跨 generation 稳定的内容身份。

目标

将存储分为三层:

Shared Blob CAS
  key: blob_oid
  value: verified immutable bytes

Snapshot Metadata Store
  key: (SnapshotId, tree_oid/path)
  value: kind, object_oid, mode, size

Mount/Generation Inode Map
  key: (mount_id, generation, inode)
  value: snapshot node reference

Tasks

  • 设计并记录 storage ADR;
  • 新增共享 blob CAS,按 OID/digest 存储;
  • blob 写入采用 temp + verify + atomic publish;
  • 下载后校验实际对象哈希;
  • 新增 snapshot-scoped metadata store;
  • 将 inode 映射从内容持久化身份中解耦;
  • size/mode 从 tree metadata 获取,避免为 stat 下载完整 blob;
  • 支持多个 Dicfuse instance 共享同一 CAS;
  • 实现容量配额、统计和可配置 eviction;
  • 实现引用/最近访问信息和离线 GC;
  • GC 不得删除正在读取或被 active snapshot pin 的对象;
  • 为旧 content.db/path.db/size.db 提供 schema marker 和安全迁移/重建策略;
  • 增加 cache corruption 检测;
  • 增加重复 blob 跨 workspace/revision 测试。

Acceptance Criteria

  • 两个 workspace 读取同一 OID 时,磁盘只保留一份 blob;
  • 两个 revision 共享的大多数 unchanged blobs 可直接复用;
  • CAS 命中不访问远端;
  • 不同 OID 不会因 inode 重用而返回错误内容;
  • crash 发生在写入任意阶段时,不会发布部分 blob;
  • 可导出 logical bytes、physical bytes、dedup ratio 和 eviction 指标;
  • active snapshot pin 可阻止 GC;
  • 数据损坏时返回错误并重新获取,而不是静默提供错误内容。

Paper Measurements

  • logical/physical storage ratio;
  • cross-workspace dedup ratio;
  • cross-revision reuse ratio;
  • disk-cache hit latency;
  • GC overhead;
  • cache size sensitivity。

Relevant Files

src/dicfuse/content_store.rs
src/dicfuse/tree_store.rs
src/dicfuse/size_store.rs
src/dicfuse/store.rs
src/dicfuse/manager.rs

Dependencies

Issue 3。


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