Skip to content
Merged
40 changes: 40 additions & 0 deletions src/metrics.rs
Original file line number Diff line number Diff line change
Expand Up @@ -34,6 +34,12 @@ pub struct Metrics {
/// Number of blocks that were read from block cache
pub(crate) data_block_load_cached: AtomicUsize,

/// Number of range tombstone blocks that were actually read from disk
pub(crate) range_tombstone_block_load_io: AtomicUsize,

/// Number of range tombstone blocks that were read from block cache
pub(crate) range_tombstone_block_load_cached: AtomicUsize,

/// Number of filter queries that were performed
pub(crate) filter_queries: AtomicUsize,

Expand All @@ -48,6 +54,9 @@ pub struct Metrics {

/// Number of filter block bytes that were requested from OS or disk
pub(crate) filter_block_io_requested: AtomicU64,

/// Number of range tombstone block bytes that were requested from OS or disk
pub(crate) range_tombstone_block_io_requested: AtomicU64,
}

#[expect(
Expand Down Expand Up @@ -82,11 +91,17 @@ impl Metrics {
self.filter_block_io_requested.load(Relaxed)
}

/// Number of I/O range tombstone block bytes transferred from disk or OS page cache.
pub fn range_tombstone_block_io(&self) -> u64 {
self.range_tombstone_block_io_requested.load(Relaxed)
}

/// Number of I/O block bytes transferred from disk or OS page cache.
pub fn block_io(&self) -> u64 {
self.data_block_io_requested.load(Relaxed)
+ self.index_block_io_requested.load(Relaxed)
+ self.filter_block_io_requested.load(Relaxed)
+ self.range_tombstone_block_io_requested.load(Relaxed)
}
Comment thread
polaz marked this conversation as resolved.

/// Number of data blocks that were accessed.
Expand All @@ -104,11 +119,18 @@ impl Metrics {
self.filter_block_load_cached.load(Relaxed) + self.filter_block_load_io.load(Relaxed)
}

/// Number of range tombstone blocks that were accessed.
pub fn range_tombstone_block_load_count(&self) -> usize {
self.range_tombstone_block_load_cached.load(Relaxed)
+ self.range_tombstone_block_load_io.load(Relaxed)
}

/// Number of blocks that were loaded from disk or OS page cache.
pub fn block_load_io_count(&self) -> usize {
self.data_block_load_io.load(Relaxed)
+ self.index_block_load_io.load(Relaxed)
+ self.filter_block_load_io.load(Relaxed)
+ self.range_tombstone_block_load_io.load(Relaxed)
}

/// Number of data blocks that were loaded from disk or OS page cache.
Expand All @@ -126,11 +148,17 @@ impl Metrics {
self.filter_block_load_cached.load(Relaxed)
}

/// Number of range tombstone blocks that were loaded from block cache.
pub fn range_tombstone_block_load_cached_count(&self) -> usize {
self.range_tombstone_block_load_cached.load(Relaxed)
}

/// Number of blocks that were loaded from disk or OS page cache.
pub fn block_load_cached_count(&self) -> usize {
self.data_block_load_cached.load(Relaxed)
+ self.index_block_load_cached.load(Relaxed)
+ self.filter_block_load_cached.load(Relaxed)
+ self.range_tombstone_block_load_cached.load(Relaxed)
Comment thread
polaz marked this conversation as resolved.
Outdated
}

/// Number of blocks that were accessed.
Expand Down Expand Up @@ -174,6 +202,18 @@ impl Metrics {
}
}

/// Range tombstone block cache efficiency in percent (0.0 - 1.0).
pub fn range_tombstone_block_cache_hit_rate(&self) -> f64 {
let queries = self.range_tombstone_block_load_count() as f64;
let hits = self.range_tombstone_block_load_cached_count() as f64;

if queries == 0.0 {
1.0
} else {
hits / queries
}
}

/// Block cache efficiency in percent (0.0 - 1.0).
pub fn block_cache_hit_rate(&self) -> f64 {
let queries = self.block_loads() as f64;
Expand Down
19 changes: 14 additions & 5 deletions src/table/util.rs
Original file line number Diff line number Diff line change
Expand Up @@ -60,9 +60,12 @@ pub fn load_block(
BlockType::Index => {
metrics.index_block_load_cached.fetch_add(1, Relaxed);
}
// TODO(#34): RangeTombstone counted under data_block metrics — add
// dedicated range_tombstone_block_load_cached/miss counters
BlockType::Data | BlockType::Meta | BlockType::RangeTombstone => {
BlockType::RangeTombstone => {
metrics
.range_tombstone_block_load_cached
.fetch_add(1, Relaxed);
}
BlockType::Data | BlockType::Meta => {
metrics.data_block_load_cached.fetch_add(1, Relaxed);
Comment thread
polaz marked this conversation as resolved.
}
}
Expand Down Expand Up @@ -109,8 +112,14 @@ pub fn load_block(
.index_block_io_requested
.fetch_add(handle.size().into(), Relaxed);
}
// TODO(#34): same as above — RangeTombstone uses data_block IO counters
BlockType::Data | BlockType::Meta | BlockType::RangeTombstone => {
BlockType::RangeTombstone => {
metrics.range_tombstone_block_load_io.fetch_add(1, Relaxed);

metrics
.range_tombstone_block_io_requested
.fetch_add(handle.size().into(), Relaxed);
}
BlockType::Data | BlockType::Meta => {
metrics.data_block_load_io.fetch_add(1, Relaxed);

metrics
Expand Down
Loading