pub const CHECKPOINT_MAGIC: &[u8; 4] = b"CKPT";
pub const CHECKPOINT_VERSION: u32 = 1;
pub const PROGRESS_MAGIC: &[u8; 4] = b"PROG";
pub const COMPLETION_MAGIC: &[u8; 4] = b"DONE";
pub const MIN_CHECKPOINT_SIZE: u64 = 1024;
pub const MAX_CHECKPOINT_SIZE: u64 = 1024 * 1024 * 1024;
pub const DEFAULT_BATCH_SIZE: usize = 1000;
pub const PROGRESS_REPORT_INTERVAL: usize = DEFAULT_BATCH_SIZE * 10;
pub const MAX_DIRTY_BLOCKS_PER_CLUSTER: usize = 10_000;
pub const MAX_GLOBAL_DIRTY_BLOCKS: usize = 50_000;
pub const MAX_BLOCK_ACCESS_COUNTS: usize = 100_000;
pub const METRICS_SMOOTHING_ALPHA: f64 = 0.1;
pub const DEFAULT_CHECKPOINT_TIMEOUT_MS: u64 = 300_000;
pub const CHECKPOINT_WAIT_TIMEOUT_MS: u64 = 60_000;
pub const MAX_CHECKPOINT_RETRIES: u32 = 3;
pub const CHECKPOINT_RETRY_BACKOFF: f64 = 2.0;
pub const MIN_DIRTY_BLOCK_SIZE: u64 = 512;
pub const MAX_DIRTY_BLOCK_SIZE: u64 = 64 * 1024;
pub const DEFAULT_CHECKPOINT_BUFFER_SIZE: usize = 64 * 1024;
pub const CHECKPOINT_HEADER_SIZE: usize = 28;
pub const PROGRESS_RECORD_SIZE: usize = 16;
pub const COMPLETION_RECORD_SIZE: usize = 16;
pub const CHECKPOINT_METADATA_RESERVED: usize = 1024;
pub const DEFAULT_TIME_INTERVAL_SECONDS: u64 = 300;
pub const DEFAULT_TRANSACTION_THRESHOLD: u64 = 1000;
pub const DEFAULT_SIZE_THRESHOLD: u64 = 16 * 1024 * 1024;
pub const MAX_PROGRESS_ENTRIES: usize = 10_000;
pub const DIRTY_BLOCK_TIMESTAMP_RESOLUTION_MS: u64 = 1000;
pub const CHECKPOINT_SYNC_INTERVAL: usize = 100;
pub const MAX_CONCURRENT_CHECKPOINTS: usize = 1;
pub const CHECKPOINT_LOCK_TIMEOUT_MS: u64 = 30_000;
pub const CHECKPOINT_STATE_TIMEOUT_MS: u64 = 60_000;
pub const CHECKPOINT_VALIDATION_TIMEOUT_MS: u64 = 10_000;
pub const CHECKPOINT_IO_RETRY_COUNT: u32 = 3;
pub const CHECKPOINT_IO_RETRY_DELAY_MS: u64 = 100;
pub mod v2 {
pub const MAX_CLUSTER_OPERATIONS_PER_BATCH: usize = 500;
pub const MAX_EDGE_CLUSTER_OPERATIONS_PER_BATCH: usize = 1000;
pub const MAX_NODE_RECORD_OPERATIONS_PER_BATCH: usize = 750;
pub const MAX_STRING_TABLE_OPERATIONS_PER_BATCH: usize = 250;
pub const MAX_FREE_SPACE_OPERATIONS_PER_BATCH: usize = 100;
pub const V2_GRAPH_BLOCK_SIZE: u64 = 4096;
pub const V2_CLUSTER_ALIGNMENT: u64 = 64 * 1024;
pub const MAX_V2_DIRTY_BLOCKS_PER_CYCLE: u64 = 10_000;
pub const V2_CHECKPOINT_METADATA_SIZE: usize = 2048;
}
pub mod performance {
pub const TARGET_CHECKPOINT_THROUGHPUT_MBPS: f64 = 100.0;
pub const MAX_CHECKPOINT_DURATION_MS: u64 = 600_000;
pub const CHECKPOINT_IO_UTILIZATION_TARGET: f64 = 0.7;
pub const CHECKPOINT_MEMORY_UTILIZATION_TARGET: f64 = 0.5;
pub const CHECKPOINT_CPU_UTILIZATION_TARGET: f64 = 0.6; }
pub mod strategies {
pub const MIN_TIME_INTERVAL_SECONDS: u64 = 10;
pub const MAX_TIME_INTERVAL_SECONDS: u64 = 3600;
pub const MIN_SIZE_THRESHOLD: u64 = 1024 * 1024;
pub const MAX_SIZE_THRESHOLD: u64 = 1024 * 1024 * 1024;
pub const MIN_TRANSACTION_THRESHOLD: u64 = 1;
pub const MAX_TRANSACTION_THRESHOLD: u64 = 1_000_000;
pub const ADAPTIVE_MIN_INTERVAL_SECONDS: u64 = 30;
pub const ADAPTIVE_MAX_WAL_SIZE_MULTIPLIER: f64 = 4.0;
pub const ADAPTIVE_MAX_TX_MULTIPLIER: f64 = 2.0;
}
pub mod validation {
pub const MAX_SIZE_VARIANCE_PERCENT: f64 = 0.2;
pub const MAX_DURATION_VARIANCE_PERCENT: f64 = 0.3;
pub const MAX_INTEGRITY_ERRORS: usize = 10;
pub const CONSISTENCY_CHECK_TIMEOUT_MS: u64 = 30_000;
pub const MAX_ROLLBACK_VALIDATION_ATTEMPTS: u32 = 3;
pub const VALIDATION_SAMPLE_RATE: f64 = 0.1; }
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_checkpoint_magic_constants() {
assert_eq!(CHECKPOINT_MAGIC, b"CKPT");
assert_eq!(CHECKPOINT_VERSION, 1);
assert_eq!(PROGRESS_MAGIC, b"PROG");
assert_eq!(COMPLETION_MAGIC, b"DONE");
}
#[test]
fn test_size_constants() {
assert_eq!(MIN_CHECKPOINT_SIZE, 1024);
assert_eq!(MAX_CHECKPOINT_SIZE, 1024 * 1024 * 1024);
assert!(DEFAULT_BATCH_SIZE > 0);
assert!(PROGRESS_REPORT_INTERVAL > DEFAULT_BATCH_SIZE);
}
#[test]
fn test_v2_constants() {
assert!(v2::MAX_CLUSTER_OPERATIONS_PER_BATCH > 0);
assert!(v2::MAX_EDGE_CLUSTER_OPERATIONS_PER_BATCH > v2::MAX_CLUSTER_OPERATIONS_PER_BATCH);
assert_eq!(v2::V2_GRAPH_BLOCK_SIZE, 4096);
assert_eq!(v2::V2_CLUSTER_ALIGNMENT, 64 * 1024);
}
#[test]
fn test_performance_constants() {
assert!(performance::TARGET_CHECKPOINT_THROUGHPUT_MBPS > 0.0);
assert!(performance::TARGET_CHECKPOINT_THROUGHPUT_MBPS < 1000.0); assert!(performance::CHECKPOINT_IO_UTILIZATION_TARGET > 0.0);
assert!(performance::CHECKPOINT_IO_UTILIZATION_TARGET <= 1.0);
}
#[test]
fn test_strategy_constants() {
assert!(strategies::MIN_TIME_INTERVAL_SECONDS < strategies::MAX_TIME_INTERVAL_SECONDS);
assert!(strategies::MIN_SIZE_THRESHOLD < strategies::MAX_SIZE_THRESHOLD);
assert!(strategies::MIN_TRANSACTION_THRESHOLD < strategies::MAX_TRANSACTION_THRESHOLD);
}
#[test]
fn test_validation_constants() {
assert!(validation::MAX_SIZE_VARIANCE_PERCENT > 0.0);
assert!(validation::MAX_SIZE_VARIANCE_PERCENT < 1.0);
assert!(validation::MAX_DURATION_VARIANCE_PERCENT > 0.0);
assert!(validation::MAX_DURATION_VARIANCE_PERCENT < 1.0);
}
#[test]
fn test_header_size_calculation() {
let expected_header_size = 4 + 8 + 8 + 4 + 4; assert_eq!(CHECKPOINT_HEADER_SIZE, expected_header_size);
let expected_progress_size = 4 + 8 + 4; assert_eq!(PROGRESS_RECORD_SIZE, expected_progress_size);
let expected_completion_size = 4 + 8 + 4; assert_eq!(COMPLETION_RECORD_SIZE, expected_completion_size);
}
#[test]
fn test_constants_reasonableness() {
assert!(
MAX_CONCURRENT_CHECKPOINTS == 1,
"Only one checkpoint should run at a time for consistency"
);
assert!(METRICS_SMOOTHING_ALPHA > 0.0 && METRICS_SMOOTHING_ALPHA < 1.0);
assert!(MAX_CHECKPOINT_RETRIES > 0 && MAX_CHECKPOINT_RETRIES < 10);
assert!(CHECKPOINT_RETRY_BACKOFF > 1.0 && CHECKPOINT_RETRY_BACKOFF < 10.0);
}
}