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
This commit is contained in:
Xavier Deguillard 2020-07-28 10:49:36 -07:00 committed by Facebook GitHub Bot
parent e9b3f79b70
commit f22575657c

View File

@ -1375,18 +1375,27 @@ impl RemoteDataStore for LfsRemoteStore {
fn prefetch(&self, keys: &[StoreKey]) -> Result<Vec<StoreKey>> {
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()?,
)));
}
}
}