use std::sync::{Arc, Mutex};
use nodedb_mem::{EngineId, MemoryGovernor, ReservationToken, ScopedMemory};
use nodedb_types::error::NodeDbResult;
use nodedb_types::{DatabaseId, TenantId};
use crate::engine::strict::StrictEngine;
use crate::nodedb::core::types::NodeDbLite;
use crate::nodedb::lock_ext::LockExt;
use crate::storage::engine::StorageEngine;
impl<S: StorageEngine> NodeDbLite<S> {
pub(crate) fn memory_for(&self, engine: EngineId) -> ScopedMemory {
ScopedMemory::new(
Arc::clone(&self.governor),
DatabaseId::DEFAULT,
TenantId::new(0),
engine,
)
}
pub fn update_memory_stats(&self) {
if let Ok(indices) = self.vector_state.hnsw_indices.lock() {
let hnsw_bytes: usize = indices
.values()
.map(|idx| idx.len() * (idx.dim() * 4 + 128))
.sum();
self.charge_engine_usage(&self.vector_mem_token, EngineId::Vector, hnsw_bytes);
}
if let Ok(csr_map) = self.csr.lock() {
let total: usize = csr_map
.values()
.map(|idx| idx.estimated_memory_bytes())
.sum();
self.charge_engine_usage(&self.graph_mem_token, EngineId::Graph, total);
}
if let Ok(crdt) = self.crdt.lock() {
self.charge_engine_usage(
&self.crdt_mem_token,
EngineId::Crdt,
crdt.estimated_memory_bytes(),
);
}
}
fn charge_engine_usage(
&self,
slot: &Mutex<Option<ReservationToken>>,
engine: EngineId,
bytes: usize,
) {
let scoped = ScopedMemory::new(
Arc::clone(&self.governor),
DatabaseId::DEFAULT,
TenantId::new(0),
engine,
);
let mut token = slot.lock_or_recover();
token.take();
*token = Some(scoped.charge(bytes));
}
pub fn loaded_collections(&self) -> NodeDbResult<Vec<String>> {
let indices = self.vector_state.hnsw_indices.lock_or_recover();
Ok(indices.keys().cloned().collect())
}
pub fn governor(&self) -> &Arc<MemoryGovernor> {
&self.governor
}
pub fn sequences(&self) -> &Arc<crate::sequence::LiteSequenceRegistry> {
self.query_engine.sequences()
}
pub fn strict_engine(&self) -> &Arc<StrictEngine<S>> {
&self.strict
}
pub fn columnar_engine(&self) -> &Arc<crate::engine::columnar::ColumnarEngine<S>> {
&self.columnar
}
pub fn htap_bridge(&self) -> &Arc<crate::engine::htap::HtapBridge> {
&self.htap
}
pub fn timeseries_engine(
&self,
) -> &Arc<Mutex<crate::engine::timeseries::engine::TimeseriesEngine>> {
&self.timeseries
}
}