From f22575657c6985296e0d85d474bfc7be29ad7d6f Mon Sep 17 00:00:00 2001 From: Xavier Deguillard Date: Tue, 28 Jul 2020 10:49:36 -0700 Subject: [PATCH] revisionstore: search in local lfs store on prefetch Summary: The pointer for a blob might very well be in the local store, so let's search in it. Reviewed By: DurhamG Differential Revision: D22565608 fbshipit-source-id: 925dd5718fc19e11a1ccaa0887bf5c477e85b2e5 --- eden/scm/lib/revisionstore/src/lfs.rs | 25 +++++++++++++++++-------- 1 file changed, 17 insertions(+), 8 deletions(-) diff --git a/eden/scm/lib/revisionstore/src/lfs.rs b/eden/scm/lib/revisionstore/src/lfs.rs index ded1069126..4f6d6aaca9 100644 --- a/eden/scm/lib/revisionstore/src/lfs.rs +++ b/eden/scm/lib/revisionstore/src/lfs.rs @@ -1375,18 +1375,27 @@ impl RemoteDataStore for LfsRemoteStore { fn prefetch(&self, keys: &[StoreKey]) -> Result> { let mut not_found = Vec::new(); + let stores = if let Some(local_store) = self.remote.local.as_ref() { + vec![self.remote.shared.clone(), local_store.clone()] + } else { + vec![self.remote.shared.clone()] + }; + let mut obj_set = HashMap::new(); let objs = keys .iter() .map(|k| { - if let Some(pointer) = self.remote.shared.pointers.read().entry(k)? { - if let Some(content_hash) = pointer.content_hashes.get(&ContentHashType::Sha256) - { - obj_set.insert(content_hash.clone().unwrap_sha256(), k.clone()); - return Ok(Some(( - content_hash.clone().unwrap_sha256(), - pointer.size.try_into()?, - ))); + for store in &stores { + if let Some(pointer) = store.pointers.read().entry(k)? { + if let Some(content_hash) = + pointer.content_hashes.get(&ContentHashType::Sha256) + { + obj_set.insert(content_hash.clone().unwrap_sha256(), k.clone()); + return Ok(Some(( + content_hash.clone().unwrap_sha256(), + pointer.size.try_into()?, + ))); + } } }