store: remove Vec<Relation>, dedup uses index iteration

The relations Vec is gone from Store. dedup now iterates via
edges_for_uuid() instead of mutating in-memory Vec — removes/re-adds
edges through the index directly.

Removed load_relations_vec() and clear_relations() — no longer needed.
Added helper methods: edges_for_uuid, index_relation, remove_relation_from_index.

Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
Kent Overstreet 2026-04-13 21:32:48 -04:00
parent c2de14dcab
commit 2548ca059d
5 changed files with 105 additions and 78 deletions

View file

@ -272,12 +272,7 @@ impl Store {
store.loaded_nodes_size = fs::metadata(&nodes_p).map(|m| m.len()).unwrap_or(0);
store.loaded_rels_size = fs::metadata(&rels_p).map(|m| m.len()).unwrap_or(0);
// Drop edges referencing deleted/missing nodes
let db = store.db.as_ref().unwrap();
store.relations.retain(|r|
index::contains_key(db, &r.source_key).unwrap_or(false) &&
index::contains_key(db, &r.target_key).unwrap_or(false)
);
// Orphan edges filtered naturally during for_each_relation (unresolvable UUIDs skipped)
Ok(store)
}
@ -359,13 +354,10 @@ impl Store {
}
}
self.relations = by_uuid.into_values()
.filter(|r| !r.deleted)
.collect();
// Index relations in redb
// Index relations directly (no Vec intermediate)
if let Some(db) = &self.db {
for rel in &self.relations {
for rel in by_uuid.into_values() {
if rel.deleted { continue; }
index::index_relation(db, &rel.source, &rel.target, rel.strength, rel.rel_type as u8)?;
}
}