1
1
use std:: collections:: hash_map:: DefaultHasher ;
2
2
use std:: collections:: HashSet ;
3
3
use std:: hash:: { Hash , Hasher } ;
4
- use std:: {
5
- collections:: { HashMap , VecDeque } ,
6
- env,
7
- task:: Poll ,
8
- time:: Duration ,
9
- } ;
4
+ use std:: { collections:: HashMap , task:: Poll } ;
10
5
6
+ use libp2p:: gossipsub:: MessageId ;
11
7
use libp2p:: swarm:: { ConnectionClosed , FromSwarm } ;
12
8
use libp2p:: PeerId ;
13
9
use libp2p:: {
14
10
gossipsub:: { self , IdentTopic , Message , MessageAuthenticity } ,
15
11
identity:: Keypair ,
16
12
swarm:: { NetworkBehaviour , THandlerInEvent , ToSwarm } ,
17
13
} ;
18
- use prost:: Message as ProstMessage ;
19
- use topos_core:: api:: grpc:: tce:: v1:: Batch ;
20
- use topos_metrics:: P2P_GOSSIP_BATCH_SIZE ;
21
- use tracing:: { debug, error, warn} ;
14
+ use tracing:: { debug, trace, warn} ;
22
15
23
16
use crate :: error:: P2PError ;
24
17
use crate :: { constants, event:: ComposedEvent , TOPOS_ECHO , TOPOS_GOSSIP , TOPOS_READY } ;
25
18
26
19
use super :: HealthStatus ;
27
20
28
- const MAX_BATCH_SIZE : usize = 10 ;
29
-
30
21
pub struct Behaviour {
31
- batch_size : usize ,
32
22
gossipsub : gossipsub:: Behaviour ,
33
- pending : HashMap < & ' static str , VecDeque < Vec < u8 > > > ,
34
- tick : tokio:: time:: Interval ,
35
23
/// List of connected peers per topic.
36
24
connected_peer : HashMap < & ' static str , HashSet < PeerId > > ,
37
25
/// The health status of the gossip behaviour
@@ -43,18 +31,16 @@ impl Behaviour {
43
31
& mut self ,
44
32
topic : & ' static str ,
45
33
message : Vec < u8 > ,
46
- ) -> Result < usize , & ' static str > {
34
+ ) -> Result < MessageId , P2PError > {
47
35
match topic {
48
- TOPOS_GOSSIP => {
49
- if let Ok ( msg_id) = self . gossipsub . publish ( IdentTopic :: new ( topic) , message) {
50
- debug ! ( "Published on topos_gossip: {:?}" , msg_id) ;
51
- }
36
+ TOPOS_GOSSIP | TOPOS_ECHO | TOPOS_READY => {
37
+ let msg_id = self . gossipsub . publish ( IdentTopic :: new ( topic) , message) ?;
38
+ trace ! ( "Published on topos_gossip: {:?}" , msg_id) ;
39
+
40
+ Ok ( msg_id)
52
41
}
53
- TOPOS_ECHO | TOPOS_READY => self . pending . entry ( topic) . or_default ( ) . push_back ( message) ,
54
- _ => return Err ( "Invalid topic" ) ,
42
+ _ => Err ( P2PError :: InvalidGossipTopic ( topic) ) ,
55
43
}
56
-
57
- Ok ( 0 )
58
44
}
59
45
60
46
pub fn subscribe ( & mut self ) -> Result < ( ) , P2PError > {
@@ -71,10 +57,6 @@ impl Behaviour {
71
57
}
72
58
73
59
pub async fn new ( peer_key : Keypair ) -> Self {
74
- let batch_size = env:: var ( "TOPOS_GOSSIP_BATCH_SIZE" )
75
- . map ( |v| v. parse :: < usize > ( ) )
76
- . unwrap_or ( Ok ( MAX_BATCH_SIZE ) )
77
- . unwrap ( ) ;
78
60
let gossipsub = gossipsub:: ConfigBuilder :: default ( )
79
61
. max_transmit_size ( 2 * 1024 * 1024 )
80
62
. validation_mode ( gossipsub:: ValidationMode :: Strict )
@@ -99,21 +81,7 @@ impl Behaviour {
99
81
. unwrap ( ) ;
100
82
101
83
Self {
102
- batch_size,
103
84
gossipsub,
104
- pending : [
105
- ( TOPOS_ECHO , VecDeque :: new ( ) ) ,
106
- ( TOPOS_READY , VecDeque :: new ( ) ) ,
107
- ]
108
- . into_iter ( )
109
- . collect ( ) ,
110
- tick : tokio:: time:: interval ( Duration :: from_millis (
111
- env:: var ( "TOPOS_GOSSIP_INTERVAL" )
112
- . map ( |v| v. parse :: < u64 > ( ) )
113
- . unwrap_or ( Ok ( 100 ) )
114
- . unwrap ( ) ,
115
- ) ) ,
116
-
117
85
connected_peer : Default :: default ( ) ,
118
86
health_status : Default :: default ( ) ,
119
87
}
@@ -191,26 +159,6 @@ impl NetworkBehaviour for Behaviour {
191
159
& mut self ,
192
160
cx : & mut std:: task:: Context < ' _ > ,
193
161
) -> Poll < ToSwarm < Self :: ToSwarm , THandlerInEvent < Self > > > {
194
- if self . tick . poll_tick ( cx) . is_ready ( ) {
195
- // Publish batch
196
- for ( topic, queue) in self . pending . iter_mut ( ) {
197
- if !queue. is_empty ( ) {
198
- let num_of_message = queue. len ( ) . min ( self . batch_size ) ;
199
- let batch = Batch {
200
- messages : queue. drain ( 0 ..num_of_message) . collect ( ) ,
201
- } ;
202
-
203
- debug ! ( "Publishing {} {}" , batch. messages. len( ) , topic) ;
204
- let msg = batch. encode_to_vec ( ) ;
205
- P2P_GOSSIP_BATCH_SIZE . observe ( batch. messages . len ( ) as f64 ) ;
206
- match self . gossipsub . publish ( IdentTopic :: new ( * topic) , msg) {
207
- Ok ( message_id) => debug ! ( "Published {} {}" , topic, message_id) ,
208
- Err ( error) => error ! ( "Failed to publish {}: {}" , topic, error) ,
209
- }
210
- }
211
- }
212
- }
213
-
214
162
match self . gossipsub . poll ( cx) {
215
163
Poll :: Pending => return Poll :: Pending ,
216
164
Poll :: Ready ( ToSwarm :: GenerateEvent ( event) ) => match event {
@@ -231,6 +179,7 @@ impl NetworkBehaviour for Behaviour {
231
179
topic : TOPOS_GOSSIP ,
232
180
message : data,
233
181
source,
182
+ id : message_id,
234
183
} ,
235
184
) ) )
236
185
}
@@ -240,6 +189,7 @@ impl NetworkBehaviour for Behaviour {
240
189
topic : TOPOS_ECHO ,
241
190
message : data,
242
191
source,
192
+ id : message_id,
243
193
} ,
244
194
) ) )
245
195
}
@@ -249,6 +199,7 @@ impl NetworkBehaviour for Behaviour {
249
199
topic : TOPOS_READY ,
250
200
message : data,
251
201
source,
202
+ id : message_id,
252
203
} ,
253
204
) ) )
254
205
}
0 commit comments