use std::sync::Arc;
use std::sync::atomic::AtomicUsize;
#[derive(Debug, Clone)]
pub enum ArrowReaderMetrics {
Disabled,
Enabled(Arc<ArrowReaderMetricsInner>),
}
impl ArrowReaderMetrics {
pub fn disabled() -> Self {
Self::Disabled
}
pub fn enabled() -> Self {
Self::Enabled(Arc::new(ArrowReaderMetricsInner::new()))
}
pub fn records_read_from_inner(&self) -> Option<usize> {
match self {
Self::Disabled => None,
Self::Enabled(inner) => Some(
inner
.records_read_from_inner
.load(std::sync::atomic::Ordering::Relaxed),
),
}
}
pub fn records_read_from_cache(&self) -> Option<usize> {
match self {
Self::Disabled => None,
Self::Enabled(inner) => Some(
inner
.records_read_from_cache
.load(std::sync::atomic::Ordering::Relaxed),
),
}
}
pub(crate) fn increment_inner_reads(&self, count: usize) {
let Self::Enabled(inner) = self else {
return;
};
inner
.records_read_from_inner
.fetch_add(count, std::sync::atomic::Ordering::Relaxed);
}
pub(crate) fn increment_cache_reads(&self, count: usize) {
let Self::Enabled(inner) = self else {
return;
};
inner
.records_read_from_cache
.fetch_add(count, std::sync::atomic::Ordering::Relaxed);
}
}
#[derive(Debug)]
pub struct ArrowReaderMetricsInner {
records_read_from_inner: AtomicUsize,
records_read_from_cache: AtomicUsize,
}
impl ArrowReaderMetricsInner {
pub(crate) fn new() -> Self {
Self {
records_read_from_inner: AtomicUsize::new(0),
records_read_from_cache: AtomicUsize::new(0),
}
}
}