1 个不稳定版本
0.1.0 | 2023 年 8 月 14 日 |
---|
#1370 在 文件系统
27KB
456 行
tantivy 对象存储
本仓库包含了一个使用 object_store::ObjectStore
实现的 tantivy::directory::Directory
。
该实现支持读写操作,但不支持锁定或文件监视。索引构建过程负责确保没有并发索引写入器。
与 tantivy 的目录实现相比的一些显著行为差异
版本控制
Tantivy 使用名为 meta.json
的文件,这是一个由组成索引的所有文件组成的列表,实际上是在跟踪索引的快照。然而,vanilla tantivy 不支持版本控制,这意味着每次更新索引时,meta.json 都会被覆盖。这个 PR 允许调用者设置读取版本和写入版本。这些版本号在调用者尝试原子读取或原子写入时附加到文件名末尾。
写时复制(CoW)
在创建 ObjectStoreDirectory
时,用户可以设置 read_version
和 write_version
。当用户调用 atomic_read
时使用 read_version
。我们不会读取 meta.json
,而是尝试读取 meta.json.{read_version}
。同样,当用户调用 atomic_write
时,我们将尝试写入 meta.json.{write_version}
注意:`write_version
` 的优先级高于 `read_version
`。这意味着,第一次写入后,`atomic_read
` 将从 `meta.json.{write_version}
` 读取,而不是 `meta.json.{read_version}
`。这是必需的,因为 tantivy 在索引过程中修改了 `meta.json
` 文件多次,这里的 CoW 实现需要具有写后读一致性。
索引重载
此实现不支持重载。如果注册了 `watch
` 回调,则回调将永远不会被调用。用户目前需要通过其他机制来处理重载。
可能可以使用类似对象存储的本地变更通知来触发重载,但这将是未来的工作。
删除
由于 tantivy 尝试在索引期间进行垃圾收集和合并索引文件,我们不得不将 `delete
` 操作更改为无操作。这是因为我们不希望 tantivy 垃圾收集旧版本的文件,因为这些文件可能被其他读取者使用。我们将单独实现垃圾收集过程。
线程
此实现包含一个用于运行 IO 任务的 `tokio::Runtime
`。这意味着,从另一个 tokio 运行时调用此实现中的函数时,调用者应始终使用 `tokio::task::spawn_blocking
`,以便将任务调度在无 tokio 运行时的线程上。(这是必需的,因为嵌套 tokio 运行时会引发恐慌)
并发安全性
此实现在单个实例内是并发安全的,因为 `atomic_read|write
` 机制是返回的 trait 对象中的锁对象。
性能
待定
依赖项
~29–43MB
~681K SLoC