@@ -13,7 +13,6 @@ use pyth_lazer_publisher_sdk::transaction::{
13
13
Ed25519SignatureData , LazerTransaction , SignatureData , SignedLazerTransaction ,
14
14
} ;
15
15
use solana_keypair:: read_keypair_file;
16
- use std:: collections:: HashMap ;
17
16
use std:: path:: PathBuf ;
18
17
use std:: sync:: Arc ;
19
18
use std:: sync:: atomic:: AtomicBool ;
@@ -133,11 +132,10 @@ impl LazerPublisherTask {
133
132
return Ok ( ( ) ) ;
134
133
}
135
134
136
- let updates = if self . config . enable_update_deduplication {
137
- deduplicate_feed_updates ( & self . pending_updates . drain ( ..) . collect ( ) ) ?
138
- } else {
139
- self . pending_updates . drain ( ..) . collect ( )
140
- } ;
135
+ let mut updates = self . pending_updates . drain ( ..) . collect ( ) ;
136
+ if self . config . enable_update_deduplication {
137
+ deduplicate_feed_updates ( & mut updates) ;
138
+ }
141
139
142
140
let publisher_update = PublisherUpdate {
143
141
updates,
@@ -180,27 +178,9 @@ impl LazerPublisherTask {
180
178
}
181
179
}
182
180
183
- fn deduplicate_feed_updates ( feed_updates : & Vec < FeedUpdate > ) -> Result < Vec < FeedUpdate > > {
184
- let mut deduped_feed_updates = Vec :: new ( ) ;
185
- let mut last_feed_update = HashMap :: new ( ) ;
186
-
187
- // assume that feed_updates is already sorted by ts (within feed_update_id groups)
188
- for feed_update in feed_updates {
189
- let feed_id = feed_update. feed_id . context ( "feed_id is required" ) ?;
190
-
191
- if let Some ( update) = feed_update. update . as_ref ( ) {
192
- if let Some ( last_update) = last_feed_update. get ( & feed_id) {
193
- if update == last_update {
194
- continue ;
195
- }
196
- }
197
-
198
- deduped_feed_updates. push ( feed_update. clone ( ) ) ;
199
- last_feed_update. insert ( feed_id, update. clone ( ) ) ;
200
- }
201
- }
202
-
203
- Ok ( deduped_feed_updates)
181
+ fn deduplicate_feed_updates ( feed_updates : & mut Vec < FeedUpdate > ) {
182
+ // assume that feed_updates is already sorted by timestamp for each feed_update.feed_id
183
+ feed_updates. dedup_by_key ( |feed_update| ( feed_update. feed_id , feed_update. update . clone ( ) ) ) ;
204
184
}
205
185
206
186
#[ cfg( test) ]
@@ -330,7 +310,7 @@ mod tests {
330
310
// - (6, 10)
331
311
// we should only return (1, 10), (4, 15), (6, 10)
332
312
333
- let updates = vec ! [
313
+ let updates = & mut vec ! [
334
314
test_feed_update( 1 , TimestampUs :: from_millis( 1 ) . unwrap( ) , 10 ) ,
335
315
test_feed_update( 1 , TimestampUs :: from_millis( 2 ) . unwrap( ) , 10 ) ,
336
316
test_feed_update( 1 , TimestampUs :: from_millis( 3 ) . unwrap( ) , 10 ) ,
@@ -345,15 +325,13 @@ mod tests {
345
325
test_feed_update( 1 , TimestampUs :: from_millis( 6 ) . unwrap( ) , 10 ) ,
346
326
] ;
347
327
348
- assert_eq ! (
349
- deduplicate_feed_updates( & updates) . unwrap( ) ,
350
- expected_updates
351
- ) ;
328
+ deduplicate_feed_updates ( updates) ;
329
+ assert_eq ! ( updates. to_vec( ) , expected_updates) ;
352
330
}
353
331
354
332
#[ test]
355
333
fn test_deduplicate_feed_updates_multiple_feeds ( ) {
356
- let updates = vec ! [
334
+ let updates = & mut vec ! [
357
335
test_feed_update( 1 , TimestampUs :: from_millis( 1 ) . unwrap( ) , 10 ) ,
358
336
test_feed_update( 1 , TimestampUs :: from_millis( 2 ) . unwrap( ) , 10 ) ,
359
337
test_feed_update( 1 , TimestampUs :: from_millis( 3 ) . unwrap( ) , 10 ) ,
@@ -368,9 +346,7 @@ mod tests {
368
346
test_feed_update( 2 , TimestampUs :: from_millis( 6 ) . unwrap( ) , 10 ) ,
369
347
] ;
370
348
371
- assert_eq ! (
372
- deduplicate_feed_updates( & updates) . unwrap( ) ,
373
- expected_updates
374
- ) ;
349
+ deduplicate_feed_updates ( updates) ;
350
+ assert_eq ! ( updates. to_vec( ) , expected_updates) ;
375
351
}
376
352
}
0 commit comments