Skip to content

Commit ec24038

Browse files
committed
feat: secondary rocksdb storage
1 parent 206bc63 commit ec24038

File tree

12 files changed

+1017
-609
lines changed

12 files changed

+1017
-609
lines changed

grovedb/src/estimated_costs/average_case_costs.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -478,7 +478,7 @@ mod test {
478478
fn test_get_merk_node_average_case() {
479479
// Open a merk and insert 10 elements.
480480
let tmp_dir = TempDir::new().expect("cannot open tempdir");
481-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
481+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
482482
.expect("cannot open rocksdb storage");
483483
let batch = StorageBatch::new();
484484

grovedb/src/lib.rs

Lines changed: 19 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -246,12 +246,29 @@ pub type TransactionArg<'db, 'a> = Option<&'a Transaction<'db>>;
246246

247247
#[cfg(feature = "full")]
248248
impl GroveDb {
249-
/// Opens a given path
249+
/// Opens a primary storage with a given path
250250
pub fn open<P: AsRef<Path>>(path: P) -> Result<Self, Error> {
251-
let db = RocksDbStorage::default_rocksdb_with_path(path)?;
251+
let db = RocksDbStorage::default_primary_rocksdb(path)?;
252252
Ok(GroveDb { db })
253253
}
254254

255+
/// Open a secondary storage with given paths
256+
pub fn open_secondary<P: AsRef<Path>>(
257+
primary_path: P,
258+
secondary_storage: P,
259+
) -> Result<Self, Error> {
260+
let db = RocksDbStorage::default_secondary_rocksdb(primary_path, secondary_storage)?;
261+
Ok(GroveDb { db })
262+
}
263+
264+
/// Replicate recent changes from primary database
265+
/// Available only for a secondary storage
266+
pub fn try_to_catch_up_from_primary(&self) -> Result<(), Error> {
267+
self.db.try_to_catch_up_from_primary()?;
268+
269+
Ok(())
270+
}
271+
255272
/// Uses raw iter to delete GroveDB key values pairs from rocksdb
256273
pub fn wipe(&self) -> Result<(), Error> {
257274
self.db.wipe()?;

grovedb/tests/secondary_tests.rs

Lines changed: 71 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,71 @@
1+
use grovedb::GroveDb;
2+
use tempfile::TempDir;
3+
4+
#[test]
5+
fn test_some_functionality() {
6+
let primary_dir = TempDir::new().expect("should create temp dir");
7+
8+
let primary_grovedb = GroveDb::open(primary_dir.path()).expect("should open grovedb");
9+
10+
// Store value in primary
11+
12+
let key = b"key";
13+
let value = vec![1, 2, 3];
14+
15+
primary_grovedb
16+
.put_aux(key, &value, None, None)
17+
.unwrap()
18+
.expect("should put value to primary");
19+
20+
// Read value from primary
21+
22+
let primary_value = primary_grovedb
23+
.get_aux(key, None)
24+
.unwrap()
25+
.expect("should get value from primary")
26+
.expect("value should exist on primary");
27+
28+
assert_eq!(value, primary_value);
29+
30+
// Open secondary
31+
32+
let secondary_dir = TempDir::new().expect("should create temp dir");
33+
34+
let secondary_grovedb = GroveDb::open_secondary(primary_dir.path(), secondary_dir.path())
35+
.expect("should open secondary");
36+
37+
// Read value on secondary
38+
39+
let secondary_value = secondary_grovedb
40+
.get_aux(key, None)
41+
.unwrap()
42+
.expect("should get value from secondary")
43+
.expect("value from primary should exist on secondary");
44+
45+
assert_eq!(primary_value, secondary_value);
46+
47+
// Update value on primary
48+
49+
let primary_value2 = vec![4, 5, 6];
50+
51+
primary_grovedb
52+
.put_aux(key, &primary_value2, None, None)
53+
.unwrap()
54+
.expect("should put value to primary");
55+
56+
// Catch up secondary
57+
58+
secondary_grovedb
59+
.try_to_catch_up_from_primary()
60+
.expect("should catch up");
61+
62+
// Read updated value on secondary
63+
64+
let secondary_value2 = secondary_grovedb
65+
.get_aux(key, None)
66+
.unwrap()
67+
.expect("should get value from secondary")
68+
.expect("value from primary should exist on secondary");
69+
70+
assert_eq!(primary_value2, secondary_value2);
71+
}

merk/src/merk/chunks.rs

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -268,7 +268,7 @@ mod tests {
268268
fn chunks_from_reopen() {
269269
let tmp_dir = TempDir::new().expect("cannot create tempdir");
270270
let original_chunks = {
271-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
271+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
272272
.expect("cannot open rocksdb storage");
273273
let batch = StorageBatch::new();
274274
let mut merk = Merk::open_base(
@@ -307,7 +307,7 @@ mod tests {
307307
.collect::<Vec<_>>()
308308
.into_iter()
309309
};
310-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
310+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
311311
.expect("cannot open rocksdb storage");
312312
let merk = Merk::open_base(
313313
storage

merk/src/merk/mod.rs

Lines changed: 7 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -739,7 +739,7 @@ mod test {
739739
#[test]
740740
fn reopen_check_root_hash() {
741741
let tmp_dir = TempDir::new().expect("cannot open tempdir");
742-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
742+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
743743
.expect("cannot open rocksdb storage");
744744
let mut merk = Merk::open_base(
745745
storage
@@ -763,7 +763,7 @@ mod test {
763763
#[test]
764764
fn test_get_node_cost() {
765765
let tmp_dir = TempDir::new().expect("cannot open tempdir");
766-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
766+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
767767
.expect("cannot open rocksdb storage");
768768
let mut merk = Merk::open_base(
769769
storage
@@ -807,7 +807,7 @@ mod test {
807807
let tmp_dir = TempDir::new().expect("cannot open tempdir");
808808

809809
let original_nodes = {
810-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
810+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
811811
.expect("cannot open rocksdb storage");
812812
let batch = StorageBatch::new();
813813
let mut merk = Merk::open_base(
@@ -846,7 +846,7 @@ mod test {
846846
nodes
847847
};
848848

849-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
849+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
850850
.expect("cannot open rocksdb storage");
851851
let merk = Merk::open_base(
852852
storage
@@ -883,7 +883,7 @@ mod test {
883883
let tmp_dir = TempDir::new().expect("cannot open tempdir");
884884

885885
let original_nodes = {
886-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
886+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
887887
.expect("cannot open rocksdb storage");
888888
let batch = StorageBatch::new();
889889
let mut merk = Merk::open_base(
@@ -918,7 +918,7 @@ mod test {
918918
collect(&mut merk.storage.raw_iter(), &mut nodes);
919919
nodes
920920
};
921-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
921+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
922922
.expect("cannot open rocksdb storage");
923923
let merk = Merk::open_base(
924924
storage
@@ -939,7 +939,7 @@ mod test {
939939
#[test]
940940
fn update_node() {
941941
let tmp_dir = TempDir::new().expect("cannot open tempdir");
942-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
942+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
943943
.expect("cannot open rocksdb storage");
944944
let batch = StorageBatch::new();
945945
let mut merk = Merk::open_base(

merk/src/merk/open.rs

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -92,7 +92,7 @@ mod test {
9292
#[test]
9393
fn test_reopen_root_hash() {
9494
let tmp_dir = TempDir::new().expect("cannot open tempdir");
95-
let storage = RocksDbStorage::default_rocksdb_with_path(tmp_dir.path())
95+
let storage = RocksDbStorage::default_primary_rocksdb(tmp_dir.path())
9696
.expect("cannot open rocksdb storage");
9797
let test_prefix = [b"ayy"];
9898

0 commit comments

Comments
 (0)