@@ -4,10 +4,10 @@ use super::{
4
4
GlobalStateR ,
5
5
} ;
6
6
use crate :: {
7
- blockcfg:: { Fragment , Header , HeaderHash } ,
7
+ blockcfg:: { Fragment , Header } ,
8
8
intercom:: { BlockMsg , TransactionMsg } ,
9
9
settings:: start:: network:: Configuration ,
10
- utils:: async_msg:: MessageBox ,
10
+ utils:: async_msg:: { self , MessageBox } ,
11
11
} ;
12
12
use jormungandr_lib:: interfaces:: FragmentOrigin ;
13
13
use network_core:: error as core_error;
@@ -18,7 +18,6 @@ use futures::future::{self, FutureResult};
18
18
use futures:: prelude:: * ;
19
19
use slog:: Logger ;
20
20
21
- use std:: collections:: HashSet ;
22
21
use std:: fmt:: Debug ;
23
22
24
23
#[ must_use = "`Subscription` needs to be plugged into a service trait implementation" ]
90
89
// Not logging the item here because start_send might refuse to send it
91
90
// and it will end up logged redundantly. This won't be a problem with
92
91
// futures 0.3.
93
- match self . inbound . start_send ( item) {
94
- Ok ( AsyncSink :: Ready ) => {
95
- trace ! (
96
- self . logger,
97
- "item queued for processing" ;
98
- "direction" => "in" ,
99
- ) ;
100
- Ok ( AsyncSink :: Ready )
101
- }
102
- Ok ( AsyncSink :: NotReady ( item) ) => Ok ( AsyncSink :: NotReady ( item) ) ,
103
- Err ( e) => {
104
- debug ! (
105
- self . logger,
106
- "failed to queue item for processing" ;
107
- "error" => ?e,
108
- "direction" => "in" ,
109
- ) ;
110
- Err ( e)
111
- }
112
- }
92
+ self . inbound . start_send ( item)
113
93
}
114
94
115
95
fn poll_complete ( & mut self ) -> Poll < ( ) , Self :: SinkError > {
@@ -192,7 +172,6 @@ pub struct BlockAnnouncementProcessor {
192
172
node_id : Id ,
193
173
global_state : GlobalStateR ,
194
174
logger : Logger ,
195
- seen_blocks : HashSet < HeaderHash > ,
196
175
}
197
176
198
177
impl BlockAnnouncementProcessor {
@@ -207,13 +186,24 @@ impl BlockAnnouncementProcessor {
207
186
node_id,
208
187
global_state,
209
188
logger,
210
- seen_blocks : HashSet :: new ( ) ,
211
189
}
212
190
}
213
191
214
192
pub fn message_box ( & self ) -> MessageBox < BlockMsg > {
215
193
self . mbox . clone ( )
216
194
}
195
+
196
+ fn mbox_error < T > ( & self , err : async_msg:: SendError < T > ) -> core_error:: Error
197
+ where
198
+ T : Send + Sync + ' static ,
199
+ {
200
+ error ! (
201
+ self . logger,
202
+ "failed to send block announcement to the block task" ;
203
+ "reason" => %err,
204
+ ) ;
205
+ core_error:: Error :: new ( core_error:: Code :: Internal , err)
206
+ }
217
207
}
218
208
219
209
#[ must_use = "sinks do nothing unless polled" ]
@@ -282,25 +272,18 @@ impl Sink for BlockAnnouncementProcessor {
282
272
type SinkError = core_error:: Error ;
283
273
284
274
fn start_send ( & mut self , header : Header ) -> StartSend < Header , core_error:: Error > {
285
- let block_hash = header . hash ( ) ;
286
- if self . seen_blocks . insert ( block_hash ) {
287
- info ! ( self . logger , "received block announcement" ; "hash" => %block_hash ) ;
275
+ let polled_ready = self . mbox . poll_ready ( ) . map_err ( |e| self . mbox_error ( e ) ) ? ;
276
+ if polled_ready . is_not_ready ( ) {
277
+ return Ok ( AsyncSink :: NotReady ( header ) ) ;
288
278
}
279
+ let block_hash = header. hash ( ) ;
280
+ info ! ( self . logger, "received block announcement" ; "hash" => %block_hash) ;
289
281
let polled = self
290
282
. mbox
291
283
. start_send ( BlockMsg :: AnnouncedBlock ( header, self . node_id ) )
292
- . map_err ( |e| {
293
- error ! (
294
- self . logger,
295
- "failed to send block announcement to the block task" ;
296
- "reason" => %e,
297
- ) ;
298
- self . seen_blocks . remove ( & block_hash) ;
299
- core_error:: Error :: new ( core_error:: Code :: Internal , e)
300
- } ) ?;
284
+ . map_err ( |e| self . mbox_error ( e) ) ?;
301
285
match polled {
302
286
AsyncSink :: Ready => {
303
- self . seen_blocks . remove ( & block_hash) ;
304
287
self . global_state . peers . refresh_peer_on_block ( self . node_id ) ;
305
288
Ok ( AsyncSink :: Ready )
306
289
}
@@ -342,6 +325,11 @@ impl Sink for FragmentProcessor {
342
325
if self . buffered_fragments . len ( ) >= buffer_sizes:: FRAGMENTS {
343
326
return Ok ( AsyncSink :: NotReady ( fragment) ) ;
344
327
}
328
+ trace ! (
329
+ self . logger,
330
+ "received" ;
331
+ "item" => ?fragment,
332
+ ) ;
345
333
self . buffered_fragments . push ( fragment) ;
346
334
let async_send = self . try_send_fragments ( ) ?;
347
335
Ok ( async_send. map ( |( ) | self . buffered_fragments . pop ( ) . unwrap ( ) ) )
@@ -418,6 +406,11 @@ impl Sink for GossipProcessor {
418
406
& mut self ,
419
407
gossip : Gossip < NodeData > ,
420
408
) -> StartSend < Self :: SinkItem , core_error:: Error > {
409
+ trace ! (
410
+ self . logger,
411
+ "received" ;
412
+ "item" => ?gossip,
413
+ ) ;
421
414
self . process_item ( gossip) ;
422
415
Ok ( AsyncSink :: Ready )
423
416
}
0 commit comments