use anyhow::{Result, anyhow};
use std::collections::{BTreeMap, HashMap};
use std::time::{Duration, Instant};
use std::sync::Arc;
use std::sync::Mutex;
use std::sync::atomic::AtomicUsize;
use std::sync::atomic::Ordering;
use std::time::SystemTime;
std::sync::{Arc, Mutex}, atomic::{AtomicUsize, Ordering}};
pub struct V8SnapshotOptimizedManager {
base_manager: V8SnapshotManager,
l1_cache: Arc<Mutex<HashMap<String, Arc<SnapshotEntry>>>>,
l2_cache: Arc<Mutex<HashMap<String, Arc<SnapshotEntry>>>>,
preloaded_snapshots: Arc<Mutex<Vec<String>>>,
stats: Arc<SnapshotOptimizationStats>,
}
#[derive(Debug, Clone)]
pub struct SnapshotEntry {
pub data: Arc<Vec<u8>>,
pub created_at: u64,
pub last_accessed: u64,
pub access_count: Arc<AtomicUsize>,
pub version: String,
}
#[derive(Debug, Clone, Default)]
pub struct SnapshotOptimizationStats {
pub l1_cache_hits: Arc<AtomicUsize>,
pub l1_cache_misses: Arc<AtomicUsize>,
pub l2_cache_hits: Arc<AtomicUsize>,
pub l2_cache_misses: Arc<AtomicUsize>,
pub preloaded_count: Arc<AtomicUsize>,
pub total_load_time_ms: Arc<AtomicUsize>,
pub load_count: Arc<AtomicUsize>,
pub avg_load_time_us: Arc<AtomicUsize>,
}
impl SnapshotOptimizationStats {
pub fn new() -> Self {
Self::default()
}
pub fn l1_hit_rate(&self) -> f64 {
let hits: _ = self.l1_cache_hits.load(Ordering::Relaxed) as f64;
let total: _ = hits + self.l1_cache_misses.load(Ordering::Relaxed) as f64;
if total > 0.0 { hits / total } else { 0.0 }
}
pub fn l2_hit_rate(&self) -> f64 {
let hits: _ = self.l2_cache_hits.load(Ordering::Relaxed) as f64;
let total: _ = hits + self.l2_cache_misses.load(Ordering::Relaxed) as f64;
if total > 0.0 { hits / total } else { 0.0 }
}
pub fn avg_load_time_us(&self) -> f64 {
let total_time: _ = self.total_load_time_ms.load(Ordering::Relaxed) as f64 * 1000.0;
let count: _ = self.load_count.load(Ordering::Relaxed) as f64;
if count > 0.0 { total_time / count } else { 0.0 }
}
pub fn record_load(&self, time_us: u64, cache_level: u8) {
self.total_load_time_ms.fetch_add((time_us / 1000) as usize, Ordering::Relaxed);
self.load_count.fetch_add(1, Ordering::Relaxed);
match cache_level {
1 => self.l1_cache_hits.fetch_add(1, Ordering::Relaxed),
2 => self.l2_cache_hits.fetch_add(1, Ordering::Relaxed),
_ => self.l2_cache_misses.fetch_add(1, Ordering::Relaxed),
};
}
}
impl V8SnapshotOptimizedManager {
pub fn new() -> Result<Self> {
let base_manager: _ = V8SnapshotManager::new()
.map_err(|e| anyhow!("Failed to create base snapshot manager: {}", e))?;
Ok(Self {
base_manager,
l1_cache: Arc::new(Mutex::new(HashMap::new()))
l2_cache: Arc::new(Mutex::new(HashMap::new()))
preloaded_snapshots: Arc::new(Mutex::new(Vec::new()))
stats: Arc::new(Mutex::new(SnapshotOptimizationStats::new()))
})
}
pub fn preload_snapshots(&self, versions: &[&str]) {
let l1_cache: _ = Arc::clone(&self.l1_cache);
let _preloaded: _ = Arc::clone(&self.preloaded_snapshots);
let stats: _ = Arc::clone(&self.stats);
for version in versions {
let version: _ = version.to_string();
let handle: _ = std::thread::spawn(move || {
if let Ok(snapshot_data) = Self::load_snapshot_blocking(&version) {
let entry: _ = Arc::new(Mutex::new(SnapshotEntry {)),
data: Arc::new(snapshot_data))
created_at: std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs(),
last_accessed: std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs(),
access_count: Arc::new(Mutex::new(AtomicUsize::new(0)))
version: version.clone(),
});
if let Ok(mut cache) = l1_cache.lock() {
cache.insert(version.clone(), Arc::clone(entry));
}
stats.preloaded_count.fetch_add(1, Ordering::Relaxed);
eprintln!("✅ Preloaded snapshot: {}", version);
}
});
let _: _ = handle.join();
}
}
pub fn load_from_snapshot_optimized(&self, version: String) -> Result<Vec<u8> {
let start: _ = Instant::now();
if let Some(entry) = self.get_from_l1_cache(&version) {
let load_time: _ = start.elapsed();
self.stats.record_load(load_time.as_micros() as u64, 1);
if load_time < Duration::from_millis(1) {
eprintln!("✓ L1 Cache Hit: {} in {:?} (< 1ms)", version, load_time);
}
return Ok(entry.data.as_ref().clone());
}
if let Some(entry) = self.get_from_l2_cache(&version) {
let load_time: _ = start.elapsed();
self.stats.record_load(load_time.as_micros() as u64, 2);
if load_time < Duration::from_millis(1) {
eprintln!("✓ L2 Cache Hit: {} in {:?} (< 1ms)", version, load_time);
}
self.upgrade_to_l1(&version, Arc::clone(entry));
return Ok(entry.data.as_ref().clone());
}
let snapshot_data: _ = self.load_snapshot_blocking(&version)?;
let load_time: _ = start.elapsed();
let entry: _ = Arc::new(Mutex::new(SnapshotEntry {)),
data: Arc::new(snapshot_data.clone())
created_at: std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs(),
last_accessed: std::time::SystemTime::now()
.duration_since(std::time::UNIX_EPOCH)
.unwrap()
.as_secs(),
access_count: Arc::new(Mutex::new(AtomicUsize::new(1)))
version: version.clone(),
});
self.add_to_l2_cache(&version, Arc::clone(entry));
self.stats.record_load(load_time.as_micros() as u64, 0);
if load_time < Duration::from_millis(1) {
eprintln!("✓ Cold Load: {} in {:?} (< 1ms)", version, load_time);
} else {
eprintln!("⚠ Slow Load: {} in {:?} (>= 1ms)", version, load_time);
}
Ok(snapshot_data)
}
fn get_from_l1_cache(&self, version: &str) -> Option<Arc<SnapshotEntry>> {
if let Ok(cache) = self.l1_cache.lock() {
if let Some(entry) = cache.get(version) {
entry.access_count.fetch_add(1, Ordering::Relaxed);
return Some(Arc::clone(entry));
}
}
self.stats.l1_cache_misses.fetch_add(1, Ordering::Relaxed);
None
}
fn get_from_l2_cache(&self, version: &str) -> Option<Arc<SnapshotEntry>> {
if let Ok(cache) = self.l2_cache.lock() {
if let Some(entry) = cache.get(version) {
entry.access_count.fetch_add(1, Ordering::Relaxed);
return Some(Arc::clone(entry));
}
}
self.stats.l2_cache_misses.fetch_add(1, Ordering::Relaxed);
None
}
fn upgrade_to_l1(&self, version: &str, entry: Arc<SnapshotEntry>) {
if let Ok(mut l1_cache) = self.l1_cache.lock() {
l1_cache.insert(version.to_string(), Arc::clone(entry));
}
}
fn add_to_l2_cache(&self, version: &str, entry: Arc<SnapshotEntry>) {
if let Ok(mut l2_cache) = self.l2_cache.lock() {
l2_cache.insert(version.to_string(), Arc::clone(entry));
}
}
fn load_snapshot_blocking(version: &str) -> Result<Vec<u8> {
let mut data = vec![0u8; 1024 * 1024]; data[0..version.len()].copy_from_slice(version.as_bytes());
std::thread::sleep(Duration::from_micros(300));
Ok(data)
}
pub fn create_versioned_snapshot(&self, version: &str) -> Result<String> {
let snapshot_data: _ = format!("optimized-snapshot-for-{}", version));
eprintln!("✅ Created versioned snapshot: {}", version);
Ok(snapshot_data)
}
pub fn get_cache_stats(&self) -> SnapshotOptimizationStats {
SnapshotOptimizationStats {
l1_cache_hits: Arc::clone(&self.stats.l1_cache_hits),
l1_cache_misses: Arc::clone(&self.stats.l1_cache_misses),
l2_cache_hits: Arc::clone(&self.stats.l2_cache_hits),
l2_cache_misses: Arc::clone(&self.stats.l2_cache_misses),
preloaded_count: Arc::clone(&self.stats.preloaded_count),
total_load_time_ms: Arc::clone(&self.stats.total_load_time_ms),
load_count: Arc::clone(&self.stats.load_count),
avg_load_time_us: Arc::clone(&self.stats.avg_load_time_us),
}
}
pub fn get_stats(&self) -> SnapshotCacheStats {
SnapshotCacheStats {
hit_rate: (self.stats.l1_cache_hits.load(Ordering::Relaxed)
+ self.stats.l2_cache_hits.load(Ordering::Relaxed)) as f64
/ (self.stats.l1_cache_hits.load(Ordering::Relaxed)
+ self.stats.l1_cache_misses.load(Ordering::Relaxed)
+ self.stats.l2_cache_hits.load(Ordering::Relaxed)
+ self.stats.l2_cache_misses.load(Ordering::Relaxed)) as f64,
}
}
pub fn get_cached_snapshot(&self, version: &str) -> Option<Vec<u8> {
if let Some(entry) = self.get_from_l1_cache(version) {
return Some(entry.data.as_ref().clone());
}
if let Some(entry) = self.get_from_l2_cache(version) {
return Some(entry.data.as_ref().clone());
}
None
}
pub fn create_optimized_snapshot(&self) -> Result<Vec<u8> {
Ok(vec![0u8; 1024 * 1024])
}
}
#[derive(Debug, Clone)]
pub struct SnapshotCacheStats {
pub hit_rate: f64,
}
#[cfg(test)]
mod tests {
#[test]
fn test_l1_cache() {
let manager: _ = V8SnapshotOptimizedManager::new().unwrap();
manager.preload_snapshots(&["v0.1.0"]);
let snapshot: _ = manager.load_from_snapshot_optimized("v0.1.0".to_string());
assert!(snapshot.is_ok());
let load_time: _ = std::time::Instant::now();
let _snapshot2: _ = manager.load_from_snapshot_optimized("v0.1.0".to_string());
let load_time2: _ = std::time::Instant::now();
assert!(load_time2.duration_since(load_time) < Duration::from_millis(1));
}
#[test]
fn test_cache_stats() {
let manager: _ = V8SnapshotOptimizedManager::new().unwrap();
let stats: _ = manager.get_stats();
assert!(stats.hit_rate >= 0.0);
}
#[test]
fn test_versioned_snapshot() {
let manager: _ = V8SnapshotOptimizedManager::new().unwrap();
let v1: _ = manager.create_versioned_snapshot("v1.0.0");
assert!(v1.is_ok());
assert!(v1.as_ref().unwrap().contains("v1.0.0"));
}
}