fst_incremental 1.0.0

A thread-safe, updatable finite state set: dynamic insertions, deletions and queries over an immutable fst::Set fronted by a compact mutation buffer with amortized rebuilds.
Documentation
use std::sync::atomic::{AtomicU64, AtomicUsize, Ordering as AtomicOrdering};

#[derive(Debug, Default)]
pub(crate) struct FstMetrics {
  pub(crate) num_rebuilds: AtomicUsize,
  pub(crate) add_buffer_items_at_rebuild_sum: AtomicUsize,
  pub(crate) del_buffer_items_at_rebuild_sum: AtomicUsize,
  pub(crate) rebuild_duration_micros_sum: AtomicU64,
  pub(crate) persisted_keys_at_rebuild_sum: AtomicUsize,
}

impl FstMetrics {
  pub(crate) fn snapshot(&self) -> FstMetricsSnapshot {
    FstMetricsSnapshot {
      num_rebuilds: self.num_rebuilds.load(AtomicOrdering::Relaxed),
      add_buffer_items_at_rebuild_sum: self.add_buffer_items_at_rebuild_sum.load(AtomicOrdering::Relaxed),
      del_buffer_items_at_rebuild_sum: self.del_buffer_items_at_rebuild_sum.load(AtomicOrdering::Relaxed),
      rebuild_duration_micros_sum: self.rebuild_duration_micros_sum.load(AtomicOrdering::Relaxed),
      persisted_keys_at_rebuild_sum: self.persisted_keys_at_rebuild_sum.load(AtomicOrdering::Relaxed),
    }
  }
}

/// Cumulative rebuild counters, read via [`crate::IncrementalFstSet::get_metrics`].
///
/// Every field is a running total over the lifetime of the set, not a rate. Divide
/// by `num_rebuilds` for a per-rebuild average.
#[derive(Debug, Clone, Copy)]
#[non_exhaustive]
pub struct FstMetricsSnapshot {
  /// Number of rebuilds completed.
  pub num_rebuilds: usize,
  /// Sum of live buffer entries observed at the start of each rebuild.
  pub add_buffer_items_at_rebuild_sum: usize,
  /// Sum of tombstoned buffer entries observed at the start of each rebuild.
  pub del_buffer_items_at_rebuild_sum: usize,
  /// Total wall time spent rebuilding, in microseconds.
  pub rebuild_duration_micros_sum: u64,
  /// Sum of persisted key counts observed at the start of each rebuild.
  pub persisted_keys_at_rebuild_sum: usize,
}