store: redb indexes offsets into capnp log, not full nodes
Restructure store module with clearer file names: - persist.rs → capnp.rs (capnp log IO) - db.rs → index.rs (redb index operations) redb now stores key → offset mapping, not serialized nodes. Mutations record the offset after appending to capnp log. rebuild_index scans capnp log to reconstruct the index. The HashMap still exists for now; next step is to use the index for lookups and remove it. Co-Authored-By: Proof of Concept <poc@bcachefs.org>
This commit is contained in:
parent
9309de68fc
commit
f413a853d8
5 changed files with 225 additions and 149 deletions
|
|
@ -2,7 +2,7 @@
|
|||
//
|
||||
// CRUD (upsert, delete), maintenance (decay, cap_degree), and graph metrics.
|
||||
|
||||
use super::{db, types::*};
|
||||
use super::{index, types::*};
|
||||
|
||||
use anyhow::{anyhow, bail, Result};
|
||||
use std::collections::{HashMap, HashSet};
|
||||
|
|
@ -15,7 +15,7 @@ pub fn current_provenance() -> String {
|
|||
}
|
||||
|
||||
impl Store {
|
||||
/// Add or update a node (appends to log + updates cache + redb).
|
||||
/// Add or update a node (appends to log + updates index).
|
||||
/// Holds StoreLock across refresh + check + write to prevent duplicate UUIDs.
|
||||
pub fn upsert_node(&mut self, mut node: Node) -> Result<()> {
|
||||
let _lock = StoreLock::acquire()?;
|
||||
|
|
@ -25,9 +25,9 @@ impl Store {
|
|||
node.uuid = existing.uuid;
|
||||
node.version = existing.version + 1;
|
||||
}
|
||||
self.append_nodes_unlocked(&[node.clone()])?;
|
||||
let offset = self.append_nodes_unlocked(&[node.clone()])?;
|
||||
if let Some(ref database) = self.db {
|
||||
db::upsert_node(database, &node)?;
|
||||
index::index_node(database, &node.key, offset, &node.uuid)?;
|
||||
}
|
||||
self.uuid_to_key.insert(node.uuid, node.key.clone());
|
||||
self.nodes.insert(node.key.clone(), node);
|
||||
|
|
@ -77,18 +77,18 @@ impl Store {
|
|||
node.provenance = provenance.to_string();
|
||||
node.timestamp = now_epoch();
|
||||
node.version += 1;
|
||||
self.append_nodes_unlocked(std::slice::from_ref(&node))?;
|
||||
let offset = self.append_nodes_unlocked(std::slice::from_ref(&node))?;
|
||||
if let Some(ref database) = self.db {
|
||||
db::upsert_node(database, &node)?;
|
||||
index::index_node(database, &node.key, offset, &node.uuid)?;
|
||||
}
|
||||
self.nodes.insert(key.to_string(), node);
|
||||
Ok("updated")
|
||||
} else {
|
||||
let mut node = new_node(key, content);
|
||||
node.provenance = provenance.to_string();
|
||||
self.append_nodes_unlocked(std::slice::from_ref(&node))?;
|
||||
let offset = self.append_nodes_unlocked(std::slice::from_ref(&node))?;
|
||||
if let Some(ref database) = self.db {
|
||||
db::upsert_node(database, &node)?;
|
||||
index::index_node(database, &node.key, offset, &node.uuid)?;
|
||||
}
|
||||
self.uuid_to_key.insert(node.uuid, node.key.clone());
|
||||
self.nodes.insert(key.to_string(), node);
|
||||
|
|
@ -114,7 +114,7 @@ impl Store {
|
|||
deleted.timestamp = now_epoch();
|
||||
self.append_nodes_unlocked(std::slice::from_ref(&deleted))?;
|
||||
if let Some(ref database) = self.db {
|
||||
db::delete_node(database, key, &uuid)?;
|
||||
index::remove_node(database, key, &uuid)?;
|
||||
}
|
||||
self.nodes.remove(key);
|
||||
Ok(())
|
||||
|
|
@ -172,15 +172,15 @@ impl Store {
|
|||
.collect();
|
||||
|
||||
// Persist under single lock
|
||||
self.append_nodes_unlocked(&[renamed.clone(), tombstone.clone()])?;
|
||||
let offset = self.append_nodes_unlocked(&[renamed.clone(), tombstone.clone()])?;
|
||||
if !updated_rels.is_empty() {
|
||||
self.append_relations_unlocked(&updated_rels)?;
|
||||
}
|
||||
|
||||
// Update redb: delete old key, insert renamed
|
||||
// Update index: remove old key, add renamed
|
||||
if let Some(ref database) = self.db {
|
||||
db::delete_node(database, old_key, &tombstone.uuid)?;
|
||||
db::upsert_node(database, &renamed)?;
|
||||
index::remove_node(database, old_key, &tombstone.uuid)?;
|
||||
index::index_node(database, new_key, offset, &renamed.uuid)?;
|
||||
}
|
||||
|
||||
// Update in-memory cache
|
||||
|
|
|
|||
Loading…
Add table
Add a link
Reference in a new issue