use fastskip::ConcurrentSkipList;
fn main() {
let memtable = ConcurrentSkipList::with_shards(4);
let entries: Vec<(&[u8], &[u8])> = vec![
(b"event:001", b"{\"ts\":1000,\"type\":\"click\"}"),
(b"event:002", b"{\"ts\":1001,\"type\":\"view\"}"),
(b"event:003", b"{\"ts\":1002,\"type\":\"click\"}"),
(b"event:004", b"{\"ts\":1003,\"type\":\"purchase\"}"),
(b"event:005", b"{\"ts\":1004,\"type\":\"click\"}"),
];
for (key, val) in &entries {
if !memtable.insert(key, val) {
eprintln!("insert failed (OOM or duplicate): {:?}", key);
}
}
println!(
"Active memtable: {} entries, {} bytes",
memtable.len(),
memtable.memory_usage()
);
memtable.delete(b"event:002");
let (frozen, fresh_memtable) = memtable.seal().unwrap();
fresh_memtable.insert(b"event:006", b"{\"ts\":1005,\"type\":\"view\"}");
fresh_memtable.insert(b"event:007", b"{\"ts\":1006,\"type\":\"click\"}");
println!("\nFrozen memtable (flush to disk):");
let mut flushed = 0;
for entry in frozen.iter() {
if entry.is_tombstone {
println!(" DELETE {}", std::str::from_utf8(entry.key).unwrap());
} else {
println!(
" PUT {} -> {}",
std::str::from_utf8(entry.key).unwrap(),
std::str::from_utf8(entry.value).unwrap(),
);
}
flushed += 1;
}
println!("Flushed {} entries to SSTable", flushed);
std::mem::drop(frozen);
println!(
"\nFresh memtable after drop: len={}, memory={} bytes",
fresh_memtable.len(),
fresh_memtable.memory_usage()
);
}