mod id_tracker_read;
mod lifecycle;
mod live_reload;
use std::path::PathBuf;
use std::sync::OnceLock;
use crate::common::bitvec::BitVec;
use crate::common::stored_bitslice::StoredBitSlice;
use crate::common::universal_io::{TypedStorage, UniversalRead};
use super::on_disk_format::{e2i_path, i2e_path, is_uuid_path};
use super::reader::DiskMappingReader;
use crate::segment::common::operation_error::OperationResult;
use crate::segment::id_tracker::immutable_id_tracker::{deleted_path, version_mapping_path};
use crate::segment::types::SeqNumberType;
pub struct ReadOnlyDiskIdTracker<S: UniversalRead> {
path: PathBuf,
reader: DiskMappingReader<S>,
versions: TypedStorage<S, SeqNumberType>,
versions_len: u64,
deleted_file: StoredBitSlice<S>,
deleted_full: OnceLock<BitVec>,
}
impl<S: UniversalRead> ReadOnlyDiskIdTracker<S> {
pub fn files(&self) -> Vec<PathBuf> {
vec![
i2e_path(&self.path),
e2i_path(&self.path),
is_uuid_path(&self.path),
version_mapping_path(&self.path),
deleted_path(&self.path),
]
}
fn deleted_full(&self) -> OperationResult<&BitVec> {
if let Some(materialized) = self.deleted_full.get() {
return Ok(materialized);
}
let materialized = self.deleted_file.read_all()?.into_owned();
let _ = self.deleted_full.set(materialized);
Ok(self.deleted_full.get().expect("just set"))
}
#[cfg(test)]
pub(crate) fn deleted_full_materialized(&self) -> bool {
self.deleted_full.get().is_some()
}
}