@@ -45,6 +45,7 @@ pub struct HeaderDownloader {
4545 pivot : Pivot ,
4646 request_time : Option < Instant > ,
4747 downloaded : HashMap < H256 , Header > ,
48+ queued : HashMap < H256 , Header > ,
4849 trial : usize ,
4950}
5051
@@ -69,6 +70,7 @@ impl HeaderDownloader {
6970 } ,
7071 request_time : None ,
7172 downloaded : HashMap :: new ( ) ,
73+ queued : HashMap :: new ( ) ,
7274 trial : 0 ,
7375 }
7476 }
@@ -100,12 +102,17 @@ impl HeaderDownloader {
100102 self . request_time . map_or ( false , |time| ( Instant :: now ( ) - time) . as_secs ( ) > MAX_WAIT )
101103 }
102104
103- /// Find header from download cache, and then from blockchain
105+ /// Find header from queued headers, downloaded cache and then from blockchain
104106 /// Panics if header dosn't exist
105107 fn pivot_header ( & self ) -> Header {
106- match self . downloaded . get ( & self . pivot . hash ) {
108+ match self . queued . get ( & self . pivot . hash ) {
107109 Some ( header) => header. clone ( ) ,
108- None => self . client . block_header ( & BlockId :: Hash ( self . pivot . hash ) ) . unwrap ( ) ,
110+ None => self
111+ . downloaded
112+ . get ( & self . pivot . hash )
113+ . map ( Clone :: clone)
114+ . or_else ( || self . client . block_header ( & BlockId :: Hash ( self . pivot . hash ) ) )
115+ . unwrap ( ) ,
109116 }
110117 }
111118
@@ -143,7 +150,7 @@ impl HeaderDownloader {
143150 if self . best_hash == self . pivot . hash {
144151 ctrace ! ( SYNC , "Ignore received headers, pivot already reached the best hash" ) ;
145152 } else if first_header_hash == self . pivot . hash {
146- for header in headers. iter ( ) {
153+ for header in headers[ 1 .. ] . iter ( ) {
147154 self . downloaded . insert ( header. hash ( ) , header. clone ( ) ) ;
148155 }
149156
@@ -173,7 +180,7 @@ impl HeaderDownloader {
173180
174181 pub fn mark_as_imported ( & mut self , hashes : Vec < H256 > ) {
175182 for hash in hashes {
176- self . downloaded . remove ( & hash) ;
183+ self . queued . remove ( & hash) ;
177184
178185 if self . best_hash == hash {
179186 self . pivot = Pivot {
@@ -183,4 +190,12 @@ impl HeaderDownloader {
183190 }
184191 }
185192 }
193+
194+ pub fn mark_as_queued ( & mut self , hashes : Vec < H256 > ) {
195+ for hash in hashes {
196+ if let Some ( header) = self . downloaded . remove ( & hash) {
197+ self . queued . insert ( hash, header) ;
198+ }
199+ }
200+ }
186201}
0 commit comments