#rocks-db #facebook #rocksdb #ffi

rocks

RocksDB 的 Rust 绑定

18 个版本

0.1.10 2021 年 1 月 16 日
0.1.9 2020 年 8 月 8 日
0.1.8 2020 年 5 月 28 日
0.1.5 2020 年 3 月 22 日
0.0.8 2017 年 6 月 27 日

#217数据库接口

每月 25 次下载

Apache-2.0

13MB
291K SLoC

C++ 263K SLoC // 0.1% comments Rust 13K SLoC // 0.0% comments Python 7K SLoC // 0.2% comments Shell 3K SLoC // 0.2% comments C 2.5K SLoC // 0.0% comments GNU Style Assembly 538 SLoC // 0.1% comments INI 432 SLoC // 0.1% comments PowerShell 367 SLoC // 0.2% comments Bitbake 167 SLoC // 0.2% comments JavaScript 94 SLoC // 0.1% comments Bazel 40 SLoC // 0.1% comments

RustRocks

crates.io badge DOCS.RS badge Linux Build Status macOS Build Status Windows Build Status

另一个 Rust 的 RocksDB 绑定。 文档

让 RocksDB 真正成为摇滚!

  • 针对 RocksDB 6.7.3 (git 子模块) 的静态链接
  • 动态链接已测试
    • macOS homebrew
    • Windows 10, VS 2019 与 vcpkg
    • ArchLinux pacman,支持 x86_64 和 aarch64(ODroid-C2)
    • Ubuntu 18.04 (rocksdb5.8 分支),支持 x86_64 和 aarch64(RPi 3)
    • Ubuntu 20.04 (rocksdb5.17 分支)

安装

动态链接 RocksDB

[dependencies]
rocks = "0.1"

针对 RocksDB 的静态链接(默认启用 snappy)

[dependencies.rocks]
version = "0.1"
default-features = false
features = ["static-link"]

所有静态功能(所有压缩类型)

[dependencies.rocks]
version = "0.1"
default-features = false
features = ["full"]

如何编译

请随意参考 Travic-CI、AppVeyor 和 Github Actions 配置文件。

$ git submodule update --init --recursive
$ cargo test --features static-link -- --test-threads 1
(This will build with snappy as the only compression supported)

$ cargo test --features full -- --test-threads 1
(This will build with all compression supported)

针对 macOS(通过 brew 安装 RocksDB)

$ brew install rocksdb
$ cargo test -- --nocapture --test-threads 1

针对 Linux

(install rocksdb via package manager or make & install)
$ sudo apt install lld
(NOTE: gcc-ld can't handle circular references while linking.)
(for more, refer the last section of README)
$ RUSTFLAGS="-C link-arg=-fuse-ld=lld" cargo test -- --test-threads 1

如果 RocksDB 安装在非默认目录,请使用环境变量

LD_LIBRARY_PATH=/usr/local/libLIBRARY_PATH=/usr/local/libCXXFLAGS=-I/usr/local/include

Ubuntu LTS

RocksDB 经常更改其 API,因此 rust-rocks 使用不同的分支来支持 Ubuntu LTS。

> sudo apt install librocksdb-dev libsnappy-dev

您还需要从官方源或 http://apt.llvm.org/ 获取 lld

分支

  • rocksdb5.8 (18.04 LTS)
  • rocksdb5.17 (20.04 LTS)

Windows

您需要 VS 2017 或 VS 2019,并通过 vcpkg 安装 RocksDB。

常见问题解答

请随意 创建新问题

列出当前支持的压缩类型

$ cargo run --example it-works
RocksDB: 6.7.3
Compression Supported:
  - NoCompression
  - SnappyCompression
  - ZlibCompression
  - BZip2Compression
  - LZ4Compression
  - LZ4HCCompression
  - ZSTD
  - ZSTDNotFinalCompression

开发

Bindgen

$ cd rocks-sys
$ PATH="/usr/local/opt/llvm/bin:$PATH" make
(this will regenerate the bindgen c.rs)

已知错误

Linux 下的链接错误

  • rust-rocks 将 rust 函数导出到 C++,因此在链接时存在循环引用
  • GCC 要求您按照它们相互依赖的顺序放置目标文件和库
  • Rust 不会在 --start-group--end-group 中包装用户 crates
  • 因此,循环引用将是错误。
  • 可以通过使用 lld 作为链接器来修复,RUSTFLAGS="-C link-arg=-fuse-ld=lld"
  • 可以通过手动组织链接参数来修复
    • librocks,然后是librocks_sys,然后又是librocks

轻微的内存泄漏

  • 原始指针在运行时创建,应该通过 lazy_static 实现,并包装在特例对象中
    • ColumnFamilyOptions::comparatorconst Comparator*
    • ColumnFamilyOptions::compaction_filterconst CompactionFilter*

迭代器泄露生命周期

参考:https://github.com/bh1xuw/rust-rocks/issues/15

  • 在进行 for-traverse 时:这是可以的
  • 在收集以备后用:克隆键和值

依赖关系