use std::sync::Arc;
use crate::persistent_artrie::block_storage::BlockStorage;
use crate::persistent_artrie::error::{PersistentARTrieError, Result};
use crate::persistent_artrie_core::key_encoding::ByteKey;
use crate::persistent_artrie_core::overlay::flip::LockFreeOverlay;
use crate::persistent_artrie_core::overlay::node::OverlayNode;
use crate::value::DictionaryValue;
impl<V: DictionaryValue, S: BlockStorage> super::PersistentARTrie<V, S> {
pub(crate) fn load_root_immutable(&mut self, root_ptr: u64) -> Result<(usize, bool)> {
let (overlay_root, term_count, image_loaded) =
self.load_overlay_root_compressed(root_ptr)?;
if !self.install_prebuilt_overlay_root(overlay_root) {
return Err(PersistentARTrieError::internal(
"F5 load_root_immutable: install_prebuilt_overlay_root did not engage \
(WAL not Overlay-regime, or ineligible V)",
));
}
self.term_count
.store(0, std::sync::atomic::Ordering::Release);
Ok((term_count, image_loaded))
}
pub(crate) fn load_overlay_root_compressed(
&self,
root_ptr: u64,
) -> Result<(Arc<OverlayNode<ByteKey, V>>, usize, bool)> {
use crate::persistent_artrie_core::overlay::f5_build::build_overlay_root_from_terms;
if root_ptr == 0 {
let empty = build_overlay_root_from_terms::<ByteKey, V, _>(
std::collections::BTreeMap::new(),
None,
);
return Ok((empty, 0, false));
}
let buffer_manager = self.buffer_manager.as_ref().ok_or_else(|| {
PersistentARTrieError::internal("L3.1 load_overlay_root_compressed: no buffer manager")
})?;
let arena_manager = self.arena_manager.as_ref().ok_or_else(|| {
PersistentARTrieError::internal("L3.1 load_overlay_root_compressed: no arena manager")
})?;
match Self::enumerate_terms_from_disk(buffer_manager, arena_manager, root_ptr) {
Ok((terms, empty_term, term_count)) => {
let overlay_root =
build_overlay_root_from_terms::<ByteKey, V, _>(terms, empty_term);
Ok((overlay_root, term_count as usize, true))
}
Err(e) => {
log::warn!(
"L3.1 load_overlay_root_compressed: corrupt dense image at root_ptr {:#x}: \
{:?}; falling back to an empty overlay (the WAL drain recovers from frontier 0)",
root_ptr,
e
);
let empty = build_overlay_root_from_terms::<ByteKey, V, _>(
std::collections::BTreeMap::new(),
None,
);
Ok((empty, 0, false))
}
}
}
}