use std::num::NonZeroUsize;
use cid::Cid;
use nonzero_ext::nonzero;
use crate::utils::{ShallowClone, cache::SizeTrackingLruCache, get_size};
const DEFAULT_CID_CACHE_CAPACITY: NonZeroUsize = nonzero!(1usize << 15);
#[derive(Debug)]
pub struct BadBlockCache {
cache: SizeTrackingLruCache<get_size::CidWrapper, ()>,
}
impl Default for BadBlockCache {
fn default() -> Self {
Self::new(DEFAULT_CID_CACHE_CAPACITY)
}
}
impl BadBlockCache {
pub fn new(cap: NonZeroUsize) -> Self {
Self {
cache: SizeTrackingLruCache::new_with_metrics("bad_block".into(), cap),
}
}
pub fn push(&self, c: Cid) {
self.cache.push(c.into(), ());
tracing::warn!("Marked bad block: {c}");
}
pub fn peek(&self, c: &Cid) -> Option<()> {
self.cache.peek_cloned(&(*c).into())
}
pub fn clear(&self) {
self.cache.clear()
}
}
#[derive(Debug)]
pub struct SeenBlockCache {
cache: SizeTrackingLruCache<get_size::CidWrapper, ()>,
}
impl ShallowClone for SeenBlockCache {
fn shallow_clone(&self) -> Self {
Self {
cache: self.cache.shallow_clone(),
}
}
}
impl Default for SeenBlockCache {
fn default() -> Self {
Self::new(DEFAULT_CID_CACHE_CAPACITY)
}
}
impl SeenBlockCache {
pub fn new(cap: NonZeroUsize) -> Self {
Self {
cache: SizeTrackingLruCache::new_with_metrics("seen_gossip_block".into(), cap),
}
}
pub fn test_and_insert(&self, c: &Cid) -> bool {
self.cache.push((*c).into(), ()).is_some()
}
}