make it impossible to fill up an unbounded amount of memory with caches

yeah storing Nones there is probably not a great idea isn't it
This commit is contained in:
liquidex 2024-11-23 22:18:10 +01:00
parent c87662419a
commit 645ae598f2
4 changed files with 32 additions and 26 deletions

View file

@ -81,7 +81,7 @@ pub struct DirEntry {
pub path: VPathBuf,
}
#[derive(Debug, Clone, PartialEq, Eq, PartialOrd, Ord)]
#[derive(Debug, Clone, Copy, PartialEq, Eq, PartialOrd, Ord)]
pub struct ImageSize {
pub width: u32,
pub height: u32,

View file

@ -11,7 +11,7 @@ use super::{walk_dir_rec, Dir, DirEntry, EditPath, ImageSize, VPath, VPathBuf};
pub struct ContentCache<T> {
inner: T,
cache: DashMap<VPathBuf, Option<Vec<u8>>>,
cache: DashMap<VPathBuf, Vec<u8>>,
}
impl<T> ContentCache<T> {
@ -48,10 +48,13 @@ where
}
fn content(&self, path: &VPath) -> Option<Vec<u8>> {
self.cache
.entry(path.to_owned())
.or_insert_with(|| self.inner.content(path))
.clone()
self.cache.get(path).map(|x| x.clone()).or_else(|| {
let content = self.inner.content(path);
if let Some(content) = &content {
self.cache.insert(path.to_owned(), content.clone());
}
content
})
}
fn content_version(&self, path: &VPath) -> Option<String> {

View file

@ -6,7 +6,7 @@ use super::{Dir, DirEntry, EditPath, ImageSize, VPath, VPathBuf};
pub struct Blake3ContentVersionCache<T> {
inner: T,
cache: DashMap<VPathBuf, Option<String>>,
cache: DashMap<VPathBuf, String>,
}
impl<T> Blake3ContentVersionCache<T> {
@ -31,15 +31,16 @@ where
}
fn content_version(&self, path: &VPath) -> Option<String> {
self.cache
.entry(path.to_owned())
.or_insert_with(|| {
self.content(path).map(|content| {
self.cache.get(path).map(|x| x.clone()).or_else(|| {
let version = self.inner.content(path).map(|content| {
let hash = blake3::hash(&content).to_hex();
format!("b3-{}", &hash[0..8])
});
if let Some(version) = &version {
self.cache.insert(path.to_owned(), version.clone());
}
version
})
})
.clone()
}
fn image_size(&self, path: &VPath) -> Option<ImageSize> {

View file

@ -10,7 +10,7 @@ use super::{Dir, DirEntry, EditPath, ImageSize, VPath, VPathBuf};
pub struct ImageSizeCache<T> {
inner: T,
cache: DashMap<VPathBuf, Option<ImageSize>>,
cache: DashMap<VPathBuf, ImageSize>,
}
impl<T> ImageSizeCache<T> {
@ -59,15 +59,17 @@ where
}
fn image_size(&self, path: &VPath) -> Option<ImageSize> {
self.cache
.entry(path.to_owned())
.or_insert_with(|| {
self.compute_image_size(path)
self.cache.get(path).map(|x| *x).or_else(|| {
let image_size = self
.compute_image_size(path)
.inspect_err(|err| warn!("compute_image_size({path}) failed: {err:?}"))
.ok()
.flatten()
.flatten();
if let Some(image_size) = image_size {
self.cache.insert(path.to_owned(), image_size);
}
image_size
})
.clone()
}
fn anchor(&self, path: &VPath) -> Option<VPathBuf> {