diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index f6c2cbb..f01fec1 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -9,7 +9,7 @@ env: CARGO_REGISTRIES_MY_REGISTRY_INDEX: https://github.com/rust-lang/crates.io-index jobs: - check: + fmt: runs-on: ubuntu-20.04 steps: - uses: actions/checkout@v2 @@ -23,6 +23,12 @@ jobs: with: command: fmt args: --all -- --check +# TODO follow up pr to fix clippy lints +# - name: Run cargo clippy +# uses: actions-rs/cargo@v1 +# with: +# command: clippy +# args: -- -D warnings build: @@ -40,6 +46,7 @@ jobs: uses: actions-rs/cargo@v1 with: command: build + args: --all-features test: runs-on: ubuntu-20.04 @@ -56,4 +63,4 @@ jobs: uses: actions-rs/cargo@v1 with: command: test - args: --release --no-fail-fast + args: --release --all-features --no-fail-fast diff --git a/Cargo.toml b/Cargo.toml index d487e1a..5295566 100644 --- a/Cargo.toml +++ b/Cargo.toml @@ -27,7 +27,9 @@ harness = false [profile.release] debug = true -# See more keys and their definitions at https://doc.rust-lang.org/cargo/reference/manifest.html +[features] +sled = ["dep:sled"] +rocksdb = ["dep:rocksdb"] [dependencies] thiserror = "1.0.24" @@ -60,8 +62,8 @@ fslock = "0.2.1" tonic = "0.10.2" prost = "0.12" # 其他数据库内核 -sled = "0.34.7" -rocksdb = "0.21.0" +sled = { version = "0.34.7", optional = true } +rocksdb = { version = "0.21.0", optional = true } [dev-dependencies] assert_cmd = "0.11.0" diff --git a/examples/simple_crud.rs b/examples/simple_crud.rs index a48e9bf..1e946e4 100644 --- a/examples/simple_crud.rs +++ b/examples/simple_crud.rs @@ -1,6 +1,6 @@ use bytes::Bytes; use kip_db::kernel::lsm::storage::{Config, KipStorage}; -use kip_db::kernel::{CommandData, Storage}; +use kip_db::kernel::Storage; use kip_db::KernelError; use tempfile::TempDir; diff --git a/src/bench/kernel_bench.rs b/src/bench/kernel_bench.rs index 044dc34..957c99f 100644 --- a/src/bench/kernel_bench.rs +++ b/src/bench/kernel_bench.rs @@ -6,8 +6,6 @@ use std::sync::atomic::AtomicU32; use std::sync::atomic::Ordering::Relaxed; use kip_db::kernel::lsm::storage::KipStorage; -use kip_db::kernel::rocksdb_storage::RocksdbStorage; -use kip_db::kernel::sled_storage::SledStorage; use kip_db::kernel::Storage; fn counter() -> usize { @@ -194,26 +192,58 @@ fn empty_opens(c: &mut Criterion) { fn kv_bulk_load(c: &mut Criterion) { bulk_load::(c); - bulk_load::(c); - bulk_load::(c); + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + bulk_load::(c); + } + #[cfg(feature = "rocksdb")] + { + use kip_db::kernel::rocksdb_storage::RocksdbStorage; + bulk_load::(c); + } } fn kv_monotonic_crud(c: &mut Criterion) { monotonic_crud::(c); - monotonic_crud::(c); - monotonic_crud::(c); + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + monotonic_crud::(c); + } + #[cfg(feature = "rocksdb")] + { + use kip_db::kernel::rocksdb_storage::RocksdbStorage; + monotonic_crud::(c); + } } fn kv_random_crud(c: &mut Criterion) { random_crud::(c); - random_crud::(c); - random_crud::(c); + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + random_crud::(c); + } + #[cfg(feature = "rocksdb")] + { + use kip_db::kernel::rocksdb_storage::RocksdbStorage; + random_crud::(c); + } } fn kv_empty_opens(c: &mut Criterion) { empty_opens::(c); - empty_opens::(c); - empty_opens::(c); + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + empty_opens::(c); + } + #[cfg(feature = "rocksdb")] + { + use kip_db::kernel::rocksdb_storage::RocksdbStorage; + empty_opens::(c); + } } criterion_group!( diff --git a/src/error.rs b/src/error.rs index 9d2c9d8..3fd51dc 100644 --- a/src/error.rs +++ b/src/error.rs @@ -42,9 +42,11 @@ pub enum KernelError { #[error("CRC code does not match")] CrcMisMatch, + #[cfg(feature = "sled")] #[error(transparent)] SledErr(#[from] sled::Error), + #[cfg(feature = "rocksdb")] #[error(transparent)] RocksdbErr(#[from] rocksdb::Error), diff --git a/src/kernel/mod.rs b/src/kernel/mod.rs index 21e3cb1..b4adab7 100644 --- a/src/kernel/mod.rs +++ b/src/kernel/mod.rs @@ -13,7 +13,9 @@ use crate::KernelError; pub mod io; pub mod lsm; +#[cfg(feature = "rocksdb")] pub mod rocksdb_storage; +#[cfg(feature = "sled")] pub mod sled_storage; pub mod utils; diff --git a/src/kernel/sled_storage.rs b/src/kernel/sled_storage.rs index ccaee34..7f529ab 100644 --- a/src/kernel/sled_storage.rs +++ b/src/kernel/sled_storage.rs @@ -5,11 +5,10 @@ use bytes::Bytes; use core::slice::SlicePattern; use sled::Db; use std::path::PathBuf; -use std::sync::Arc; #[derive(Debug)] pub struct SledStorage { - data_base: Arc, + data_base: Db, } #[async_trait] @@ -24,7 +23,7 @@ impl Storage for SledStorage { #[inline] async fn open(path: impl Into + Send) -> crate::kernel::KernelResult { - let db = Arc::new(sled::open(path.into())?); + let db = sled::open(path.into())?; Ok(SledStorage { data_base: db }) } diff --git a/tests/tests.rs b/tests/tests.rs index e3ccdd7..e6b48cb 100644 --- a/tests/tests.rs +++ b/tests/tests.rs @@ -1,7 +1,6 @@ use bytes::Bytes; use kip_db::kernel::io::{FileExtension, IoFactory, IoType}; use kip_db::kernel::lsm::storage::KipStorage; -use kip_db::kernel::sled_storage::SledStorage; use kip_db::kernel::KernelResult; use kip_db::kernel::Storage; use std::io::{Read, Seek, SeekFrom, Write}; @@ -10,7 +9,11 @@ use walkdir::WalkDir; #[test] fn get_stored_value() -> KernelResult<()> { - get_stored_value_with_kv_store::()?; + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + get_stored_value_with_kv_store::()?; + } get_stored_value_with_kv_store::()?; Ok(()) } @@ -49,7 +52,11 @@ fn get_stored_value_with_kv_store() -> KernelResult<()> { // Should overwrite existent value. #[test] fn overwrite_value() -> KernelResult<()> { - overwrite_value_with_kv_store::()?; + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + overwrite_value_with_kv_store::()?; + } overwrite_value_with_kv_store::()?; Ok(()) @@ -104,7 +111,11 @@ fn overwrite_value_with_kv_store() -> KernelResult<()> { // Should get `None` when getting a non-existent key. #[test] fn get_non_existent_value() -> KernelResult<()> { - get_non_existent_value_with_kv_store::()?; + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + get_non_existent_value_with_kv_store::()?; + } get_non_existent_value_with_kv_store::()?; Ok(()) @@ -136,7 +147,11 @@ fn get_non_existent_value_with_kv_store() -> KernelResult<()> { #[test] fn remove_non_existent_key() -> KernelResult<()> { - remove_non_existent_key_with_kv_store::()?; + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + remove_non_existent_key_with_kv_store::()?; + } remove_non_existent_key_with_kv_store::()?; Ok(()) @@ -155,7 +170,11 @@ fn remove_non_existent_key_with_kv_store() -> KernelResult<()> { #[test] fn remove_key() -> KernelResult<()> { - remove_key_with_kv_store::()?; + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + remove_key_with_kv_store::()?; + } remove_key_with_kv_store::()?; Ok(()) @@ -182,7 +201,11 @@ fn remove_key_with_kv_store() -> KernelResult<()> { // Test data correctness after compaction. #[test] fn compaction() -> KernelResult<()> { - compaction_with_kv_store::()?; + #[cfg(feature = "sled")] + { + use kip_db::kernel::sled_storage::SledStorage; + compaction_with_kv_store::()?; + } compaction_with_kv_store::()?; Ok(())