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 weiterHistoryCachenutzen. - 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/subscriptionmutiert 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
HistoryCachebesser.
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
impl LockFreeReadHistoryCache
Sourcepub fn new_with_kind(kind: HistoryKind, max_samples: usize) -> Self
pub fn new_with_kind(kind: HistoryKind, max_samples: usize) -> Self
Erzeugt eine neue Lock-Free-Read-Cache.
Sourcepub fn stats(&self) -> Arc<HistoryCacheStats>
pub fn stats(&self) -> Arc<HistoryCacheStats>
Lock-free Read-Snapshot von Stats.
Sourcepub fn snapshot(&self) -> Arc<LockFreeInner>
pub fn snapshot(&self) -> Arc<LockFreeInner>
Liefert einen Arc-Snapshot des aktuellen Cache-Stand fuer
lock-free-Iteration.
Sourcepub fn kind(&self) -> HistoryKind
pub fn kind(&self) -> HistoryKind
History-Kind.
Sourcepub fn evicted_count(&self) -> u64
pub fn evicted_count(&self) -> u64
Anzahl per KeepLast-Eviction verworfener Samples.
Sourcepub fn min_sn(&self) -> Option<SequenceNumber>
pub fn min_sn(&self) -> Option<SequenceNumber>
Kleinste SN aus Atom — lock-frei.
Sourcepub fn max_sn(&self) -> Option<SequenceNumber>
pub fn max_sn(&self) -> Option<SequenceNumber>
Groesste SN aus Atom — lock-frei.
Sourcepub fn get(&self, sn: SequenceNumber) -> Option<CacheChange>
pub fn get(&self, sn: SequenceNumber) -> Option<CacheChange>
Holt ein Change per SN — geklont (CacheChange ist Arc-payload- gewrapped, also ein Refcount-Inc).
Sourcepub fn iter_range_snapshot(
&self,
lo: SequenceNumber,
hi: SequenceNumber,
) -> Vec<CacheChange>
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.
Sourcepub fn insert(&self, change: CacheChange) -> Result<(), CacheError>
pub fn insert(&self, change: CacheChange) -> Result<(), CacheError>
Sourcepub fn remove_up_to(&self, sn: SequenceNumber) -> usize
pub fn remove_up_to(&self, sn: SequenceNumber) -> usize
Entfernt alle Changes mit SN ≤ sn. Liefert Anzahl entfernter.