use of tech.pegasys.teku.networking.p2p.network.PeerAddress in project teku by ConsenSys.
the class Eth2PeerSelectionStrategy method selectAndRemoveRandomPeers.
private List<PeerAddress> selectAndRemoveRandomPeers(final P2PNetwork<?> network, final PeerPools peerPools, final int randomlySelectedPeersToAdd, final List<DiscoveryPeer> allCandidatePeers) {
final List<PeerAddress> selectedPeers = new ArrayList<>();
shuffler.shuffle(allCandidatePeers);
while (!allCandidatePeers.isEmpty() && selectedPeers.size() < randomlySelectedPeersToAdd) {
final DiscoveryPeer candidate = allCandidatePeers.remove(0);
checkCandidate(candidate, network).ifPresent(peerAddress -> {
peerPools.addPeerToPool(peerAddress.getId(), RANDOMLY_SELECTED);
selectedPeers.add(peerAddress);
});
}
return selectedPeers;
}
use of tech.pegasys.teku.networking.p2p.network.PeerAddress in project teku by ConsenSys.
the class Eth2PeerSelectionStrategy method selectPeersToConnect.
@Override
public List<PeerAddress> selectPeersToConnect(final P2PNetwork<?> network, final PeerPools peerPools, final Supplier<? extends Collection<DiscoveryPeer>> candidates) {
final PeerSubnetSubscriptions peerSubnetSubscriptions = peerSubnetSubscriptionsFactory.create(network);
final int peersRequiredForPeerCount = targetPeerCountRange.getPeersToAdd(network.getPeerCount());
final int randomlySelectedPeerCount = getCurrentRandomlySelectedPeerCount(network, peerPools);
final int randomlySelectedPeersToAdd = targetPeerCountRange.getRandomlySelectedPeersToAdd(randomlySelectedPeerCount);
final int peersRequiredForSubnets = peerSubnetSubscriptions.getSubscribersRequired();
final int scoreBasedPeersToAdd = Math.max(peersRequiredForPeerCount - randomlySelectedPeerCount, peersRequiredForSubnets);
final int maxPeersToAdd = scoreBasedPeersToAdd + randomlySelectedPeersToAdd;
LOG.trace("Connecting to up to {} known peers", maxPeersToAdd);
if (maxPeersToAdd == 0) {
return emptyList();
}
final List<DiscoveryPeer> allCandidatePeers = new ArrayList<>(candidates.get());
final List<PeerAddress> selectedPeers = new ArrayList<>();
if (randomlySelectedPeersToAdd > 0) {
selectedPeers.addAll(selectAndRemoveRandomPeers(network, peerPools, randomlySelectedPeersToAdd, allCandidatePeers));
}
if (scoreBasedPeersToAdd > 0) {
selectedPeers.addAll(selectPeersByScore(network, peerSubnetSubscriptions, scoreBasedPeersToAdd, allCandidatePeers));
}
// Unmodifiable to make errorprone happy
return unmodifiableList(selectedPeers);
}
use of tech.pegasys.teku.networking.p2p.network.PeerAddress in project teku by ConsenSys.
the class Eth2PeerSelectionStrategyTest method setUp.
@BeforeEach
void setUp() {
when(peerSubnetSubscriptions.createScorer()).thenReturn(peerScorer);
when(reputationManager.isConnectionInitiationAllowed(any())).thenReturn(true);
when(network.createPeerAddress(any(DiscoveryPeer.class))).thenAnswer(invocation -> {
final DiscoveryPeer peer = invocation.getArgument(0);
return new PeerAddress(new MockNodeId(peer.getPublicKey()));
});
}
use of tech.pegasys.teku.networking.p2p.network.PeerAddress in project teku by ConsenSys.
the class ConnectionManagerTest method setUp.
@BeforeEach
public void setUp() {
when(discoveryService.searchForPeers()).thenReturn(new SafeFuture<>());
when(peerSelectionStrategy.selectPeersToConnect(eq(network), any(), any())).thenAnswer(invocation -> {
final Supplier<? extends Collection<DiscoveryPeer>> candidateSupplier = invocation.getArgument(2);
return candidateSupplier.get().stream().map(peer -> new PeerAddress(new MockNodeId(peer.getPublicKey()))).collect(toList());
});
}
use of tech.pegasys.teku.networking.p2p.network.PeerAddress in project teku by ConsenSys.
the class ReputationManagerTest method shouldAllowConnectionAfterDisconnectAfterTimePasses.
@Test
void shouldAllowConnectionAfterDisconnectAfterTimePasses() {
reputationManager.reportDisconnection(peerAddress, Optional.empty(), true);
timeProvider.advanceTimeBySeconds(MORE_THAN_DISALLOW_PERIOD);
assertThat(reputationManager.isConnectionInitiationAllowed(new PeerAddress(new MockNodeId(1)))).isTrue();
}
Aggregations