@@ -109,7 +109,7 @@ impl<B: BlockT> BlockCollection<B> where B::Header: HeaderT<Number=u64> {
109109					& ( Some ( ( start,  & BlockRangeState :: Downloading  {  ref  len,  downloading } ) ) ,  _)  if  downloading < MAX_PARALLEL_DOWNLOADS   =>
110110						( * start .. * start + * len,  downloading) , 
111111					& ( Some ( ( start,  r) ) ,  Some ( ( next_start,  _) ) )  if  start + r. len ( )  < * next_start =>
112- 						( * start + r. len ( )  .. cmp:: min ( * next_start,  * start + count) ,  0 ) ,  // gap 
112+ 						( * start + r. len ( )  .. cmp:: min ( * next_start,  * start + r . len ( )  +  count) ,  0 ) ,  // gap 
113113					& ( Some ( ( start,  r) ) ,  None )  =>
114114						( start + r. len ( )  .. start + r. len ( )  + count,  0 ) ,  // last range 
115115					& ( None ,  None )  =>
@@ -123,16 +123,17 @@ impl<B: BlockT> BlockCollection<B> where B::Header: HeaderT<Number=u64> {
123123				} 
124124			} 
125125		} ; 
126- 
127126		// crop to peers best 
128127		if  range. start  > peer_best { 
129128			trace ! ( target:  "sync" ,  "Out of range for peer {} ({} vs {})" ,  peer_id,  range. start,  peer_best) ; 
130129			return  None ; 
131130		} 
132131		range. end  = cmp:: min ( peer_best + 1 ,  range. end ) ; 
133- 
134132		self . peer_requests . insert ( peer_id,  range. start ) ; 
135133		self . blocks . insert ( range. start ,  BlockRangeState :: Downloading {  len :  range. end  - range. start ,  downloading :  downloading + 1  } ) ; 
134+ 		if  range. end  <= range. start  { 
135+ 			panic ! ( "Empty range {:?}, count={}, peer_best={}, common={}, blocks={:?}" ,  range,  count,  peer_best,  common,  self . blocks) ; 
136+ 		} 
136137		Some ( range) 
137138	} 
138139
@@ -189,7 +190,7 @@ impl<B: BlockT> BlockCollection<B> where B::Header: HeaderT<Number=u64> {
189190
190191#[ cfg( test) ]  
191192mod  test { 
192- 	use  super :: { BlockCollection ,  BlockData } ; 
193+ 	use  super :: { BlockCollection ,  BlockData ,   BlockRangeState } ; 
193194	use  message; 
194195	use  runtime_primitives:: testing:: Block  as  RawBlock ; 
195196	use  primitives:: H256 ; 
@@ -264,4 +265,18 @@ mod test {
264265		assert_eq ! ( drained[ ..40 ] ,  blocks[ 81 ..121 ] . iter( ) . map( |b| BlockData  {  block:  b. clone( ) ,  origin:  2  } ) . collect:: <Vec <_>>( ) [ ..] ) ; 
265266		assert_eq ! ( drained[ 40 ..] ,  blocks[ 121 ..150 ] . iter( ) . map( |b| BlockData  {  block:  b. clone( ) ,  origin:  1  } ) . collect:: <Vec <_>>( ) [ ..] ) ; 
266267	} 
268+ 
269+ 	#[ test]  
270+ 	fn  large_gap ( )  { 
271+ 		let  mut  bc:  BlockCollection < Block >  = BlockCollection :: new ( ) ; 
272+ 		bc. blocks . insert ( 100 ,  BlockRangeState :: Downloading  { 
273+ 			len :  128 , 
274+ 			downloading :  1 , 
275+ 		} ) ; 
276+ 		let  blocks = generate_blocks ( 10 ) . into_iter ( ) . map ( |b| BlockData  {  block :  b,  origin :  0  } ) . collect ( ) ; 
277+ 		bc. blocks . insert ( 114305 ,  BlockRangeState :: Complete ( blocks) ) ; 
278+ 
279+ 		assert_eq ! ( bc. needed_blocks( 0 ,  128 ,  10000 ,  000 ) ,  Some ( 1  .. 100 ) ) ; 
280+ 		assert_eq ! ( bc. needed_blocks( 0 ,  128 ,  10000 ,  600 ) ,  Some ( 100  + 128  .. 100  + 128  + 128 ) ) ; 
281+ 	} 
267282} 
0 commit comments