Skip to content
New issue

Have a question about this project? Sign up for a free GitHub account to open an issue and contact its maintainers and the community.

By clicking “Sign up for GitHub”, you agree to our terms of service and privacy statement. We’ll occasionally send you account related emails.

Already on GitHub? Sign in to your account

handling IllegalArgumentException caused by Discovery Disabled Nodes in Endpoint.fromEnode #7937

Draft
wants to merge 14 commits into
base: main
Choose a base branch
from
Original file line number Diff line number Diff line change
Expand Up @@ -29,12 +29,15 @@

import com.google.common.net.InetAddresses;
import org.apache.tuweni.bytes.Bytes;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;

/**
* Encapsulates the network coordinates of a {@link DiscoveryPeer} as well as serialization logic
* used in various Discovery messages.
*/
public class Endpoint {
private static final Logger LOG = LoggerFactory.getLogger(Endpoint.class);
private final Optional<String> host;
private final int udpPort;
private final Optional<Integer> tcpPort;
Expand All @@ -49,15 +52,16 @@ public Endpoint(final String host, final int udpPort, final Optional<Integer> tc
}

public static Endpoint fromEnode(final EnodeURL enode) {
final int discoveryPort =
enode
.getDiscoveryPort()
.orElseThrow(
() ->
new IllegalArgumentException(
"Attempt to create a discovery endpoint for an enode with discovery disabled."));
Optional<Integer> discoveryPort = enode.getDiscoveryPort();

if (discoveryPort.isEmpty()) {
int defaultPort = EnodeURLImpl.DEFAULT_LISTENING_PORT;
LOG.debug("Discovery disabled for enode {}. Using default port {}.", enode, defaultPort);
return new Endpoint(enode.getIp().getHostAddress(), defaultPort, Optional.empty());
}

final Optional<Integer> listeningPort = enode.getListeningPort();
return new Endpoint(enode.getIp().getHostAddress(), discoveryPort, listeningPort);
return new Endpoint(enode.getIp().getHostAddress(), discoveryPort.get(), listeningPort);
}

public EnodeURL toEnode(final Bytes nodeId) {
Expand Down
Original file line number Diff line number Diff line change
Expand Up @@ -18,6 +18,7 @@
import static org.assertj.core.api.Assertions.assertThat;
import static org.assertj.core.api.Assertions.assertThatCode;
import static org.assertj.core.api.Assertions.assertThatThrownBy;
import static org.junit.jupiter.api.Assertions.assertEquals;
import static org.mockito.ArgumentMatchers.any;
import static org.mockito.ArgumentMatchers.eq;
import static org.mockito.Mockito.mock;
Expand Down Expand Up @@ -45,6 +46,8 @@
import org.hyperledger.besu.ethereum.p2p.permissions.PeerPermissionsDenylist;
import org.hyperledger.besu.plugin.data.EnodeURL;

import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collections;
import java.util.List;
import java.util.Optional;
Expand Down Expand Up @@ -898,6 +901,23 @@ public void assertHostCorrectlyRevertsOnIgnoredPacketFrom() {
assertThat(PeerDiscoveryAgent.deriveHost(source, mockWellFormed)).isEqualTo(routableHost);
}

@Test
void testFromEnodeWithDiscoveryDisabled() throws UnknownHostException {
macfarla marked this conversation as resolved.
Show resolved Hide resolved
EnodeURL enodeWithNoDiscovery = mock(EnodeURL.class);
when(enodeWithNoDiscovery.getDiscoveryPort()).thenReturn(Optional.empty());
when(enodeWithNoDiscovery.getListeningPort()).thenReturn(Optional.of(8545));

when(enodeWithNoDiscovery.getIp()).thenReturn(InetAddress.getByName("127.0.0.1"));

Endpoint result = Endpoint.fromEnode(enodeWithNoDiscovery);

assertEquals("127.0.0.1", result.getHost());

assertEquals(30303, result.getUdpPort());

assertEquals(Optional.empty(), result.getTcpPort());
}

protected void bondViaIncomingPing(
final MockPeerDiscoveryAgent agent, final MockPeerDiscoveryAgent otherNode) {
final Packet pingPacket = helper.createPingPacket(otherNode, agent);
Expand Down
Loading