11use crate :: sync:: network_context:: {
22 DataColumnsByRootRequestId , DataColumnsByRootSingleBlockRequest ,
33} ;
4-
4+ use beacon_chain :: validator_monitor :: timestamp_now ;
55use beacon_chain:: BeaconChainTypes ;
66use fnv:: FnvHashMap ;
77use lighthouse_network:: service:: api_types:: { CustodyId , DataColumnsByRootRequester } ;
@@ -61,7 +61,8 @@ struct ActiveBatchColumnsRequest {
6161 indices : Vec < ColumnIndex > ,
6262}
6363
64- pub type CustodyRequestResult < E > = Result < Option < ( DataColumnSidecarList < E > , PeerGroup ) > , Error > ;
64+ pub type CustodyRequestResult < E > =
65+ Result < Option < ( DataColumnSidecarList < E > , PeerGroup , Duration ) > , Error > ;
6566
6667impl < T : BeaconChainTypes > ActiveCustodyRequest < T > {
6768 pub ( crate ) fn new (
@@ -102,8 +103,6 @@ impl<T: BeaconChainTypes> ActiveCustodyRequest<T> {
102103 resp : RpcResponseResult < DataColumnSidecarList < T :: EthSpec > > ,
103104 cx : & mut SyncNetworkContext < T > ,
104105 ) -> CustodyRequestResult < T :: EthSpec > {
105- // TODO(das): Should downscore peers for verify errors here
106-
107106 let Some ( batch_request) = self . active_batch_columns_requests . get_mut ( & req_id) else {
108107 warn ! ( self . log,
109108 "Received custody column response for unrequested index" ;
@@ -115,7 +114,7 @@ impl<T: BeaconChainTypes> ActiveCustodyRequest<T> {
115114 } ;
116115
117116 match resp {
118- Ok ( ( data_columns, _seen_timestamp ) ) => {
117+ Ok ( ( data_columns, seen_timestamp ) ) => {
119118 debug ! ( self . log,
120119 "Custody column download success" ;
121120 "id" => ?self . custody_id,
@@ -141,7 +140,12 @@ impl<T: BeaconChainTypes> ActiveCustodyRequest<T> {
141140 . ok_or ( Error :: BadState ( "unknown column_index" . to_owned ( ) ) ) ?;
142141
143142 if let Some ( data_column) = data_columns. remove ( column_index) {
144- column_request. on_download_success ( req_id, peer_id, data_column) ?;
143+ column_request. on_download_success (
144+ req_id,
145+ peer_id,
146+ data_column,
147+ seen_timestamp,
148+ ) ?;
145149 } else {
146150 // Peer does not have the requested data.
147151 // TODO(das) do not consider this case a success. We know for sure the block has
@@ -204,20 +208,23 @@ impl<T: BeaconChainTypes> ActiveCustodyRequest<T> {
204208 if self . column_requests . values ( ) . all ( |r| r. is_downloaded ( ) ) {
205209 // All requests have completed successfully.
206210 let mut peers = HashMap :: < PeerId , Vec < usize > > :: new ( ) ;
211+ let mut seen_timestamps = vec ! [ ] ;
207212 let columns = std:: mem:: take ( & mut self . column_requests )
208213 . into_values ( )
209214 . map ( |request| {
210- let ( peer, data_column) = request. complete ( ) ?;
215+ let ( peer, data_column, seen_timestamp ) = request. complete ( ) ?;
211216 peers
212217 . entry ( peer)
213218 . or_default ( )
214219 . push ( data_column. index as usize ) ;
220+ seen_timestamps. push ( seen_timestamp) ;
215221 Ok ( data_column)
216222 } )
217223 . collect :: < Result < Vec < _ > , _ > > ( ) ?;
218224
219225 let peer_group = PeerGroup :: from_set ( peers) ;
220- return Ok ( Some ( ( columns, peer_group) ) ) ;
226+ let max_seen_timestamp = seen_timestamps. into_iter ( ) . max ( ) . unwrap_or ( timestamp_now ( ) ) ;
227+ return Ok ( Some ( ( columns, peer_group, max_seen_timestamp) ) ) ;
221228 }
222229
223230 let mut columns_to_request_by_peer = HashMap :: < PeerId , Vec < ColumnIndex > > :: new ( ) ;
@@ -335,7 +342,7 @@ struct ColumnRequest<E: EthSpec> {
335342enum Status < E : EthSpec > {
336343 NotStarted ( Instant ) ,
337344 Downloading ( DataColumnsByRootRequestId ) ,
338- Downloaded ( PeerId , Arc < DataColumnSidecar < E > > ) ,
345+ Downloaded ( PeerId , Arc < DataColumnSidecar < E > > , Duration ) ,
339346}
340347
341348impl < E : EthSpec > ColumnRequest < E > {
@@ -404,6 +411,7 @@ impl<E: EthSpec> ColumnRequest<E> {
404411 req_id : DataColumnsByRootRequestId ,
405412 peer_id : PeerId ,
406413 data_column : Arc < DataColumnSidecar < E > > ,
414+ seen_timestamp : Duration ,
407415 ) -> Result < ( ) , Error > {
408416 match & self . status {
409417 Status :: Downloading ( expected_req_id) => {
@@ -413,7 +421,7 @@ impl<E: EthSpec> ColumnRequest<E> {
413421 req_id,
414422 } ) ;
415423 }
416- self . status = Status :: Downloaded ( peer_id, data_column) ;
424+ self . status = Status :: Downloaded ( peer_id, data_column, seen_timestamp ) ;
417425 Ok ( ( ) )
418426 }
419427 other => Err ( Error :: BadState ( format ! (
@@ -422,9 +430,11 @@ impl<E: EthSpec> ColumnRequest<E> {
422430 }
423431 }
424432
425- fn complete ( self ) -> Result < ( PeerId , Arc < DataColumnSidecar < E > > ) , Error > {
433+ fn complete ( self ) -> Result < ( PeerId , Arc < DataColumnSidecar < E > > , Duration ) , Error > {
426434 match self . status {
427- Status :: Downloaded ( peer_id, data_column) => Ok ( ( peer_id, data_column) ) ,
435+ Status :: Downloaded ( peer_id, data_column, seen_timestamp) => {
436+ Ok ( ( peer_id, data_column, seen_timestamp) )
437+ }
428438 other => Err ( Error :: BadState ( format ! (
429439 "bad state complete expected Downloaded got {other:?}"
430440 ) ) ) ,
0 commit comments