11use super :: pb;
22use crate :: { token:: BroadcastAlgorithm , ConnectionAddr , PeerId , StreamId } ;
33
4- use std:: collections:: { BTreeMap , VecDeque } ;
4+ use std:: {
5+ collections:: { BTreeMap , VecDeque } ,
6+ time:: Duration ,
7+ } ;
58
69use mina_p2p_messages:: v2;
710use openmina_core:: { snark:: Snark , transaction:: Transaction } ;
11+ use redux:: Timestamp ;
812use serde:: { Deserialize , Serialize } ;
913
14+ pub const IWANT_TIMEOUT_DURATION : Duration = Duration :: from_secs ( 5 ) ;
15+
1016#[ derive( Default , Serialize , Deserialize , Debug , Clone ) ]
1117pub struct P2pNetworkPubsubState {
1218 pub clients : BTreeMap < PeerId , P2pNetworkPubsubClientState > ,
@@ -18,12 +24,65 @@ pub struct P2pNetworkPubsubState {
1824 pub incoming_transactions : Vec < ( Transaction , u32 ) > ,
1925 pub incoming_snarks : Vec < ( Snark , u32 ) > ,
2026 pub topics : BTreeMap < String , BTreeMap < PeerId , P2pNetworkPubsubClientTopicState > > ,
27+ pub iwant : VecDeque < P2pNetworkPubsubIwantRequestCount > ,
28+ }
29+
30+ #[ derive( Default , Serialize , Deserialize , Debug , Clone ) ]
31+ pub struct P2pNetworkPubsubIwantRequestCount {
32+ pub message_id : Vec < u8 > ,
33+ pub count : Vec < Timestamp > ,
2134}
2235
2336impl P2pNetworkPubsubState {
2437 pub fn prune_peer_state ( & mut self , peer_id : & PeerId ) {
2538 self . clients . remove ( peer_id) ;
2639 }
40+
41+ pub fn filter_iwant_message_ids ( & mut self , message_id : & Vec < u8 > , timestamp : Timestamp ) -> bool {
42+ if self . mcache . map . contains_key ( message_id) {
43+ return false ;
44+ }
45+
46+ let message_count = self
47+ . iwant
48+ . iter_mut ( )
49+ . find ( |message| & message. message_id == message_id) ;
50+
51+ match message_count {
52+ Some ( message) => {
53+ let message_counts = std:: mem:: take ( & mut message. count ) ;
54+
55+ message. count = message_counts
56+ . into_iter ( )
57+ . filter ( |time| {
58+ timestamp
59+ . checked_sub ( * time)
60+ . map_or ( false , |duration| duration < IWANT_TIMEOUT_DURATION )
61+ } )
62+ . collect ( ) ;
63+
64+ if message. count . len ( ) < 3 {
65+ message. count . push ( timestamp) ;
66+ return true ;
67+ }
68+
69+ false
70+ }
71+ None => {
72+ let message_count = P2pNetworkPubsubIwantRequestCount {
73+ message_id : message_id. to_owned ( ) ,
74+ count : vec ! [ timestamp] ,
75+ } ;
76+
77+ self . iwant . push_back ( message_count) ;
78+ if self . iwant . len ( ) > 10 {
79+ self . iwant . pop_front ( ) ;
80+ }
81+
82+ true
83+ }
84+ }
85+ }
2786}
2887
2988#[ derive( Serialize , Deserialize , Debug , Clone ) ]
0 commit comments