Skip to main content

LockFreeReadHistoryCache

Struct LockFreeReadHistoryCache 

Source
pub struct LockFreeReadHistoryCache { /* private fields */ }
Expand description

HistoryCache-Variante mit lock-free Lese-Pfad via RCU/Copy-on-Write.

**** Reader (z.B. SEDP-Tick, Heartbeat-Bau, Resend-Iteration) sehen einen Arc-stabilen Snapshot des BTreeMap-Storage; sie greifen ohne weiteren Lock-Touch darauf zu. Writer serialisieren ueber einen internen [RcuCell]-Mutex und publizieren copy-on-write.

§Trade-Offs

  • Read-Pfad: 1× Mutex-Acquire fuer Refcount-Inc + 0 weitere Locks. Concurrent Reader sehen denselben Arc; Read-Iteration ist im Wesentlichen Lock-Frei.
  • Write-Pfad: O(n) pro Insert/Remove, weil der BTreeMap- Inhalt geklont werden muss. Akzeptabel fuer kleine Caches (<= 1000 Samples). Fuer write-heavy Pfade weiter HistoryCache nutzen.
  • Memory: aktive Snapshots verbrauchen Speicher bis sie freigegeben werden (Reader-Lebensdauer). Cache-Mutationen invalidieren keine bestehenden Reader-Snapshots.

§Wann verwenden

  • Discovery-Caches, die haeufig von SEDP-Tick + Match-Loops gelesen, aber nur bei announce_publication/subscription mutiert werden.
  • Monitoring-/Tooling-Pfade, die ohne Lock-Touch ueber den Cache iterieren wollen.

§Wann NICHT verwenden

  • Reliable-Writer-Cache mit hoher Insert-Rate (jede Insert klont den ganzen BTreeMap). Da bleibt HistoryCache besser.

Persistente Datenstrukturen (im::OrdMap) wuerden den Write-Cost-Aufwand auf O(log n) druecken — das ist die natuerliche Folge-Optimierung wenn diese Variante in Production landet.

Implementations§

Source§

impl LockFreeReadHistoryCache

Source

pub fn new_with_kind(kind: HistoryKind, max_samples: usize) -> Self

Erzeugt eine neue Lock-Free-Read-Cache.

Source

pub fn new(max_samples: usize) -> Self

Legacy-Konstruktor — KeepAll.

Source

pub fn stats(&self) -> Arc<HistoryCacheStats>

Lock-free Read-Snapshot von Stats.

Source

pub fn snapshot(&self) -> Arc<LockFreeInner>

Liefert einen Arc-Snapshot des aktuellen Cache-Stand fuer lock-free-Iteration.

Source

pub fn kind(&self) -> HistoryKind

History-Kind.

Source

pub fn evicted_count(&self) -> u64

Anzahl per KeepLast-Eviction verworfener Samples.

Source

pub fn len(&self) -> usize

Anzahl Changes (Acquire-Load des Atomic).

Source

pub fn is_empty(&self) -> bool

True wenn keine Changes.

Source

pub fn min_sn(&self) -> Option<SequenceNumber>

Kleinste SN aus Atom — lock-frei.

Source

pub fn max_sn(&self) -> Option<SequenceNumber>

Groesste SN aus Atom — lock-frei.

Source

pub fn capacity(&self) -> usize

Maximale Kapazitaet.

Source

pub fn get(&self, sn: SequenceNumber) -> Option<CacheChange>

Holt ein Change per SN — geklont (CacheChange ist Arc-payload- gewrapped, also ein Refcount-Inc).

Source

pub fn iter_range_snapshot( &self, lo: SequenceNumber, hi: SequenceNumber, ) -> Vec<CacheChange>

Sample-Snapshot im SN-Bereich [lo, hi]. Liefert Vec — wir koennen keine Iter <'a> ueber einen Arc-Snapshot zurueckgeben, wenn der Snapshot nicht referenziert wird.

Source

pub fn insert(&self, change: CacheChange) -> Result<(), CacheError>

Fuegt ein Change ein. Copy-on-Write des BTreeMap.

§Errors

Wie HistoryCache::insert.

Source

pub fn remove_up_to(&self, sn: SequenceNumber) -> usize

Entfernt alle Changes mit SN ≤ sn. Liefert Anzahl entfernter.

Trait Implementations§

Source§

impl Debug for LockFreeReadHistoryCache

Source§

fn fmt(&self, f: &mut Formatter<'_>) -> Result

Formats the value using the given formatter. Read more

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