#abstraction #dealing #disk #on-disk #stored #mapping

landfill

处理磁盘上数据的各种类型

5 个版本 (3 个破坏性更新)

0.5.0 2023 年 8 月 8 日
0.4.1 2023 年 8 月 8 日
0.4.0 2023 年 8 月 7 日
0.3.0 2023 年 8 月 5 日
0.2.0 2023 年 7 月 21 日

#844数据结构

每月 22 次下载

GPL-3.0-or-later

45KB
1K SLoC

landfill

一组用于处理持久性、磁盘上数据的数据结构。

目标是拥有一个易于推理的持久化层,允许并发访问和修改,并在磁盘上存储的数据周围提供安全且强大的抽象。

垃圾填埋场的设计倾向于简单,并通过内存映射将所有缓存和页面处理留给内核。

通常,这里实现的结构只能 增长,如果需要任何形式的垃圾回收,它必须在上层实现。

该库有 4 个主要组件,每个组件对应于文件或一组文件。

Entropy 组件是一个包含 4 个随机 u64 的 256 字节文件。

这用于校验和、创建nonce、提供区分不同存储的标签等。

日志

Journal 存储了多个增量更新,例如 AppendOnly 缓冲区的写头,并设计为线程安全和容错。

它通过保存值的多个版本及其相应的校验和来实现。

打开 Journal 时,将恢复具有有效校验和的最大值,从而防止损坏的半完成写入。

随机访问

类型为 T 的随机访问、自动增长的数组。

它使用有限数量的 RWLock,这些锁映射到索引位置。

读取操作获取读锁,并返回守卫,而写入操作只能在传递给 with_mut 函数的闭包中执行。这是为了避免在同时尝试持有多个可变引用时发生死锁的可能性。

请注意,存储的值为全部零的值将视为空空间,并在 get 上返回 None

追加只读

一个追加只读的字节虚拟文件,它保留有关已写入多少字节的内部日志,并且写入的数据在内存中 永远不会移动,因此可以安全地分配在结构本身存在的时间内引用的结构。

一旦映射

一个 K-V 映射,将键映射到值,值不能被删除或更新,因此可以在添加更多 kv 对时安全地保留对它们的引用。

内容

内容地址数据的存储库,写入此存储库的字节将被提供的通用加密哈希函数进行哈希处理,并返回一个ContentId,该ID可以用来再次获取数据的引用。

在实现上类似于OnceMap,但节省了空间,因为不需要存储键,而是在获取时重新计算,从而提供了一层额外的保护,防止损坏的读取。

依赖项

~1.5–7.5MB
~47K SLoC