From 6967ffbd097353436a09a7158abf109c655c0bec Mon Sep 17 00:00:00 2001 From: "hinto.janai" Date: Tue, 26 Mar 2024 16:15:15 -0400 Subject: [PATCH 1/5] add `redb-memory` feature --- database/Cargo.toml | 10 ++++++---- 1 file changed, 6 insertions(+), 4 deletions(-) diff --git a/database/Cargo.toml b/database/Cargo.toml index a340d0d08..33c3937c5 100644 --- a/database/Cargo.toml +++ b/database/Cargo.toml @@ -9,11 +9,13 @@ repository = "https://github.com/Cuprate/cuprate/tree/main/database" keywords = ["cuprate", "database"] [features] -default = ["heed", "redb", "service"] +# default = ["heed", "redb", "service"] # default = ["redb", "service"] -heed = ["dep:heed"] -redb = ["dep:redb"] -service = ["dep:crossbeam", "dep:futures", "dep:tokio", "dep:tokio-util", "dep:tower", "dep:rayon"] +default = ["redb-memory", "service"] +heed = ["dep:heed"] +redb = ["dep:redb"] +redb-memory = ["redb"] +service = ["dep:crossbeam", "dep:futures", "dep:tokio", "dep:tokio-util", "dep:tower", "dep:rayon"] [dependencies] bytemuck = { version = "1.14.3", features = ["must_cast", "derive", "min_const_generics", "extern_crate_alloc"] } From a6a556717dc232aef4ead47042d11872e5957b82 Mon Sep 17 00:00:00 2001 From: "hinto.janai" Date: Tue, 26 Mar 2024 16:15:47 -0400 Subject: [PATCH 2/5] redb: use `redb::backend::InMemoryBackend` if enabled --- database/src/backend/redb/env.rs | 26 ++++++++++++++++---------- 1 file changed, 16 insertions(+), 10 deletions(-) diff --git a/database/src/backend/redb/env.rs b/database/src/backend/redb/env.rs index 0f4949ef7..5708d6fa5 100644 --- a/database/src/backend/redb/env.rs +++ b/database/src/backend/redb/env.rs @@ -72,16 +72,22 @@ impl Env for ConcreteEnv { // TODO: we can set cache sizes with: // env_builder.set_cache(bytes); - // Create the database directory if it doesn't exist. - std::fs::create_dir_all(config.db_directory())?; - - // Open the database file, create if needed. - let db_file = std::fs::OpenOptions::new() - .read(true) - .write(true) - .create(true) - .open(config.db_file())?; - let mut env = env_builder.create_file(db_file)?; + // Use the in-memory backend if the feature is enabled. + let mut env = if cfg!(feature = "redb-memory") { + env_builder.create_with_backend(redb::backends::InMemoryBackend::new())? + } else { + // Create the database directory if it doesn't exist. + std::fs::create_dir_all(config.db_directory())?; + + // Open the database file, create if needed. + let db_file = std::fs::OpenOptions::new() + .read(true) + .write(true) + .create(true) + .open(config.db_file())?; + + env_builder.create_file(db_file)? + }; // Create all database tables. // `redb` creates tables if they don't exist. From ba31f9275aad0516ba54ab282c1685f5d11a39f7 Mon Sep 17 00:00:00 2001 From: "hinto.janai" Date: Tue, 26 Mar 2024 16:17:50 -0400 Subject: [PATCH 3/5] readme: add `redb-memory` section --- database/README.md | 6 ++++++ 1 file changed, 6 insertions(+) diff --git a/database/README.md b/database/README.md index e45f9732e..74d07149b 100644 --- a/database/README.md +++ b/database/README.md @@ -11,6 +11,7 @@ Cuprate's database implementation. 1. [Backends](#backends) - [`heed`](#heed) - [`redb`](#redb) + - [`redb-memory`](#redb-memory) - [`sanakirja`](#sanakirja) - [`MDBX`](#mdbx) 1. [Layers](#layers) @@ -165,6 +166,11 @@ The upstream versions from [`crates.io`](https://crates.io/crates/redb) are used TODO: document DB on remote filesystem (does redb allow this?) +## `redb-memory` +This backend is 100% the same as `redb`, although, it uses `redb::backend::InMemoryBackend` which is a key-value store that completely resides in memory instead of a file. + +All other details about this should be the same as the normal `redb` backend. + ## `sanakirja` [`sanakirja`](https://docs.rs/sanakirja) was a candidate as a backend, however there were problems with maximum value sizes. From 4d0375796734635f563b65f857db7d31e0ef15a9 Mon Sep 17 00:00:00 2001 From: "hinto.janai" Date: Tue, 26 Mar 2024 16:25:31 -0400 Subject: [PATCH 4/5] ci: add `redb-memory` testing --- .github/workflows/ci.yml | 1 + 1 file changed, 1 insertion(+) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index ebf40b12a..4d7c4a79f 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,6 +107,7 @@ jobs: run: | cargo test --all-features --workspace cargo test --package cuprate-database --no-default-features --features redb --features service + cargo test --package cuprate-database --no-default-features --features redb-memory --features service # TODO: upload binaries with `actions/upload-artifact@v3` - name: Build From 1c3d59979cf06e1ff28b12d87a49979f86f11e54 Mon Sep 17 00:00:00 2001 From: "hinto.janai" Date: Tue, 26 Mar 2024 20:01:44 -0400 Subject: [PATCH 5/5] ci: remove `redb-memory` testing probably not worth adding time to CI for this --- .github/workflows/ci.yml | 1 - 1 file changed, 1 deletion(-) diff --git a/.github/workflows/ci.yml b/.github/workflows/ci.yml index 4d7c4a79f..ebf40b12a 100644 --- a/.github/workflows/ci.yml +++ b/.github/workflows/ci.yml @@ -107,7 +107,6 @@ jobs: run: | cargo test --all-features --workspace cargo test --package cuprate-database --no-default-features --features redb --features service - cargo test --package cuprate-database --no-default-features --features redb-memory --features service # TODO: upload binaries with `actions/upload-artifact@v3` - name: Build