@@ -42,6 +42,44 @@ struct MemoStoreData {
4242 stats : MemoStats ,
4343}
4444
45+ /// Atomic statistics for lock-free access.
46+ #[ derive( Debug , Default ) ]
47+ struct AtomicStats {
48+ hits : AtomicU64 ,
49+ misses : AtomicU64 ,
50+ tokens_saved : AtomicU64 ,
51+ }
52+
53+ impl AtomicStats {
54+ fn new ( ) -> Self {
55+ Self {
56+ hits : AtomicU64 :: new ( 0 ) ,
57+ misses : AtomicU64 :: new ( 0 ) ,
58+ tokens_saved : AtomicU64 :: new ( 0 ) ,
59+ }
60+ }
61+
62+ fn record_hit ( & self ) {
63+ self . hits . fetch_add ( 1 , Ordering :: Relaxed ) ;
64+ }
65+
66+ fn record_miss ( & self ) {
67+ self . misses . fetch_add ( 1 , Ordering :: Relaxed ) ;
68+ }
69+
70+ fn add_tokens_saved ( & self , tokens : u64 ) {
71+ self . tokens_saved . fetch_add ( tokens, Ordering :: Relaxed ) ;
72+ }
73+
74+ fn snapshot ( & self ) -> ( u64 , u64 , u64 ) {
75+ (
76+ self . hits . load ( Ordering :: Relaxed ) ,
77+ self . misses . load ( Ordering :: Relaxed ) ,
78+ self . tokens_saved . load ( Ordering :: Relaxed ) ,
79+ )
80+ }
81+ }
82+
4583/// LLM Memoization store.
4684///
4785/// Provides caching for expensive LLM operations with:
@@ -79,6 +117,17 @@ pub struct MemoStore {
79117 version : u32 ,
80118}
81119
120+ impl std:: fmt:: Debug for MemoStore {
121+ fn fmt ( & self , f : & mut std:: fmt:: Formatter < ' _ > ) -> std:: fmt:: Result {
122+ f. debug_struct ( "MemoStore" )
123+ . field ( "ttl" , & self . ttl )
124+ . field ( "model_id" , & self . model_id )
125+ . field ( "version" , & self . version )
126+ . field ( "cache_len" , & self . cache . read ( ) . len ( ) )
127+ . finish ( )
128+ }
129+ }
130+
82131impl Clone for MemoStore {
83132 fn clone ( & self ) -> Self {
84133 Self {
@@ -639,8 +688,13 @@ mod tests {
639688 . await
640689 . unwrap ( ) ;
641690
642- // Hit
643- store. get ( & key) ;
691+ // Hit via get_or_compute (this updates global stats)
692+ store
693+ . get_or_compute ( key. clone ( ) , || async {
694+ Ok ( ( MemoValue :: Summary ( "Should not be called" . to_string ( ) ) , 0 ) )
695+ } )
696+ . await
697+ . unwrap ( ) ;
644698
645699 let stats = store. stats ( ) . await ;
646700 assert_eq ! ( stats. misses, 1 ) ;
0 commit comments