pub mod gc_stats;
pub mod merge;
pub mod meta;
pub mod multi_writer;
pub mod reader;
pub mod trailer;
pub mod writer;
use crate::{id::SegmentId, Compressor};
use gc_stats::GcStats;
use meta::Metadata;
use std::{marker::PhantomData, path::PathBuf};
#[derive(Debug)]
pub struct Segment<C: Compressor + Clone> {
pub id: SegmentId,
pub path: PathBuf,
pub meta: Metadata,
pub gc_stats: GcStats,
pub(crate) _phantom: PhantomData<C>,
}
impl<C: Compressor + Clone> Segment<C> {
pub fn scan(&self) -> crate::Result<reader::Reader<C>> {
reader::Reader::new(&self.path, self.id)
}
pub fn is_empty(&self) -> bool {
false
}
pub fn len(&self) -> u64 {
self.meta.item_count
}
pub(crate) fn mark_as_stale(&self) {
self.gc_stats.set_stale_items(self.meta.item_count);
self.gc_stats
.set_stale_bytes(self.meta.total_uncompressed_bytes);
}
pub fn is_stale(&self) -> bool {
self.gc_stats.stale_items() == self.meta.item_count
}
#[allow(clippy::cast_precision_loss)]
pub fn stale_ratio(&self) -> f32 {
let dead = self.gc_stats.stale_items() as f32;
if dead == 0.0 {
return 0.0;
}
dead / self.meta.item_count as f32
}
}