use std::collections::HashSet;
use std::io::Result;
use std::sync::RwLock;
use nydus_utils::digest::RafsDigest;
use crate::cache::state::{ChunkIndexGetter, ChunkMap};
use crate::device::BlobChunkInfo;
#[derive(Default)]
pub struct DigestedChunkMap {
cache: RwLock<HashSet<RafsDigest>>,
}
impl DigestedChunkMap {
pub fn new() -> Self {
Self {
cache: RwLock::new(HashSet::new()),
}
}
}
impl ChunkMap for DigestedChunkMap {
fn is_ready(&self, chunk: &dyn BlobChunkInfo) -> Result<bool> {
Ok(self.cache.read().unwrap().contains(chunk.chunk_id()))
}
fn set_ready_and_clear_pending(&self, chunk: &dyn BlobChunkInfo) -> Result<()> {
self.cache.write().unwrap().insert(*chunk.chunk_id());
Ok(())
}
}
impl ChunkIndexGetter for DigestedChunkMap {
type Index = RafsDigest;
fn get_index(chunk: &dyn BlobChunkInfo) -> Self::Index {
*chunk.chunk_id()
}
}