Skip to content
This repository was archived by the owner on Nov 15, 2023. It is now read-only.

Commit a10cf44

Browse files
arkparrphmeier
authored andcommitted
Fixed block download sequence (#223)
1 parent b7b4cc7 commit a10cf44

File tree

3 files changed

+24
-6
lines changed

3 files changed

+24
-6
lines changed

substrate/network/src/blocks.rs

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -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)]
191192
mod 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
}

substrate/network/src/protocol.rs

Lines changed: 1 addition & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -282,6 +282,7 @@ impl<B: BlockT> Protocol<B> where
282282
id: request.id,
283283
blocks: blocks,
284284
};
285+
trace!(target: "sync", "Sending BlockResponse with {} blocks", response.blocks.len());
285286
self.send_message(io, peer, GenericMessage::BlockResponse(response))
286287
}
287288

substrate/network/src/sync.rs

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -192,8 +192,10 @@ impl<B: BlockT> ChainSync<B> where
192192
trace!(target: "sync", "Got ancestry block #{} ({}) from peer {}", n, block.hash, peer_id);
193193
match protocol.chain().block_hash(n) {
194194
Ok(Some(block_hash)) if block_hash == block.hash => {
195-
peer.common_hash = block.hash;
196-
peer.common_number = n;
195+
if peer.common_number < n {
196+
peer.common_hash = block.hash;
197+
peer.common_number = n;
198+
}
197199
peer.state = PeerSyncState::Available;
198200
trace!(target:"sync", "Found common ancestor for peer {}: {} ({})", peer_id, block.hash, n);
199201
vec![]

0 commit comments

Comments
 (0)