#[cfg(feature = "metrics")]
use crate::metrics::Metrics;
use super::{block_index::BlockIndexImpl, meta::ParsedMeta, regions::ParsedRegions};
use crate::{
Checksum, GlobalTableId, SeqNo,
cache::Cache,
comparator::SharedComparator,
encryption::EncryptionProvider,
file_accessor::FileAccessor,
range_tombstone::RangeTombstone,
table::{IndexBlock, filter::block::FilterBlock},
tree::inner::TreeId,
};
use std::{
path::PathBuf,
sync::{Arc, OnceLock, atomic::AtomicBool},
};
pub struct Inner {
pub path: Arc<PathBuf>,
pub(crate) tree_id: TreeId,
#[doc(hidden)]
pub(crate) file_accessor: FileAccessor,
#[doc(hidden)]
pub metadata: ParsedMeta,
#[doc(hidden)]
pub regions: ParsedRegions,
#[doc(hidden)]
pub block_index: Arc<BlockIndexImpl>,
#[doc(hidden)]
pub cache: Arc<Cache>,
pub(super) pinned_filter_index: Option<IndexBlock>,
pub pinned_filter_block: Option<FilterBlock>,
pub is_deleted: AtomicBool,
pub(super) checksum: Checksum,
pub(super) global_seqno: SeqNo,
pub(crate) comparator: SharedComparator,
#[cfg(feature = "metrics")]
pub(crate) metrics: Arc<Metrics>,
pub(crate) cached_blob_bytes: OnceLock<u64>,
pub(crate) range_tombstones: Vec<RangeTombstone>,
pub(crate) encryption: Option<Arc<dyn EncryptionProvider>>,
#[cfg(zstd_any)]
pub(crate) zstd_dictionary: Option<Arc<crate::compression::ZstdDictionary>>,
}
impl Inner {
#[must_use]
pub(super) fn global_id(&self) -> GlobalTableId {
(self.tree_id, self.metadata.id).into()
}
}
impl Drop for Inner {
fn drop(&mut self) {
let global_id = self.global_id();
if self.is_deleted.load(std::sync::atomic::Ordering::Acquire) {
log::trace!("Cleanup deleted table {global_id:?} at {:?}", self.path);
if let Err(e) = std::fs::remove_file(&*self.path) {
log::warn!(
"Failed to cleanup deleted table {global_id:?} at {:?}: {e:?}",
self.path,
);
}
self.file_accessor.as_descriptor_table().inspect(|d| {
d.remove_for_table(&global_id);
});
}
}
}