use std::fmt;
use std::path::PathBuf;
use std::sync::atomic::{AtomicU64, Ordering};
macro_rules! define_runtime_stats {
(
$(
($field:ident, $doc:literal, $method:ident)
),* $(,)?
) => {
#[derive(Debug, Default)]
pub struct RuntimeStats {
$(
#[doc = $doc]
pub(crate) $field: AtomicU64,
)*
}
#[derive(Debug, Clone, Copy, serde::Serialize, serde::Deserialize)]
pub struct RuntimeStatsSnapshot {
$(
#[doc = concat!("Total ", stringify!($field), ".")]
pub $field: u64,
)*
}
impl RuntimeStats {
pub fn consume_snapshot(&self) -> RuntimeStatsSnapshot {
let v = RuntimeStatsSnapshot {
$(
$field: self.$field.load(Ordering::Relaxed),
)*
};
self.reset();
v
}
$(
#[inline]
pub fn $method(&self) {
self.$field.fetch_add(1, Ordering::Relaxed);
}
)*
pub fn reset(&self) {
$(
self.$field.store(0, Ordering::Relaxed);
)*
}
}
impl fmt::Display for RuntimeStats {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, "RuntimeStats:")?;
$(
writeln!(f, " {}: {}", stringify!($field), self.$field.load(Ordering::Relaxed))?;
)*
Ok(())
}
}
impl fmt::Display for RuntimeStatsSnapshot {
fn fmt(&self, f: &mut fmt::Formatter<'_>) -> fmt::Result {
writeln!(f, "RuntimeStatsSnapshot:")?;
$(
writeln!(f, " {}: {}", stringify!($field), self.$field)?;
)*
Ok(())
}
}
};
}
define_runtime_stats! {
(get, "Number of `get` calls issued via `CachedData`.", incr_get),
(get_with_selection, "Number of `get_with_selection` calls issued via `CachedData`.", incr_get_with_selection),
(eval_predicate, "Number of `eval_predicate` calls issued via `CachedData`.", incr_eval_predicate),
(get_squeezed_success, "Number of Squeezed-Liquid full evaluations finished without IO.", incr_get_squeezed_success),
(get_squeezed_needs_io, "Number of Squeezed-Liquid full paths that required IO.", incr_get_squeezed_needs_io),
(try_read_liquid_calls, "Number of `try_read_liquid` calls issued via `CachedData`.", incr_try_read_liquid),
(hit_date32_expression_calls, "Number of `hit_date32_expression` calls.", incr_hit_date32_expression),
(read_io_count, "Number of read IO operations.", incr_read_io_count),
(write_io_count, "Number of write IO operations.", incr_write_io_count),
(eval_predicate_on_liquid_failed, "Number of `eval_predicate` calls that failed on Liquid array.", incr_eval_predicate_on_liquid_failed),
(squeezed_decompressed_count, "Number of decompressed Squeezed-Liquid entries.", __incr_squeezed_decompressed_count),
(squeezed_total_count, "Total number of Squeezed-Liquid entries.", __incr_squeezed_total_count),
(squeeze_io_saved, "Number of io saved by squeezing.", incr_squeeze_io_saved),
}
impl RuntimeStats {
pub fn track_decompress_squeezed_count(&self, decompressed: usize, total: usize) {
self.squeezed_decompressed_count
.fetch_add(decompressed as u64, Ordering::Relaxed);
self.squeezed_total_count
.fetch_add(total as u64, Ordering::Relaxed);
}
}
#[derive(Debug, Clone, serde::Serialize, serde::Deserialize)]
pub struct CacheStats {
pub total_entries: usize,
pub memory_arrow_entries: usize,
pub memory_liquid_entries: usize,
pub memory_squeezed_liquid_entries: usize,
pub disk_liquid_entries: usize,
pub disk_arrow_entries: usize,
pub memory_arrow_bytes: usize,
pub memory_liquid_bytes: usize,
pub memory_squeezed_liquid_bytes: usize,
pub memory_usage_bytes: usize,
pub disk_usage_bytes: usize,
pub max_cache_bytes: usize,
pub cache_root_dir: PathBuf,
pub runtime: RuntimeStatsSnapshot,
}