Skip to main content

ShardedCache

Struct ShardedCache 

Source
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

Source

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.

Source

pub fn shard_count(&self) -> usize

Returns the number of shards.

Source

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.

Source

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:

  1. Reads the cached entry; returns None on miss.
  2. Runs validate (three-tier revision check). Returns None on fail.
  3. If the entry’s raw bytes decode into V via postcard::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 fast get_if_valid path. 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:

  1. Re-reads the entry under the write lock.
  2. Verifies it is still the unit placeholder left by [insert_validated] — i.e. value.downcast_ref::<()>() succeeds. If anything else lives there (a typed V, a different revision’s value, or a newly-recomputed result), skip the overwrite.
  3. Verifies the raw bytes have not changed (e.g., a concurrent insert_query with a different value).
  4. 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.

Source

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.

Source

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>
where Q::Key: Serialize, Q::Value: Serialize,

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).

Source

pub fn remove(&self, shard_idx: usize, key: &QueryKey) -> bool

Removes a specific key from a shard.

Source

pub fn clear_all(&self)

Clears all entries from all shards.

Source

pub fn total_entries(&self) -> usize

Returns the total number of cached entries across all shards.

Source

pub fn shard_entry_counts(&self) -> Vec<usize>

Returns per-shard entry counts for diagnostics.

Trait Implementations§

Auto Trait Implementations§

Blanket Implementations§

Source§

impl<T> Any for T
where T: 'static + ?Sized,

Source§

fn type_id(&self) -> TypeId

Gets the TypeId of self. Read more
Source§

impl<T> Borrow<T> for T
where T: ?Sized,

Source§

fn borrow(&self) -> &T

Immutably borrows from an owned value. Read more
Source§

impl<T> BorrowMut<T> for T
where T: ?Sized,

Source§

fn borrow_mut(&mut self) -> &mut T

Mutably borrows from an owned value. Read more
Source§

impl<T> From<T> for T

Source§

fn from(t: T) -> T

Returns the argument unchanged.

Source§

impl<T> Instrument for T

Source§

fn instrument(self, span: Span) -> Instrumented<Self>

Instruments this type with the provided Span, returning an Instrumented wrapper. Read more
Source§

fn in_current_span(self) -> Instrumented<Self>

Instruments this type with the current Span, returning an Instrumented wrapper. Read more
Source§

impl<T, U> Into<U> for T
where U: From<T>,

Source§

fn into(self) -> U

Calls U::from(self).

That is, this conversion is whatever the implementation of From<T> for U chooses to do.

Source§

impl<T> IntoEither for T

Source§

fn into_either(self, into_left: bool) -> Either<Self, Self>

Converts 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 more
Source§

fn into_either_with<F>(self, into_left: F) -> Either<Self, Self>
where F: FnOnce(&Self) -> bool,

Converts 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 more
Source§

impl<D> OwoColorize for D

Source§

fn fg<C>(&self) -> FgColorDisplay<'_, C, Self>
where C: Color,

Set the foreground color generically Read more
Source§

fn bg<C>(&self) -> BgColorDisplay<'_, C, Self>
where C: Color,

Set the background color generically. Read more
Source§

fn black(&self) -> FgColorDisplay<'_, Black, Self>

Change the foreground color to black
Source§

fn on_black(&self) -> BgColorDisplay<'_, Black, Self>

Change the background color to black
Source§

fn red(&self) -> FgColorDisplay<'_, Red, Self>

Change the foreground color to red
Source§

fn on_red(&self) -> BgColorDisplay<'_, Red, Self>

Change the background color to red
Source§

fn green(&self) -> FgColorDisplay<'_, Green, Self>

Change the foreground color to green
Source§

fn on_green(&self) -> BgColorDisplay<'_, Green, Self>

Change the background color to green
Source§

fn yellow(&self) -> FgColorDisplay<'_, Yellow, Self>

Change the foreground color to yellow
Source§

fn on_yellow(&self) -> BgColorDisplay<'_, Yellow, Self>

Change the background color to yellow
Source§

fn blue(&self) -> FgColorDisplay<'_, Blue, Self>

Change the foreground color to blue
Source§

fn on_blue(&self) -> BgColorDisplay<'_, Blue, Self>

Change the background color to blue
Source§

fn magenta(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to magenta
Source§

fn on_magenta(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to magenta
Source§

fn purple(&self) -> FgColorDisplay<'_, Magenta, Self>

Change the foreground color to purple
Source§

fn on_purple(&self) -> BgColorDisplay<'_, Magenta, Self>

Change the background color to purple
Source§

fn cyan(&self) -> FgColorDisplay<'_, Cyan, Self>

Change the foreground color to cyan
Source§

fn on_cyan(&self) -> BgColorDisplay<'_, Cyan, Self>

Change the background color to cyan
Source§

fn white(&self) -> FgColorDisplay<'_, White, Self>

Change the foreground color to white
Source§

fn on_white(&self) -> BgColorDisplay<'_, White, Self>

Change the background color to white
Source§

fn default_color(&self) -> FgColorDisplay<'_, Default, Self>

Change the foreground color to the terminal default
Source§

fn on_default_color(&self) -> BgColorDisplay<'_, Default, Self>

Change the background color to the terminal default
Source§

fn bright_black(&self) -> FgColorDisplay<'_, BrightBlack, Self>

Change the foreground color to bright black
Source§

fn on_bright_black(&self) -> BgColorDisplay<'_, BrightBlack, Self>

Change the background color to bright black
Source§

fn bright_red(&self) -> FgColorDisplay<'_, BrightRed, Self>

Change the foreground color to bright red
Source§

fn on_bright_red(&self) -> BgColorDisplay<'_, BrightRed, Self>

Change the background color to bright red
Source§

fn bright_green(&self) -> FgColorDisplay<'_, BrightGreen, Self>

Change the foreground color to bright green
Source§

fn on_bright_green(&self) -> BgColorDisplay<'_, BrightGreen, Self>

Change the background color to bright green
Source§

fn bright_yellow(&self) -> FgColorDisplay<'_, BrightYellow, Self>

Change the foreground color to bright yellow
Source§

fn on_bright_yellow(&self) -> BgColorDisplay<'_, BrightYellow, Self>

Change the background color to bright yellow
Source§

fn bright_blue(&self) -> FgColorDisplay<'_, BrightBlue, Self>

Change the foreground color to bright blue
Source§

fn on_bright_blue(&self) -> BgColorDisplay<'_, BrightBlue, Self>

Change the background color to bright blue
Source§

fn bright_magenta(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright magenta
Source§

fn on_bright_magenta(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright magenta
Source§

fn bright_purple(&self) -> FgColorDisplay<'_, BrightMagenta, Self>

Change the foreground color to bright purple
Source§

fn on_bright_purple(&self) -> BgColorDisplay<'_, BrightMagenta, Self>

Change the background color to bright purple
Source§

fn bright_cyan(&self) -> FgColorDisplay<'_, BrightCyan, Self>

Change the foreground color to bright cyan
Source§

fn on_bright_cyan(&self) -> BgColorDisplay<'_, BrightCyan, Self>

Change the background color to bright cyan
Source§

fn bright_white(&self) -> FgColorDisplay<'_, BrightWhite, Self>

Change the foreground color to bright white
Source§

fn on_bright_white(&self) -> BgColorDisplay<'_, BrightWhite, Self>

Change the background color to bright white
Source§

fn bold(&self) -> BoldDisplay<'_, Self>

Make the text bold
Source§

fn dimmed(&self) -> DimDisplay<'_, Self>

Make the text dim
Source§

fn italic(&self) -> ItalicDisplay<'_, Self>

Make the text italicized
Source§

fn underline(&self) -> UnderlineDisplay<'_, Self>

Make the text underlined
Make the text blink
Make the text blink (but fast!)
Source§

fn reversed(&self) -> ReversedDisplay<'_, Self>

Swap the foreground and background colors
Source§

fn hidden(&self) -> HiddenDisplay<'_, Self>

Hide the text
Source§

fn strikethrough(&self) -> StrikeThroughDisplay<'_, Self>

Cross out the text
Source§

fn color<Color>(&self, color: Color) -> FgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the foreground color at runtime. Only use if you do not know which color will be used at compile-time. If the color is constant, use either OwoColorize::fg or a color-specific method, such as OwoColorize::green, Read more
Source§

fn on_color<Color>(&self, color: Color) -> BgDynColorDisplay<'_, Color, Self>
where Color: DynColor,

Set the background color at runtime. Only use if you do not know what color to use at compile-time. If the color is constant, use either OwoColorize::bg or a color-specific method, such as OwoColorize::on_yellow, Read more
Source§

fn fg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> FgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the foreground color to a specific RGB value.
Source§

fn bg_rgb<const R: u8, const G: u8, const B: u8>( &self, ) -> BgColorDisplay<'_, CustomColor<R, G, B>, Self>

Set the background color to a specific RGB value.
Source§

fn truecolor(&self, r: u8, g: u8, b: u8) -> FgDynColorDisplay<'_, Rgb, Self>

Sets the foreground color to an RGB value.
Source§

fn on_truecolor(&self, r: u8, g: u8, b: u8) -> BgDynColorDisplay<'_, Rgb, Self>

Sets the background color to an RGB value.
Source§

fn style(&self, style: Style) -> Styled<&Self>

Apply a runtime-determined style
Source§

impl<T> Pointable for T

Source§

const ALIGN: usize

The alignment of pointer.
Source§

type Init = T

The type for initializers.
Source§

unsafe fn init(init: <T as Pointable>::Init) -> usize

Initializes a with the given initializer. Read more
Source§

unsafe fn deref<'a>(ptr: usize) -> &'a T

Dereferences the given pointer. Read more
Source§

unsafe fn deref_mut<'a>(ptr: usize) -> &'a mut T

Mutably dereferences the given pointer. Read more
Source§

unsafe fn drop(ptr: usize)

Drops the object pointed to by the given pointer. Read more
Source§

impl<T> Same for T

Source§

type Output = T

Should always be Self
Source§

impl<T, U> TryFrom<U> for T
where U: Into<T>,

Source§

type Error = Infallible

The type returned in the event of a conversion error.
Source§

fn try_from(value: U) -> Result<T, <T as TryFrom<U>>::Error>

Performs the conversion.
Source§

impl<T, U> TryInto<U> for T
where U: TryFrom<T>,

Source§

type Error = <U as TryFrom<T>>::Error

The type returned in the event of a conversion error.
Source§

fn try_into(self) -> Result<U, <U as TryFrom<T>>::Error>

Performs the conversion.
Source§

impl<T> WithSubscriber for T

Source§

fn with_subscriber<S>(self, subscriber: S) -> WithDispatch<Self>
where S: Into<Dispatch>,

Attaches the provided Subscriber to this type, returning a WithDispatch wrapper. Read more
Source§

fn with_current_subscriber(self) -> WithDispatch<Self>

Attaches the current default Subscriber to this type, returning a WithDispatch wrapper. Read more