use std::sync::atomic::{AtomicU64, Ordering};
mod ownership;
mod snapshot_support;
pub use ownership::{
ConflictType, PAGE_OWNERSHIP, PageConflict, PageCorruption, PageOwnershipRecord,
PageOwnershipRegistry, PageScanReport, PageType, Subsystem, get_first_conflict_page,
get_page_registry, has_page_conflicts, print_page_ownership_map, print_page_ownership_report,
reset_page_ownership, scan_database_pages,
};
pub use snapshot_support::{ForensicDelta, ForensicSnapshot};
pub static FORENSIC_COUNTERS: ForensicCounters = ForensicCounters {
logical_insert_node_calls: AtomicU64::new(0),
logical_insert_edge_calls: AtomicU64::new(0),
btree_insert_calls: AtomicU64::new(0),
btree_split_count: AtomicU64::new(0),
page_allocate_count: AtomicU64::new(0),
page_write_count: AtomicU64::new(0),
wal_append_count: AtomicU64::new(0),
wal_flush_count: AtomicU64::new(0),
checkpoint_count: AtomicU64::new(0),
node_encode_count: AtomicU64::new(0),
edge_encode_count: AtomicU64::new(0),
sync_data_count: AtomicU64::new(0),
sync_all_count: AtomicU64::new(0),
logical_get_node_calls: AtomicU64::new(0),
logical_neighbors_calls: AtomicU64::new(0),
btree_lookup_calls: AtomicU64::new(0),
page_read_count: AtomicU64::new(0),
node_decode_count: AtomicU64::new(0),
edge_decode_count: AtomicU64::new(0),
btree_cache_hit_count: AtomicU64::new(0),
btree_cache_miss_count: AtomicU64::new(0),
node_cache_hit_count: AtomicU64::new(0),
node_cache_miss_count: AtomicU64::new(0),
btree_read_lock_count: AtomicU64::new(0),
btree_write_lock_count: AtomicU64::new(0),
dirty_page_hit_count: AtomicU64::new(0),
node_page_cache_hit_count: AtomicU64::new(0),
node_page_cache_miss_count: AtomicU64::new(0),
redundant_page_reload_count: AtomicU64::new(0),
edge_cache_hit_count: AtomicU64::new(0),
edge_cache_miss_count: AtomicU64::new(0),
edge_page_read_count: AtomicU64::new(0),
last_btree_pages_read: AtomicU64::new(0), last_node_pages_read: AtomicU64::new(0),
node_page_unpack_count: AtomicU64::new(0), node_linear_scan_steps: AtomicU64::new(0), btree_traversal_depth_total: AtomicU64::new(0), };
pub struct ForensicCounters {
pub logical_insert_node_calls: AtomicU64,
pub logical_insert_edge_calls: AtomicU64,
pub btree_insert_calls: AtomicU64,
pub btree_split_count: AtomicU64,
pub page_allocate_count: AtomicU64,
pub page_write_count: AtomicU64,
pub wal_append_count: AtomicU64,
pub wal_flush_count: AtomicU64,
pub checkpoint_count: AtomicU64,
pub node_encode_count: AtomicU64,
pub edge_encode_count: AtomicU64,
pub sync_data_count: AtomicU64,
pub sync_all_count: AtomicU64,
pub logical_get_node_calls: AtomicU64,
pub logical_neighbors_calls: AtomicU64,
pub btree_lookup_calls: AtomicU64,
pub page_read_count: AtomicU64,
pub node_decode_count: AtomicU64,
pub edge_decode_count: AtomicU64,
pub btree_cache_hit_count: AtomicU64,
pub btree_cache_miss_count: AtomicU64,
pub node_cache_hit_count: AtomicU64,
pub node_cache_miss_count: AtomicU64,
pub btree_read_lock_count: AtomicU64,
pub btree_write_lock_count: AtomicU64,
pub dirty_page_hit_count: AtomicU64, pub node_page_cache_hit_count: AtomicU64, pub node_page_cache_miss_count: AtomicU64, pub redundant_page_reload_count: AtomicU64,
pub edge_cache_hit_count: AtomicU64, pub edge_cache_miss_count: AtomicU64, pub edge_page_read_count: AtomicU64,
pub last_btree_pages_read: AtomicU64, pub last_node_pages_read: AtomicU64,
pub node_page_unpack_count: AtomicU64, pub node_linear_scan_steps: AtomicU64, pub btree_traversal_depth_total: AtomicU64, }
impl ForensicCounters {
pub fn reset(&self) {
self.logical_insert_node_calls.store(0, Ordering::Relaxed);
self.logical_insert_edge_calls.store(0, Ordering::Relaxed);
self.btree_insert_calls.store(0, Ordering::Relaxed);
self.btree_split_count.store(0, Ordering::Relaxed);
self.page_allocate_count.store(0, Ordering::Relaxed);
self.page_write_count.store(0, Ordering::Relaxed);
self.wal_append_count.store(0, Ordering::Relaxed);
self.wal_flush_count.store(0, Ordering::Relaxed);
self.checkpoint_count.store(0, Ordering::Relaxed);
self.node_encode_count.store(0, Ordering::Relaxed);
self.edge_encode_count.store(0, Ordering::Relaxed);
self.sync_data_count.store(0, Ordering::Relaxed);
self.sync_all_count.store(0, Ordering::Relaxed);
self.logical_get_node_calls.store(0, Ordering::Relaxed);
self.logical_neighbors_calls.store(0, Ordering::Relaxed);
self.btree_lookup_calls.store(0, Ordering::Relaxed);
self.page_read_count.store(0, Ordering::Relaxed);
self.node_decode_count.store(0, Ordering::Relaxed);
self.edge_decode_count.store(0, Ordering::Relaxed);
self.btree_cache_hit_count.store(0, Ordering::Relaxed);
self.btree_cache_miss_count.store(0, Ordering::Relaxed);
self.node_cache_hit_count.store(0, Ordering::Relaxed);
self.node_cache_miss_count.store(0, Ordering::Relaxed);
self.btree_read_lock_count.store(0, Ordering::Relaxed);
self.btree_write_lock_count.store(0, Ordering::Relaxed);
self.dirty_page_hit_count.store(0, Ordering::Relaxed);
self.node_page_cache_hit_count.store(0, Ordering::Relaxed);
self.node_page_cache_miss_count.store(0, Ordering::Relaxed);
self.redundant_page_reload_count.store(0, Ordering::Relaxed);
self.edge_cache_hit_count.store(0, Ordering::Relaxed);
self.edge_cache_miss_count.store(0, Ordering::Relaxed);
self.edge_page_read_count.store(0, Ordering::Relaxed);
self.last_btree_pages_read.store(0, Ordering::Relaxed);
self.last_node_pages_read.store(0, Ordering::Relaxed);
self.node_page_unpack_count.store(0, Ordering::Relaxed);
self.node_linear_scan_steps.store(0, Ordering::Relaxed);
self.btree_traversal_depth_total.store(0, Ordering::Relaxed);
}
}