use crate::engine::vector::hnsw::graph::HnswParams;
use nodedb_types::DatabaseId;
#[test]
fn compaction_removes_tombstones() {
let mut idx = crate::engine::vector::hnsw::graph::HnswIndex::new(4, HnswParams::default());
for i in 0..20u32 {
let _ = idx.insert(vec![i as f32; 4]);
}
for i in 0..10u32 {
idx.delete(i);
}
assert_eq!(idx.tombstone_count(), 10);
assert_eq!(idx.live_count(), 10);
let removed = idx.compact();
assert_eq!(removed, 10);
assert_eq!(idx.live_count(), 10);
assert_eq!(idx.tombstone_count(), 0);
}
#[test]
fn maintenance_respects_interval() {
let dir = tempfile::tempdir().unwrap();
let (mut core, _req_tx, _resp_rx) =
crate::data::executor::core_loop::tests::make_core_with_dir(dir.path());
assert!(core.maybe_run_maintenance());
assert!(!core.maybe_run_maintenance());
}
#[test]
fn forced_compaction_ignores_threshold() {
let dir = tempfile::tempdir().unwrap();
let (mut core, _req_tx, _resp_rx) =
crate::data::executor::core_loop::tests::make_core_with_dir(dir.path());
let stats = core.run_compaction(true);
assert_eq!(stats.vectors_compacted, 0);
assert!(stats.csr_compacted);
}
#[test]
fn lease_is_held_across_work() {
use std::sync::Arc;
use std::time::Duration;
use crate::control::maintenance::MaintenanceBudgetTracker;
let dir = tempfile::tempdir().unwrap();
let (mut core, _req_tx, _resp_rx) =
crate::data::executor::core_loop::tests::make_core_with_dir(dir.path());
let tracker = Arc::new(MaintenanceBudgetTracker::new());
tracker.set_cap(DatabaseId::DEFAULT, 1);
core.set_maintenance_budget(Arc::clone(&tracker));
let mut acquired = 0usize;
for _ in 0..5000 {
match tracker.try_acquire(DatabaseId::DEFAULT, 0.0) {
Some(lease) => {
std::thread::sleep(Duration::from_millis(1));
drop(lease);
acquired += 1;
}
None => break,
}
}
assert!(
acquired < 5000,
"budget never exhausted after {acquired} acquires — lease drop is not recording elapsed time"
);
let stats = core.run_compaction(false);
assert!(
stats.csr_deferred,
"CSR compaction must defer when the DEFAULT db is over budget"
);
assert!(
stats.edges_deferred,
"edge sweep must defer when the DEFAULT db is over budget"
);
assert!(!stats.csr_compacted, "CSR must not have run while deferred");
let forced = core.run_compaction(true);
assert!(forced.csr_compacted, "force=true must bypass the budget");
assert!(!forced.csr_deferred);
}