Bladeren bron

script/research/sled_playground/overlay2: dynamic tree open

aggstam 3 jaren geleden
bovenliggende
commit
9343a34fb9
2 gewijzigde bestanden met toevoegingen van 19 en 12 verwijderingen
  1. 4 1
      script/research/sled_playground/src/main.rs
  2. 15 11
      script/research/sled_playground/src/overlay2.rs

+ 4 - 1
script/research/sled_playground/src/main.rs

@@ -94,7 +94,10 @@ fn main() -> Result<(), sled::Error> {
     // Initialize database overlay
     let config = Config::new().temporary(true);
     let db = config.open()?;
-    let mut overlay = SledOverlay2::new(&db, &[&TREE_1, &TREE_2])?;
+    let mut overlay = SledOverlay2::new(&db);
+    // Open trees in the overlay
+    overlay.open_tree(TREE_1)?;
+    overlay.open_tree(TREE_2)?;
     // We keep seperate trees for validation
     let tree_1 = db.open_tree(TREE_1)?;
     let tree_2 = db.open_tree(TREE_2)?;

+ 15 - 11
script/research/sled_playground/src/overlay2.rs

@@ -133,8 +133,7 @@ impl TreeOverlay {
     }
 }
 
-/// We instantiate overlays on top of requested
-/// sled tree keys.
+/// We instantiate an overlay on top of a `sled::Db` directly.
 pub struct SledOverlay2 {
     db: sled::Db,
     trees: BTreeMap<IVec, sled::Tree>,
@@ -142,16 +141,21 @@ pub struct SledOverlay2 {
 }
 
 impl SledOverlay2 {
-    pub fn new(db: &sled::Db, trees_keys: &[&str]) -> Result<Self, sled::Error> {
-        let mut trees = BTreeMap::new();
-        let mut caches = BTreeMap::new();
-        for tree_key in trees_keys {
-            let tree = db.open_tree(tree_key)?;
-            let cache = TreeOverlay::new(&tree);
-            trees.insert(tree_key.clone().into(), tree.clone());
-            caches.insert(tree_key.clone().into(), cache);
+    pub fn new(db: &sled::Db) -> Self {
+        Self { db: db.clone(), trees: BTreeMap::new(), caches: BTreeMap::new() }
+    }
+
+    pub fn open_tree(&mut self, tree_key: &str) -> Result<(), sled::Error> {
+        let tree_key: IVec = tree_key.clone().into();
+        if self.trees.contains_key(&tree_key) {
+            return Ok(())
         }
-        Ok(Self { db: db.clone(), trees, caches })
+        let tree = self.db.open_tree(&tree_key)?;
+        let cache = TreeOverlay::new(&tree);
+        self.trees.insert(tree_key.clone(), tree.clone());
+        self.caches.insert(tree_key, cache);
+
+        Ok(())
     }
 
     fn get_cache(&self, tree_key: IVec) -> Result<&TreeOverlay, sled::Error> {