pub struct ShardedCache { /* private fields */ }Expand description
64-shard query cache.
Each shard protects a HashMap<QueryKey, CachedResult> behind a
parking_lot::RwLock. The query registry assigns each query type to a
specific shard via TypeId hashing, so reads for different query types
never contend on the same lock.
§Raw-byte retention and persistence
Use [insert_query] (generic over Q: DerivedQuery) to insert entries with
raw-byte retention. The method serialises the key and value at insert time
and enforces the max_entry_size_bytes cap from QueryDbConfig.
Use [iter_persistent] to stream all persistent entries for the SAVE_PATH unit.
It collects cheap Arc clones under each shard lock, then releases the lock
before yielding, so shard locks are never held during I/O.
Implementations§
Source§impl ShardedCache
impl ShardedCache
Sourcepub fn new(shard_count: usize) -> Self
pub fn new(shard_count: usize) -> Self
Creates a new cache with the given number of shards.
§Panics
Panics if shard_count is zero or not a power of two.
Sourcepub fn shard_count(&self) -> usize
pub fn shard_count(&self) -> usize
Returns the number of shards.
Sourcepub fn get_if_valid<V: Clone + 'static>(
&self,
shard_idx: usize,
key: &QueryKey,
validate: impl FnOnce(&CachedResult) -> bool,
) -> Option<V>
pub fn get_if_valid<V: Clone + 'static>( &self, shard_idx: usize, key: &QueryKey, validate: impl FnOnce(&CachedResult) -> bool, ) -> Option<V>
Attempts to retrieve a cached value, validating and downcasting within the read lock scope.
The validate closure receives the cached result and should return
true if the cache entry is still valid. If valid, the value is
downcast and cloned. Returns None on miss, failed validation, or
downcast failure.
This design avoids lifetime issues with read guards by performing all work within the lock scope.
Sourcepub fn get_cold_if_valid<V: Clone + Send + Sync + DeserializeOwned + 'static>(
&self,
shard_idx: usize,
key: &QueryKey,
validate: impl FnOnce(&CachedResult) -> bool,
) -> Option<V>
pub fn get_cold_if_valid<V: Clone + Send + Sync + DeserializeOwned + 'static>( &self, shard_idx: usize, key: &QueryKey, validate: impl FnOnce(&CachedResult) -> bool, ) -> Option<V>
Cold-load rehydration lookup.
Companion to [get_if_valid] for entries placed by
ShardedCache::insert_validated during PN3’s load_derived. Those
entries carry raw postcard bytes for the value but only a unit
placeholder in the typed Box<dyn Any> slot, so [get_if_valid]’s
downcast returns None on them. This method:
- Reads the cached entry; returns
Noneon miss. - Runs
validate(three-tier revision check). ReturnsNoneon fail. - If the entry’s raw bytes decode into
Vviapostcard::from_bytes, promotes the entry in place only if no other thread has already written a typed value into the slot. Subsequent lookups hit the fastget_if_validpath. Returns the decoded value.
The read lock is dropped before the decode so the (moderately-sized) postcard work does not block the shard. The write lock for promotion is re-acquired briefly.
§Concurrent-update safety
Between this method’s read and write phases another thread may have
recomputed the entry, producing a fresher typed value, OR loaded a
more recent revision from disk. Blindly overwriting cached.value
in that gap would clobber the newer result with the stale cold-
loaded one (Codex review finding on commit a41787179). The promote
step therefore:
- Re-reads the entry under the write lock.
- Verifies it is still the unit placeholder left by
[
insert_validated] — i.e.value.downcast_ref::<()>()succeeds. If anything else lives there (a typedV, a different revision’s value, or a newly-recomputed result), skip the overwrite. - Verifies the raw bytes have not changed (e.g., a concurrent
insert_querywith a different value). - Only then writes the decoded value.
The caller still receives the decoded value it returned up, because correctness for this individual call does not depend on the promote succeeding — a lost promotion just means the next reader pays the decode cost too. The race window is bounded to at most one decode per concurrent reader per entry per cold-start session.
§Errors
Returns None on miss, validation failure, or decode failure. The
caller falls back to recomputation on None just as it would for a
cold cache miss.
Sourcepub fn insert(&self, shard_idx: usize, key: QueryKey, result: CachedResult)
pub fn insert(&self, shard_idx: usize, key: QueryKey, result: CachedResult)
Inserts a pre-built CachedResult into the specified shard.
This is the low-level, non-generic insert used internally and by tests
that construct CachedResult directly (without needing raw-byte
retention). For production call-sites that require serialisation and the
max_entry_size_bytes cap, use [insert_query] instead.
Sourcepub fn insert_query<Q: DerivedQuery>(
&self,
shard_idx: usize,
query_key: QueryKey,
key: &Q::Key,
value: Q::Value,
file_deps: SmallVec<[FileDep; 8]>,
edge_revision: Option<u64>,
metadata_revision: Option<u64>,
config: &QueryDbConfig,
) -> Result<(), Error>
pub fn insert_query<Q: DerivedQuery>( &self, shard_idx: usize, query_key: QueryKey, key: &Q::Key, value: Q::Value, file_deps: SmallVec<[FileDep; 8]>, edge_revision: Option<u64>, metadata_revision: Option<u64>, config: &QueryDbConfig, ) -> Result<(), Error>
Type-aware insert for queries that require raw-byte retention.
Serialises key and value via postcard at insert time. If
Q::PERSISTENT = true and raw_result_bytes.len() <= config.max_entry_size_bytes, the entry is stored with full persistence
metadata. If the serialised value exceeds the cap, the entry is not
stored (soft skip — returns Ok(())); the caller’s computed value is
unaffected.
For Q::PERSISTENT = false, the typed value is stored but raw bytes are
left empty and persistent = false — the entry is invisible to
[iter_persistent].
§Errors
Returns an error only if postcard serialisation of the key or value
fails (should not occur for well-formed types that implement Serialize).
Sourcepub fn remove(&self, shard_idx: usize, key: &QueryKey) -> bool
pub fn remove(&self, shard_idx: usize, key: &QueryKey) -> bool
Removes a specific key from a shard.
Sourcepub fn total_entries(&self) -> usize
pub fn total_entries(&self) -> usize
Returns the total number of cached entries across all shards.
Sourcepub fn shard_entry_counts(&self) -> Vec<usize>
pub fn shard_entry_counts(&self) -> Vec<usize>
Returns per-shard entry counts for diagnostics.
Trait Implementations§
impl Send for ShardedCache
impl Sync for ShardedCache
Auto Trait Implementations§
impl Freeze for ShardedCache
impl !RefUnwindSafe for ShardedCache
impl Unpin for ShardedCache
impl UnsafeUnpin for ShardedCache
impl !UnwindSafe for ShardedCache
Blanket Implementations§
Source§impl<T> BorrowMut<T> for Twhere
T: ?Sized,
impl<T> BorrowMut<T> for Twhere
T: ?Sized,
Source§fn borrow_mut(&mut self) -> &mut T
fn borrow_mut(&mut self) -> &mut T
Source§impl<T> Instrument for T
impl<T> Instrument for T
Source§fn instrument(self, span: Span) -> Instrumented<Self>
fn instrument(self, span: Span) -> Instrumented<Self>
Source§fn in_current_span(self) -> Instrumented<Self>
fn in_current_span(self) -> Instrumented<Self>
Source§impl<T> IntoEither for T
impl<T> IntoEither for T
Source§fn into_either(self, into_left: bool) -> Either<Self, Self>
fn into_either(self, into_left: bool) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left is true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
self into a Left variant of Either<Self, Self>
if into_left(&self) returns true.
Converts self into a Right variant of Either<Self, Self>
otherwise. Read moreSource§impl<D> OwoColorize for D
impl<D> OwoColorize for D
Source§fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>where
C: Color,
Source§fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>where
C: Color,
Source§fn black(&self) -> FgColorDisplay<'_, Black, Self>
fn black(&self) -> FgColorDisplay<'_, Black, Self>
Source§fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
fn on_black(&self) -> BgColorDisplay<'_, Black, Self>
Source§fn red(&self) -> FgColorDisplay<'_, Red, Self>
fn red(&self) -> FgColorDisplay<'_, Red, Self>
Source§fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
fn on_red(&self) -> BgColorDisplay<'_, Red, Self>
Source§fn green(&self) -> FgColorDisplay<'_, Green, Self>
fn green(&self) -> FgColorDisplay<'_, Green, Self>
Source§fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
fn on_green(&self) -> BgColorDisplay<'_, Green, Self>
Source§fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>
Source§fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>
Source§fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
fn blue(&self) -> FgColorDisplay<'_, Blue, Self>
Source§fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>
Source§fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>
Source§fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>
Source§fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>
Source§fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>
Source§fn white(&self) -> FgColorDisplay<'_, White, Self>
fn white(&self) -> FgColorDisplay<'_, White, Self>
Source§fn on_white(&self) -> BgColorDisplay<'_, White, Self>
fn on_white(&self) -> BgColorDisplay<'_, White, Self>
Source§fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
fn default_color(&self) -> FgColorDisplay<'_, Default, Self>
Source§fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>
Source§fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>
Source§fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>
Source§fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>
Source§fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>
Source§fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>
Source§fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>
Source§fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>
Source§fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>
Source§fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>
Source§fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>
Source§fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>
Source§fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>
Source§fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>
Source§fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>
Source§fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>
Source§fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>
Source§fn bold(&self) -> BoldDisplay<'_, Self>
fn bold(&self) -> BoldDisplay<'_, Self>
Source§fn dimmed(&self) -> DimDisplay<'_, Self>
fn dimmed(&self) -> DimDisplay<'_, Self>
Source§fn italic(&self) -> ItalicDisplay<'_, Self>
fn italic(&self) -> ItalicDisplay<'_, Self>
Source§fn underline(&self) -> UnderlineDisplay<'_, Self>
fn underline(&self) -> UnderlineDisplay<'_, Self>
Source§fn blink(&self) -> BlinkDisplay<'_, Self>
fn blink(&self) -> BlinkDisplay<'_, Self>
Source§fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
fn blink_fast(&self) -> BlinkFastDisplay<'_, Self>
Source§fn reversed(&self) -> ReversedDisplay<'_, Self>
fn reversed(&self) -> ReversedDisplay<'_, Self>
Source§fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>
Source§fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::fg or
a color-specific method, such as OwoColorize::green, Read moreSource§fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>where
Color: DynColor,
OwoColorize::bg or
a color-specific method, such as OwoColorize::on_yellow, Read more