use edgestore::{EdgestoreConfig, Engine};
use std::path::PathBuf;
fn main() -> Result<(), Box<dyn std::error::Error>> {
let primary_path = PathBuf::from("/tmp/edgestore_replication_primary");
let replica_path = PathBuf::from("/tmp/edgestore_replication_replica");
let _ = std::fs::remove_dir_all(&primary_path);
let _ = std::fs::remove_dir_all(&replica_path);
println!("=== EdgeStore Replication Example ===\n");
let mut primary = Engine::open(EdgestoreConfig::new(&primary_path))?;
println!("Primary engine opened at {:?}", primary_path);
for i in 0..100 {
let key = format!("key_{:03}", i);
let val = format!("value_{:03}", i);
primary.put(b"sync_ns", key.as_bytes(), val.as_bytes())?;
}
println!("Wrote 100 keys to primary.\n");
let _meta = primary.flush_to_segments()?;
println!("Flushed primary memtable to segments.\n");
let manifest = primary.export_manifest()?;
println!("Exported primary manifest: {} segment(s)", manifest.len());
let mut replica = Engine::open(EdgestoreConfig::new(&replica_path))?;
println!("Replica engine opened at {:?}\n", replica_path);
let primary_root = primary.range_merkle_root()?;
let in_sync_before = replica.compare_merkle(&primary_root)?;
println!("In sync before transfer: {}", in_sync_before);
let mut imported = 0usize;
for seg_ref in &manifest {
let dat_path = primary.db_path().join(format!("segment-{:08}.dat", seg_ref.segment_id));
let data = std::fs::read(&dat_path)?;
let result = replica.import_segment(&data, &seg_ref.segment_hash)?;
match result {
edgestore::ImportResult::Applied { keys_written, keys_skipped } => {
println!(" Imported segment {} (keys_written={}, keys_skipped={})", seg_ref.segment_id, keys_written, keys_skipped);
imported += 1;
}
edgestore::ImportResult::Skipped => {
println!(" Segment {} already present — skipped", seg_ref.segment_id);
}
edgestore::ImportResult::HashMismatch => {
eprintln!(" ERROR: Segment {} hash mismatch!", seg_ref.segment_id);
}
}
}
println!("\nTransferred {} segment(s) to replica.\n", imported);
let in_sync_after = replica.compare_merkle(&primary_root)?;
println!("In sync after transfer: {}", in_sync_after);
let sample = replica.get(b"sync_ns", b"key_042")?;
println!("Replica sample get (key_042): {:?}", sample.as_deref().map(|v| String::from_utf8_lossy(v)));
drop(primary);
drop(replica);
let _ = std::fs::remove_dir_all(&primary_path);
let _ = std::fs::remove_dir_all(&replica_path);
println!("\nReplication example complete.");
Ok(())
}