mirror of
https://github.com/Qortal/altcoinj.git
synced 2025-01-30 23:02:15 +00:00
Incorporate protocol version into download peer selection logic.
This commit is contained in:
parent
ac61578e8a
commit
ea3fca970c
@ -1110,10 +1110,21 @@ public class PeerGroup extends AbstractIdleService {
|
||||
return null;
|
||||
// Make sure we don't select a peer that is behind/synchronizing itself.
|
||||
int mostCommonChainHeight = getMostCommonChainHeight();
|
||||
List<Peer> candidates = new ArrayList<Peer>();
|
||||
for (Peer peer : peers) {
|
||||
if (peer.getBestHeight() == mostCommonChainHeight) return peer;
|
||||
if (peer.getBestHeight() == mostCommonChainHeight) candidates.add(peer);
|
||||
}
|
||||
throw new IllegalStateException("Unreachable");
|
||||
// Of the candidates, find the highest protocol version.
|
||||
int highestVersion = 0;
|
||||
Peer leadingCandidate = null;
|
||||
for (Peer peer : candidates) {
|
||||
int v = peer.getPeerVersionMessage().clientVersion;
|
||||
if (v > highestVersion) {
|
||||
highestVersion = v;
|
||||
leadingCandidate = peer;
|
||||
}
|
||||
}
|
||||
return leadingCandidate;
|
||||
}
|
||||
|
||||
private static class PeerGroupThreadFactory implements ThreadFactory {
|
||||
|
@ -419,8 +419,14 @@ public class PeerGroupTest extends TestWithNetworkConnections {
|
||||
Peer c = PeerGroup.peerFromChannel(connectPeer(3, versionMessage3));
|
||||
assertEquals(2, peerGroup.getMostCommonChainHeight());
|
||||
assertEquals(a, peerGroup.getDownloadPeer()); // No change yet.
|
||||
Peer d = PeerGroup.peerFromChannel(connectPeer(4, versionMessage3));
|
||||
PeerGroup.peerFromChannel(connectPeer(4, versionMessage3));
|
||||
assertEquals(3, peerGroup.getMostCommonChainHeight());
|
||||
assertEquals(c, peerGroup.getDownloadPeer()); // Switch to first peer advertising new height.
|
||||
|
||||
// New peer with a higher protocol version but same chain height.
|
||||
VersionMessage versionMessage4 = new VersionMessage(params, 3);
|
||||
versionMessage4.clientVersion = 100000;
|
||||
Peer d = PeerGroup.peerFromChannel(connectPeer(5, versionMessage4));
|
||||
assertEquals(d, peerGroup.getDownloadPeer());
|
||||
}
|
||||
}
|
||||
|
Loading…
Reference in New Issue
Block a user