#rocks-db #facebook #rocksdb #ffi

sys rocks-sys

Rust 的原生 RocksDB 绑定,用于 rust-rocks 内部使用

19 个版本

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日

#2122数据库接口

Download history 1/week @ 2024-03-19 4/week @ 2024-03-26 18/week @ 2024-04-02 1/week @ 2024-04-16 9/week @ 2024-04-23 1/week @ 2024-05-07 4/week @ 2024-05-14 5/week @ 2024-05-21 7/week @ 2024-05-28 1/week @ 2024-06-04 10/week @ 2024-06-11 8/week @ 2024-06-18 35/week @ 2024-06-25 85/week @ 2024-07-02

139 每月下载量
rocks 中使用

Apache-2.0

13MB
281K SLoC

C++ 263K SLoC // 0.1% comments Python 7K SLoC // 0.2% comments Rust 4K SLoC // 0.0% comments Shell 3K SLoC // 0.2% comments C 2.5K SLoC // 0.0% comments GNU Style Assembly 539 SLoC // 0.1% comments INI 433 SLoC // 0.1% comments PowerShell 368 SLoC // 0.2% comments Bitbake 168 SLoC // 0.2% comments JavaScript 95 SLoC // 0.1% comments Bazel 41 SLoC // 0.2% 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 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

您还需要 lld 来自官方源或 http://apt.llvm.org/

分支

  • 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 不会将用户 crates 包装在 --start-group--end-group
  • 循环引用将被视为错误。
  • 可以使用 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 遍历时:这是可以的。
  • 在收集以供后续使用时:克隆键和值。

无运行时依赖。