From fa2a3347cc2dd24bb3a215c3d1252ffe7217faa6 Mon Sep 17 00:00:00 2001 From: Quanyi Ma Date: Sat, 6 Jan 2024 18:02:21 +0800 Subject: [PATCH] Add limited mem size and tmp file path for caches Signed-off-by: Quanyi Ma --- mercury/src/internal/pack/cache.rs | 9 +++++++++ mercury/src/internal/pack/decode.rs | 21 ++++++++++++++++----- 2 files changed, 25 insertions(+), 5 deletions(-) diff --git a/mercury/src/internal/pack/cache.rs b/mercury/src/internal/pack/cache.rs index e259f36e..0d267ca3 100644 --- a/mercury/src/internal/pack/cache.rs +++ b/mercury/src/internal/pack/cache.rs @@ -6,6 +6,7 @@ //! use std::collections::HashMap; +use std::path::PathBuf; use crate::hash::SHA1; use crate::internal::object::types::ObjectType; @@ -25,6 +26,8 @@ pub struct CacheObject { pub struct Caches { pub objects: Vec>, pub map_offset: HashMap, + pub mem_size: usize, + pub tmp_path: PathBuf, } @@ -41,5 +44,11 @@ impl Caches { /// pub fn insert(&mut self, offset: usize, object: CacheObject) { self.map_offset.insert(offset, object); + + self.mem_size += self.get(offset).unwrap().data_decompress.len(); + } + + pub fn get(&self, offset: usize) -> Option<&CacheObject> { + self.map_offset.get(&offset) } } \ No newline at end of file diff --git a/mercury/src/internal/pack/decode.rs b/mercury/src/internal/pack/decode.rs index c45c057b..b8c5e799 100644 --- a/mercury/src/internal/pack/decode.rs +++ b/mercury/src/internal/pack/decode.rs @@ -7,6 +7,7 @@ //! use std::io::{self, Read, BufRead, Seek}; use std::collections::HashMap; +use std::path::PathBuf; use flate2::bufread::ZlibDecoder; @@ -247,10 +248,12 @@ impl Pack { /// Decodes a pack file from a given Read and BufRead source and get a vec of objects. /// /// - pub fn decode(&mut self, pack: &mut (impl Read + BufRead + Seek + Send)) -> Result<(), GitError> { + pub fn decode(&mut self, pack: &mut (impl Read + BufRead + Seek + Send), mem_size: usize, tmp_path: PathBuf) -> Result<(), GitError> { let mut caches = Caches { objects: Vec::new(), map_offset: HashMap::new(), + mem_size, + tmp_path, }; let mut render = Wrapper::new(io::BufReader::new(pack)); @@ -360,10 +363,12 @@ mod tests { let mut source = PathBuf::from(env::current_dir().unwrap().parent().unwrap()); source.push("tests/data/packs/pack-1d0e6c14760c956c173ede71cb28f33d921e232f.pack"); + let tmp = PathBuf::from("/tmp"); + let f = std::fs::File::open(source).unwrap(); let mut buffered = BufReader::new(f); let mut p = Pack {number: 0, signature: SHA1::default()}; - p.decode(&mut buffered).unwrap(); + p.decode(&mut buffered, 0, tmp).unwrap(); } #[test] @@ -371,10 +376,12 @@ mod tests { let mut source = PathBuf::from(env::current_dir().unwrap().parent().unwrap()); source.push("tests/data/packs/ref-delta-65d47638aa7cb7c39f1bd1d5011a415439b887a8.pack"); + let tmp = PathBuf::from("/tmp"); + let f = std::fs::File::open(source).unwrap(); let mut buffered = BufReader::new(f); let mut p = Pack {number: 0, signature: SHA1::default()}; - p.decode(&mut buffered).unwrap(); + p.decode(&mut buffered, 0, tmp).unwrap(); } #[test] @@ -382,10 +389,12 @@ mod tests { let mut source = PathBuf::from(env::current_dir().unwrap().parent().unwrap()); source.push("tests/data/packs/git-2d187177923cd618a75da6c6db45bb89d92bd504.pack"); + let tmp = PathBuf::from("/tmp"); + let f = std::fs::File::open(source).unwrap(); let mut buffered = BufReader::new(f); let mut p = Pack {number: 0, signature: SHA1::default()}; - p.decode(&mut buffered).unwrap(); + p.decode(&mut buffered, 0, tmp).unwrap(); } #[test] @@ -393,9 +402,11 @@ mod tests { let mut source = PathBuf::from(env::current_dir().unwrap().parent().unwrap()); source.push("tests/data/packs/pack-d50df695086eea6253a237cb5ac44af1629e7ced.pack"); + let tmp = PathBuf::from("/tmp"); + let f = std::fs::File::open(source).unwrap(); let mut buffered = BufReader::new(f); let mut p = Pack {number: 0, signature: SHA1::default()}; - p.decode(&mut buffered).unwrap(); + p.decode(&mut buffered, 0, tmp).unwrap(); } } \ No newline at end of file