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

Commit 5e9dc18

Browse files
ngotchac5chdn
authored andcommitted
Fix unstable peers and slowness in sync (#9967)
* Don't sync all peers after each response * Update formating * Fix tests: add `continue_sync` to `Sync_step` * Update ethcore/sync/src/chain/mod.rs Co-Authored-By: ngotchac <ngotchac@gmail.com>
1 parent 0e94ac0 commit 5e9dc18

File tree

4 files changed

+35
-34
lines changed

4 files changed

+35
-34
lines changed

ethcore/sync/src/api.rs

+8-5
Original file line numberDiff line numberDiff line change
@@ -420,9 +420,10 @@ impl SyncProvider for EthSync {
420420
}
421421

422422
const PEERS_TIMER: TimerToken = 0;
423-
const SYNC_TIMER: TimerToken = 1;
424-
const TX_TIMER: TimerToken = 2;
425-
const PRIORITY_TIMER: TimerToken = 3;
423+
const MAINTAIN_SYNC_TIMER: TimerToken = 1;
424+
const CONTINUE_SYNC_TIMER: TimerToken = 2;
425+
const TX_TIMER: TimerToken = 3;
426+
const PRIORITY_TIMER: TimerToken = 4;
426427

427428
pub(crate) const PRIORITY_TIMER_INTERVAL: Duration = Duration::from_millis(250);
428429

@@ -441,7 +442,8 @@ impl NetworkProtocolHandler for SyncProtocolHandler {
441442
fn initialize(&self, io: &NetworkContext) {
442443
if io.subprotocol_name() != WARP_SYNC_PROTOCOL_ID {
443444
io.register_timer(PEERS_TIMER, Duration::from_millis(700)).expect("Error registering peers timer");
444-
io.register_timer(SYNC_TIMER, Duration::from_millis(1100)).expect("Error registering sync timer");
445+
io.register_timer(MAINTAIN_SYNC_TIMER, Duration::from_millis(1100)).expect("Error registering sync timer");
446+
io.register_timer(CONTINUE_SYNC_TIMER, Duration::from_millis(2500)).expect("Error registering sync timer");
445447
io.register_timer(TX_TIMER, Duration::from_millis(1300)).expect("Error registering transactions timer");
446448

447449
io.register_timer(PRIORITY_TIMER, PRIORITY_TIMER_INTERVAL).expect("Error registering peers timer");
@@ -474,7 +476,8 @@ impl NetworkProtocolHandler for SyncProtocolHandler {
474476
let mut io = NetSyncIo::new(io, &*self.chain, &*self.snapshot_service, &self.overlay);
475477
match timer {
476478
PEERS_TIMER => self.sync.write().maintain_peers(&mut io),
477-
SYNC_TIMER => self.sync.write().maintain_sync(&mut io),
479+
MAINTAIN_SYNC_TIMER => self.sync.write().maintain_sync(&mut io),
480+
CONTINUE_SYNC_TIMER => self.sync.write().continue_sync(&mut io),
478481
TX_TIMER => self.sync.write().propagate_new_transactions(&mut io),
479482
PRIORITY_TIMER => self.sync.process_priority_queue(&mut io),
480483
_ => warn!("Unknown timer {} triggered.", timer),

ethcore/sync/src/chain/handler.rs

-2
Original file line numberDiff line numberDiff line change
@@ -97,8 +97,6 @@ impl SyncHandler {
9797
sync.sync_peer(io, peer, false);
9898
},
9999
}
100-
// give tasks to other peers
101-
sync.continue_sync(io);
102100
}
103101

104102
/// Called when peer sends us new consensus packet

ethcore/sync/src/chain/mod.rs

+22-24
Original file line numberDiff line numberDiff line change
@@ -866,37 +866,35 @@ impl ChainSync {
866866
}
867867

868868
/// Resume downloading
869-
fn continue_sync(&mut self, io: &mut SyncIo) {
870-
// Collect active peers that can sync
871-
let confirmed_peers: Vec<(PeerId, u8)> = self.peers.iter().filter_map(|(peer_id, peer)|
872-
if peer.can_sync() {
873-
Some((*peer_id, peer.protocol_version))
874-
} else {
875-
None
876-
}
877-
).collect();
878-
879-
trace!(
880-
target: "sync",
881-
"Syncing with peers: {} active, {} confirmed, {} total",
882-
self.active_peers.len(), confirmed_peers.len(), self.peers.len()
883-
);
884-
869+
pub fn continue_sync(&mut self, io: &mut SyncIo) {
885870
if self.state == SyncState::Waiting {
886871
trace!(target: "sync", "Waiting for the block queue");
887872
} else if self.state == SyncState::SnapshotWaiting {
888873
trace!(target: "sync", "Waiting for the snapshot restoration");
889874
} else {
890-
let mut peers: Vec<(PeerId, u8)> = confirmed_peers.iter().filter(|&&(peer_id, _)|
891-
self.active_peers.contains(&peer_id)
892-
).map(|v| *v).collect();
875+
// Collect active peers that can sync
876+
let mut peers: Vec<(PeerId, u8)> = self.peers.iter().filter_map(|(peer_id, peer)|
877+
if peer.can_sync() && peer.asking == PeerAsking::Nothing && self.active_peers.contains(&peer_id) {
878+
Some((*peer_id, peer.protocol_version))
879+
} else {
880+
None
881+
}
882+
).collect();
893883

894-
random::new().shuffle(&mut peers); //TODO: sort by rating
895-
// prefer peers with higher protocol version
896-
peers.sort_by(|&(_, ref v1), &(_, ref v2)| v1.cmp(v2));
884+
if peers.len() > 0 {
885+
trace!(
886+
target: "sync",
887+
"Syncing with peers: {} active, {} available, {} total",
888+
self.active_peers.len(), peers.len(), self.peers.len()
889+
);
897890

898-
for (peer_id, _) in peers {
899-
self.sync_peer(io, peer_id, false);
891+
random::new().shuffle(&mut peers); // TODO (#646): sort by rating
892+
// prefer peers with higher protocol version
893+
peers.sort_by(|&(_, ref v1), &(_, ref v2)| v1.cmp(v2));
894+
895+
for (peer_id, _) in peers {
896+
self.sync_peer(io, peer_id, false);
897+
}
900898
}
901899
}
902900

ethcore/sync/src/tests/helpers.rs

+5-3
Original file line numberDiff line numberDiff line change
@@ -286,10 +286,12 @@ impl<C: FlushingBlockChainClient> Peer for EthPeer<C> {
286286
}
287287

288288
fn sync_step(&self) {
289+
let mut io = TestIo::new(&*self.chain, &self.snapshot_service, &self.queue, None);
289290
self.chain.flush();
290-
self.sync.write().maintain_peers(&mut TestIo::new(&*self.chain, &self.snapshot_service, &self.queue, None));
291-
self.sync.write().maintain_sync(&mut TestIo::new(&*self.chain, &self.snapshot_service, &self.queue, None));
292-
self.sync.write().propagate_new_transactions(&mut TestIo::new(&*self.chain, &self.snapshot_service, &self.queue, None));
291+
self.sync.write().maintain_peers(&mut io);
292+
self.sync.write().maintain_sync(&mut io);
293+
self.sync.write().continue_sync(&mut io);
294+
self.sync.write().propagate_new_transactions(&mut io);
293295
}
294296

295297
fn restart_sync(&self) {

0 commit comments

Comments
 (0)