pub const RECOVERY_MAGIC: &[u8; 4] = b"RECV";
pub const RECOVERY_VERSION: u32 = 1;
pub const RECOVERY_PROGRESS_MAGIC: &[u8; 4] = b"RPRO";
pub const RECOVERY_COMPLETION_MAGIC: &[u8; 4] = b"RCMP";
pub const MIN_RECOVERY_SIZE: u64 = 1024;
pub const MAX_RECOVERY_SIZE: u64 = 500 * 1024 * 1024;
pub const DEFAULT_BATCH_SIZE: usize = 1000;
pub const RECOVERY_PROGRESS_INTERVAL: usize = 100;
pub const MAX_INCOMPLETE_TRANSACTIONS: usize = 100;
pub const MAX_WAL_SIZE_FOR_AUTO_RECOVERY: u64 = 1024 * 1024 * 1024;
pub const MAX_RECOVERY_ATTEMPTS: u32 = 5;
pub const DEFAULT_RECOVERY_TIMEOUT_SECONDS: u64 = 300;
pub const FAST_RECOVERY_TIMEOUT_SECONDS: u64 = 60;
pub const EMERGENCY_RECOVERY_TIMEOUT_SECONDS: u64 = 30;
pub const RECOVERY_RETRY_BACKOFF_MULTIPLIER: f64 = 2.0;
pub const MAX_RETRY_DELAY_SECONDS: u64 = 60;
pub const MIN_RETRY_DELAY_SECONDS: u64 = 5;
pub mod transaction {
pub const MAX_TRANSACTION_SIZE: u64 = 10 * 1024 * 1024;
pub const MAX_RECORDS_PER_TRANSACTION: usize = 10000;
pub const MAX_TRANSACTION_AGE_SECONDS: u64 = 3600;
pub const CONSISTENCY_CHECK_TIMEOUT_MS: u64 = 5000;
pub const MAX_ORPHANED_RECORDS: usize = 100;
pub const DUPLICATE_DETECTION_WINDOW: u64 = 1000; }
pub mod scanning {
pub const WAL_SCAN_CHUNK_SIZE: usize = 64 * 1024;
pub const MAX_READ_BUFFER_SIZE: usize = 1024 * 1024;
pub const WAL_SCANNER_QUEUE_SIZE: usize = 1000;
pub const WAL_SCAN_PROGRESS_INTERVAL: u8 = 10;
pub const MAX_IN_MEMORY_SCAN_SIZE: u64 = 100 * 1024 * 1024;
pub const WAL_SCANNER_TIMEOUT_SECONDS: u64 = 120; }
pub mod v2 {
pub const MAX_CLUSTER_OPERATIONS_PER_RECOVERY: usize = 250;
pub const MAX_EDGE_CLUSTER_OPERATIONS_PER_RECOVERY: usize = 500;
pub const MAX_NODE_RECORD_OPERATIONS_PER_RECOVERY: usize = 375;
pub const MAX_STRING_TABLE_OPERATIONS_PER_RECOVERY: usize = 125;
pub const MAX_FREE_SPACE_OPERATIONS_PER_RECOVERY: usize = 50;
pub const V2_RECOVERY_METADATA_SIZE: usize = 1024;
pub const CLUSTER_AWARE_PRIORITY_BOOST: f64 = 1.5;
pub const V2_GRAPH_RECOVERY_BLOCK_SIZE: u64 = 4096;
pub const V2_RECOVERY_CLUSTER_ALIGNMENT: u64 = 64 * 1024; }
pub mod performance {
pub const TARGET_RECOVERY_THROUGHPUT_RPS: u64 = 10000;
pub const MAX_RECOVERY_DURATION_SECONDS: u64 = 600;
pub const RECOVERY_IO_UTILIZATION_TARGET: f64 = 0.8;
pub const RECOVERY_MEMORY_UTILIZATION_TARGET: f64 = 0.7;
pub const RECOVERY_CPU_UTILIZATION_TARGET: f64 = 0.6;
pub const BASELINE_RECOVERY_MB_PER_SECOND: f64 = 50.0;
}
pub mod strategies {
pub const CONSERVATIVE_BATCH_SIZE: usize = 250;
pub const CONSERVATIVE_TIMEOUT_SECONDS: u64 = 600;
pub const CONSERVATIVE_MAX_ATTEMPTS: u32 = 3;
pub const BALANCED_BATCH_SIZE: usize = 1000;
pub const BALANCED_TIMEOUT_SECONDS: u64 = 300;
pub const BALANCED_MAX_ATTEMPTS: u32 = 5;
pub const AGGRESSIVE_BATCH_SIZE: usize = 2000;
pub const AGGRESSIVE_TIMEOUT_SECONDS: u64 = 120;
pub const AGGRESSIVE_MAX_ATTEMPTS: u32 = 7;
pub const EMERGENCY_BATCH_SIZE: usize = 5000;
pub const EMERGENCY_TIMEOUT_SECONDS: u64 = 60;
pub const EMERGENCY_MAX_ATTEMPTS: u32 = 1;
}
pub mod validation {
pub const MAX_SIZE_VARIANCE_PERCENT: f64 = 0.1;
pub const MAX_TRANSACTION_VARIANCE_PERCENT: f64 = 0.05;
pub const MAX_DURATION_VARIANCE_PERCENT: f64 = 0.3;
pub const MAX_INTEGRITY_ERRORS: usize = 5;
pub const CONSISTENCY_CHECK_TIMEOUT_SECONDS: u64 = 30;
pub const CONSISTENCY_CHECK_TIMEOUT_MS: u64 = 5000;
pub const DATA_VALIDATION_SAMPLE_RATE: f64 = 0.1;
pub const CHECKPOINT_VALIDATION_TIMEOUT_SECONDS: u64 = 15;
}
pub mod format {
pub const RECOVERY_HEADER_SIZE: usize = 32;
pub const PROGRESS_RECORD_SIZE: usize = 16;
pub const COMPLETION_RECORD_SIZE: usize = 20;
pub const METADATA_RECORD_SIZE: usize = 64;
pub const MAX_METADATA_RECORDS: usize = 100;
pub const RECOVERY_FILE_ALIGNMENT: u64 = 4096;
pub const CHECKSUM_ALGORITHM: u8 = 1; }
pub mod state_machine {
pub const MAX_STATE_TRANSITIONS_PER_SECOND: u32 = 100;
pub const STATE_TRANSITION_TIMEOUT_SECONDS: u64 = 60;
pub const MAX_RECOVERY_DEPTH: usize = 3;
pub const STATE_PERSISTENCE_INTERVAL: u32 = 10;
pub const STATE_RECOVERY_VALIDATION_WINDOW: u64 = 1000; }
pub mod monitoring {
pub const METRICS_COLLECTION_INTERVAL_MS: u64 = 1000;
pub const PERFORMANCE_REPORTING_INTERVAL_MS: u64 = 5000;
pub const HEALTH_CHECK_INTERVAL_SECONDS: u64 = 30;
pub const ANOMALY_DETECTION_WINDOW_SECONDS: u64 = 300;
pub const RESOURCE_REPORTING_INTERVAL_SECONDS: u64 = 10;
pub const MAX_RECOVERY_LOGS_RETAINED: usize = 1000;
}
#[cfg(test)]
mod tests {
use super::*;
#[test]
fn test_recovery_magic_constants() {
assert_eq!(RECOVERY_MAGIC, b"RECV");
assert_eq!(RECOVERY_VERSION, 1);
assert_eq!(RECOVERY_PROGRESS_MAGIC, b"RPRO");
assert_eq!(RECOVERY_COMPLETION_MAGIC, b"RCMP");
}
#[test]
fn test_size_constants() {
assert_eq!(MIN_RECOVERY_SIZE, 1024);
assert_eq!(MAX_RECOVERY_SIZE, 500 * 1024 * 1024);
assert!(DEFAULT_BATCH_SIZE > 0);
assert!(DEFAULT_BATCH_SIZE <= transaction::MAX_RECORDS_PER_TRANSACTION);
}
#[test]
fn test_v2_constants() {
assert!(v2::MAX_CLUSTER_OPERATIONS_PER_RECOVERY > 0);
assert!(
v2::MAX_EDGE_CLUSTER_OPERATIONS_PER_RECOVERY >= v2::MAX_CLUSTER_OPERATIONS_PER_RECOVERY
);
assert_eq!(v2::V2_GRAPH_RECOVERY_BLOCK_SIZE, 4096);
assert_eq!(v2::V2_RECOVERY_CLUSTER_ALIGNMENT, 64 * 1024);
}
#[test]
fn test_performance_constants() {
assert!(performance::TARGET_RECOVERY_THROUGHPUT_RPS > 0);
assert!(performance::TARGET_RECOVERY_THROUGHPUT_RPS < 100000); assert!(performance::RECOVERY_IO_UTILIZATION_TARGET > 0.0);
assert!(performance::RECOVERY_IO_UTILIZATION_TARGET <= 1.0);
assert!(performance::RECOVERY_MEMORY_UTILIZATION_TARGET > 0.0);
assert!(performance::RECOVERY_MEMORY_UTILIZATION_TARGET <= 1.0);
assert!(performance::RECOVERY_CPU_UTILIZATION_TARGET > 0.0);
assert!(performance::RECOVERY_CPU_UTILIZATION_TARGET <= 1.0);
}
#[test]
fn test_strategy_constants() {
assert!(strategies::CONSERVATIVE_BATCH_SIZE < strategies::BALANCED_BATCH_SIZE);
assert!(strategies::BALANCED_BATCH_SIZE < strategies::AGGRESSIVE_BATCH_SIZE);
assert!(strategies::AGGRESSIVE_BATCH_SIZE < strategies::EMERGENCY_BATCH_SIZE);
assert!(strategies::CONSERVATIVE_TIMEOUT_SECONDS > strategies::BALANCED_TIMEOUT_SECONDS);
assert!(strategies::BALANCED_TIMEOUT_SECONDS > strategies::AGGRESSIVE_TIMEOUT_SECONDS);
assert!(strategies::AGGRESSIVE_TIMEOUT_SECONDS > strategies::EMERGENCY_TIMEOUT_SECONDS);
}
#[test]
fn test_validation_constants() {
assert!(validation::MAX_SIZE_VARIANCE_PERCENT > 0.0);
assert!(validation::MAX_SIZE_VARIANCE_PERCENT < 1.0);
assert!(validation::MAX_TRANSACTION_VARIANCE_PERCENT > 0.0);
assert!(validation::MAX_TRANSACTION_VARIANCE_PERCENT < 1.0);
assert!(validation::MAX_DURATION_VARIANCE_PERCENT > 0.0);
assert!(validation::MAX_DURATION_VARIANCE_PERCENT < 1.0);
}
#[test]
fn test_format_constants() {
let expected_header_size = 4 + 4 + 8 + 8 + 8; assert_eq!(format::RECOVERY_HEADER_SIZE, expected_header_size);
let expected_progress_size = 4 + 4 + 8; assert_eq!(format::PROGRESS_RECORD_SIZE, expected_progress_size);
let expected_completion_size = 4 + 4 + 8 + 4; assert_eq!(format::COMPLETION_RECORD_SIZE, expected_completion_size);
}
#[test]
fn test_reasonableness() {
assert!(MAX_RECOVERY_ATTEMPTS > 0 && MAX_RECOVERY_ATTEMPTS < 20);
assert!(DEFAULT_RECOVERY_TIMEOUT_SECONDS > 0 && DEFAULT_RECOVERY_TIMEOUT_SECONDS < 3600);
assert!(
RECOVERY_RETRY_BACKOFF_MULTIPLIER > 1.0 && RECOVERY_RETRY_BACKOFF_MULTIPLIER < 10.0
);
assert!(MAX_RETRY_DELAY_SECONDS >= MIN_RETRY_DELAY_SECONDS);
}
}