use lcpfs::{FsResult, Pool};
fn main() -> FsResult<()> {
println!("=== LCPFS Snapshot Example ===\n");
println!("1. Setting up initial pool...");
let mut pool = Pool::create_pool(0, "mypool")?;
let fd = pool.create("/data.txt", 0o644)?;
pool.write(fd, b"Version 1: Initial data")?;
pool.close(fd)?;
println!(" ✓ Created initial file\n");
println!("2. Creating snapshot 'baseline'...");
pool.snapshot("baseline")?;
println!(" ✓ Snapshot created\n");
println!("3. Modifying data...");
let fd = pool.open("/data.txt", 0)?;
pool.write(fd, b"Version 2: Modified data")?;
pool.close(fd)?;
println!(" ✓ Data modified\n");
println!("4. Creating snapshot 'v2'...");
pool.snapshot("v2")?;
println!(" ✓ Snapshot created\n");
println!("5. Listing snapshots...");
let snapshots = pool.list_snapshots();
println!(" Snapshots:");
for (name, txg, creation_time) in &snapshots {
println!(" - {} (txg={}, created={})", name, txg, creation_time);
}
println!();
println!("6. Rolling back to 'baseline'...");
pool.rollback("baseline")?;
println!(" ✓ Rolled back\n");
println!("7. Verifying rollback...");
let fd = pool.open("/data.txt", 0)?;
let mut buffer = vec![0u8; 1024];
let read = pool.read(fd, &mut buffer)?;
pool.close(fd)?;
println!(
" Content after rollback: {:?}",
String::from_utf8_lossy(&buffer[..read])
);
println!(" ✓ Rollback successful\n");
println!("8. Creating new snapshot for replication...");
pool.snapshot("v3")?;
println!("9. Sending full snapshot stream...");
let stream = pool.send()?;
println!(
" ✓ Generated {} bytes of replication data\n",
stream.len()
);
println!("10. Making more changes...");
let fd = pool.create("/new_file.txt", 0o644)?;
pool.write(fd, b"New file added")?;
pool.close(fd)?;
pool.snapshot("v4")?;
println!("11. Sending incremental snapshot (v3 → v4)...");
let incremental = pool.send_snapshot_incremental("v3", Some("v4"))?;
println!(
" ✓ Incremental stream: {} bytes (much smaller!)\n",
incremental.len()
);
println!("12. Cleaning up - destroying snapshot 'v2'...");
pool.destroy_snapshot("v2")?;
println!(" ✓ Snapshot destroyed\n");
println!("=== Example completed successfully! ===");
println!("\nKey takeaways:");
println!(" • Snapshots are instant (O(1) metadata operation)");
println!(" • Rollback restores filesystem to snapshot state");
println!(" • Full send: entire snapshot serialized");
println!(" • Incremental send: only changes between snapshots");
Ok(())
}