@@ -12,14 +12,17 @@ use {
12
12
anyhow,
13
13
Result ,
14
14
} ,
15
- dashmap :: DashMap ,
15
+ futures :: future :: join_all ,
16
16
pythnet_sdk:: messages:: {
17
17
FeedId ,
18
18
Message ,
19
19
MessageType ,
20
20
} ,
21
21
std:: {
22
- collections:: BTreeMap ,
22
+ collections:: {
23
+ BTreeMap ,
24
+ HashMap ,
25
+ } ,
23
26
ops:: Bound ,
24
27
sync:: Arc ,
25
28
} ,
@@ -103,16 +106,16 @@ pub struct Cache {
103
106
/// We do not write to this cache much, so we can use a simple RwLock instead of a DashMap.
104
107
wormhole_merkle_state_cache : Arc < RwLock < BTreeMap < Slot , WormholeMerkleState > > > ,
105
108
106
- message_cache : Arc < DashMap < MessageStateKey , BTreeMap < MessageStateTime , MessageState > > > ,
109
+ message_cache : Arc < RwLock < HashMap < MessageStateKey , BTreeMap < MessageStateTime , MessageState > > > > ,
107
110
cache_size : u64 ,
108
111
}
109
112
110
- fn retrieve_message_state (
113
+ async fn retrieve_message_state (
111
114
cache : & Cache ,
112
115
key : MessageStateKey ,
113
116
request_time : RequestTime ,
114
117
) -> Option < MessageState > {
115
- match cache. message_cache . get ( & key) {
118
+ match cache. message_cache . read ( ) . await . get ( & key) {
116
119
Some ( key_cache) => {
117
120
match request_time {
118
121
RequestTime :: Latest => key_cache. last_key_value ( ) . map ( |( _, v) | v) . cloned ( ) ,
@@ -154,7 +157,7 @@ fn retrieve_message_state(
154
157
impl Cache {
155
158
pub fn new ( cache_size : u64 ) -> Self {
156
159
Self {
157
- message_cache : Arc :: new ( DashMap :: new ( ) ) ,
160
+ message_cache : Arc :: new ( RwLock :: new ( HashMap :: new ( ) ) ) ,
158
161
accumulator_messages_cache : Arc :: new ( RwLock :: new ( BTreeMap :: new ( ) ) ) ,
159
162
wormhole_merkle_state_cache : Arc :: new ( RwLock :: new ( BTreeMap :: new ( ) ) ) ,
160
163
cache_size,
@@ -189,20 +192,20 @@ impl AggregateCache for crate::state::State {
189
192
async fn message_state_keys ( & self ) -> Vec < MessageStateKey > {
190
193
self . cache
191
194
. message_cache
195
+ . read ( )
196
+ . await
192
197
. iter ( )
193
- . map ( |entry| entry. key ( ) . clone ( ) )
198
+ . map ( |entry| entry. 0 . clone ( ) )
194
199
. collect :: < Vec < _ > > ( )
195
200
}
196
201
197
202
async fn store_message_states ( & self , message_states : Vec < MessageState > ) -> Result < ( ) > {
203
+ let mut message_cache = self . cache . message_cache . write ( ) . await ;
204
+
198
205
for message_state in message_states {
199
206
let key = message_state. key ( ) ;
200
207
let time = message_state. time ( ) ;
201
- let mut cache = self
202
- . cache
203
- . message_cache
204
- . entry ( key)
205
- . or_insert_with ( BTreeMap :: new) ;
208
+ let cache = message_cache. entry ( key) . or_insert_with ( BTreeMap :: new) ;
206
209
207
210
cache. insert ( time, message_state) ;
208
211
@@ -220,24 +223,25 @@ impl AggregateCache for crate::state::State {
220
223
request_time : RequestTime ,
221
224
filter : MessageStateFilter ,
222
225
) -> Result < Vec < MessageState > > {
223
- ids. into_iter ( )
224
- . flat_map ( |id| {
225
- let request_time = request_time. clone ( ) ;
226
- let message_types: Vec < MessageType > = match filter {
227
- MessageStateFilter :: All => MessageType :: iter ( ) . collect ( ) ,
228
- MessageStateFilter :: Only ( t) => vec ! [ t] ,
226
+ join_all ( ids. into_iter ( ) . flat_map ( |id| {
227
+ let request_time = request_time. clone ( ) ;
228
+ let message_types: Vec < MessageType > = match filter {
229
+ MessageStateFilter :: All => MessageType :: iter ( ) . collect ( ) ,
230
+ MessageStateFilter :: Only ( t) => vec ! [ t] ,
231
+ } ;
232
+
233
+ message_types. into_iter ( ) . map ( move |message_type| {
234
+ let key = MessageStateKey {
235
+ feed_id : id,
236
+ type_ : message_type,
229
237
} ;
230
-
231
- message_types. into_iter ( ) . map ( move |message_type| {
232
- let key = MessageStateKey {
233
- feed_id : id,
234
- type_ : message_type,
235
- } ;
236
- retrieve_message_state ( & self . cache , key, request_time. clone ( ) )
237
- . ok_or ( anyhow ! ( "Message not found" ) )
238
- } )
238
+ retrieve_message_state ( & self . cache , key, request_time. clone ( ) )
239
239
} )
240
- . collect ( )
240
+ } ) )
241
+ . await
242
+ . into_iter ( )
243
+ . collect :: < Option < Vec < _ > > > ( )
244
+ . ok_or ( anyhow ! ( "Message not found" ) )
241
245
}
242
246
243
247
async fn store_accumulator_messages (
0 commit comments