Explorar el Código

fud: add `chunked_storages` cache

epiphany hace 7 meses
padre
commit
dc38cfb104
Se han modificado 2 ficheros con 20 adiciones y 0 borrados
  1. 7 0
      bin/fud/fud/src/download.rs
  2. 13 0
      bin/fud/fud/src/lib.rs

+ 7 - 0
bin/fud/fud/src/download.rs

@@ -308,6 +308,13 @@ async fn handle_chunk_reply(
     let resource = resource.clone();
     drop(resources_write);
 
+    if let Some(chunk_index) = ctx.chunked.get_chunk_index(chunk_hash) {
+        ctx.chunked.get_chunk_mut(chunk_index).available = true;
+        let mut chunked_storages = ctx.fud.chunked_storages.write().await;
+        chunked_storages.insert(*ctx.hash, ctx.chunked.clone());
+        drop(chunked_storages);
+    }
+
     notify_event!(ctx.fud, ChunkDownloadCompleted, { hash: *ctx.hash, chunk_hash: *chunk_hash, resource });
     ctx.chunks.remove(chunk_hash);
     ChunkFetchControl::NextChunk

+ 13 - 0
bin/fud/fud/src/lib.rs

@@ -119,6 +119,8 @@ pub struct Fud {
     dht: Arc<Dht<Fud>>,
     /// Resources (current status of all downloads/seeds)
     resources: Arc<RwLock<HashMap<blake3::Hash, Resource>>>,
+    /// Chunked storages (represent files/directories)
+    chunked_storages: Arc<RwLock<HashMap<blake3::Hash, ChunkedStorage>>>,
     /// Sled tree containing "resource hash -> path on the filesystem"
     path_tree: sled::Tree,
     /// Sled tree containing "resource hash -> file selection". If the file
@@ -214,6 +216,7 @@ impl Fud {
             file_selection_tree: sled_db.open_tree(SLED_FILE_SELECTION_TREE)?,
             scrap_tree: sled_db.open_tree(SLED_SCRAP_TREE)?,
             resources: Arc::new(RwLock::new(HashMap::new())),
+            chunked_storages: Arc::new(RwLock::new(HashMap::new())),
             get_tx,
             get_rx,
             put_tx,
@@ -539,6 +542,10 @@ impl Fud {
             }
             let (total_bytes_downloaded, target_bytes_downloaded) = verify_res.unwrap();
 
+            let mut chunked_storages = self.chunked_storages.write().await;
+            chunked_storages.insert(resource.hash, chunked.clone());
+            drop(chunked_storages);
+
             if !chunked.is_complete() {
                 update_resource(
                     &mut resource,
@@ -745,6 +752,12 @@ impl Fud {
 
         // Mark locally available chunks as such
         let verify_res = self.verify_chunks(&resource, &mut chunked, files).await;
+
+        // Insert the chunked storage to fud's cache
+        let mut chunked_storages = self.chunked_storages.write().await;
+        chunked_storages.insert(*hash, chunked.clone());
+        drop(chunked_storages);
+
         if let Err(e) = verify_res {
             dht_sub.unsubscribe().await;
             error!(target: "fud::fetch_resource()", "Error while verifying chunks: {e}");