Skip to content

Commit

Permalink
Created UnknownHostException unchecked wrapper
Browse files Browse the repository at this point in the history
  • Loading branch information
phughk committed Jul 13, 2017
1 parent 6c3e3ab commit 0c152b2
Show file tree
Hide file tree
Showing 18 changed files with 85 additions and 58 deletions.
Expand Up @@ -128,7 +128,7 @@ public enum DiscoveryType
LIST LIST
} }


@Description( "Configure the discovery type" ) @Description( "Configure the discovery type used for cluster name resolution" )
public static final Setting<DiscoveryType> discovery_type = public static final Setting<DiscoveryType> discovery_type =
setting( "causal_clustering.discovery_type", options( DiscoveryType.class ), DiscoveryType.LIST.name() ); setting( "causal_clustering.discovery_type", options( DiscoveryType.class ), DiscoveryType.LIST.name() );


Expand Down
Expand Up @@ -27,7 +27,7 @@
import org.neo4j.causalclustering.core.state.storage.SimpleStorage; import org.neo4j.causalclustering.core.state.storage.SimpleStorage;
import org.neo4j.causalclustering.discovery.CoreTopologyService; import org.neo4j.causalclustering.discovery.CoreTopologyService;
import org.neo4j.causalclustering.discovery.DiscoveryServiceFactory; import org.neo4j.causalclustering.discovery.DiscoveryServiceFactory;
import org.neo4j.causalclustering.discovery.ResolutionResolver; import org.neo4j.causalclustering.discovery.HostnameResolver;
import org.neo4j.causalclustering.identity.ClusterBinder; import org.neo4j.causalclustering.identity.ClusterBinder;
import org.neo4j.causalclustering.identity.ClusterId; import org.neo4j.causalclustering.identity.ClusterId;
import org.neo4j.causalclustering.identity.MemberId; import org.neo4j.causalclustering.identity.MemberId;
Expand Down Expand Up @@ -58,11 +58,11 @@ public ClusteringModule( DiscoveryServiceFactory discoveryServiceFactory, Member
LogProvider userLogProvider = platformModule.logging.getUserLogProvider(); LogProvider userLogProvider = platformModule.logging.getUserLogProvider();
Dependencies dependencies = platformModule.dependencies; Dependencies dependencies = platformModule.dependencies;
FileSystemAbstraction fileSystem = platformModule.fileSystem; FileSystemAbstraction fileSystem = platformModule.fileSystem;
ResolutionResolver resolutionResolver = chooseResolver( config, logProvider, userLogProvider ); HostnameResolver hostnameResolver = chooseResolver( config, logProvider, userLogProvider );


topologyService = discoveryServiceFactory topologyService = discoveryServiceFactory
.coreTopologyService( config, sslPolicy, myself, platformModule.jobScheduler, logProvider, .coreTopologyService( config, sslPolicy, myself, platformModule.jobScheduler, logProvider,
userLogProvider, resolutionResolver ); userLogProvider, hostnameResolver );


life.add( topologyService ); life.add( topologyService );


Expand Down
Expand Up @@ -29,8 +29,8 @@ public interface DiscoveryServiceFactory
{ {
CoreTopologyService coreTopologyService( Config config, SslPolicy sslPolicy, MemberId myself, CoreTopologyService coreTopologyService( Config config, SslPolicy sslPolicy, MemberId myself,
JobScheduler jobScheduler, LogProvider logProvider, LogProvider userLogProvider, JobScheduler jobScheduler, LogProvider logProvider, LogProvider userLogProvider,
ResolutionResolver resolutionResolver ); HostnameResolver hostnameResolver );


TopologyService topologyService( Config config, SslPolicy sslPolicy, LogProvider logProvider, TopologyService topologyService( Config config, SslPolicy sslPolicy, LogProvider logProvider,
JobScheduler jobScheduler, MemberId myself, ResolutionResolver resolutionResolver ); JobScheduler jobScheduler, MemberId myself, HostnameResolver hostnameResolver );
} }
Expand Up @@ -20,7 +20,6 @@
package org.neo4j.causalclustering.discovery; package org.neo4j.causalclustering.discovery;


import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collection; import java.util.Collection;
import java.util.HashSet; import java.util.HashSet;
import java.util.Set; import java.util.Set;
Expand All @@ -31,13 +30,13 @@


import static java.lang.String.format; import static java.lang.String.format;


public class DnsResolutionResolver implements ResolutionResolver public class DnsHostnameResolver implements HostnameResolver
{ {
private final Log userLog; private final Log userLog;
private final Log log; private final Log log;
private final DomainNameResolver domainNameResolver; private final DomainNameResolver domainNameResolver;


public DnsResolutionResolver( LogProvider logProvider, LogProvider userLogProvider, public DnsHostnameResolver( LogProvider logProvider, LogProvider userLogProvider,
DomainNameResolver domainNameResolver ) DomainNameResolver domainNameResolver )
{ {
log = logProvider.getLog( getClass() ); log = logProvider.getLog( getClass() );
Expand All @@ -49,24 +48,22 @@ public DnsResolutionResolver( LogProvider logProvider, LogProvider userLogProvid
public Collection<AdvertisedSocketAddress> resolve( AdvertisedSocketAddress initialAddress ) public Collection<AdvertisedSocketAddress> resolve( AdvertisedSocketAddress initialAddress )
{ {
Set<AdvertisedSocketAddress> addresses = new HashSet<>(); Set<AdvertisedSocketAddress> addresses = new HashSet<>();
InetAddress[] ipAddresses = new InetAddress[0];
try try
{ {
InetAddress[] ipAddresses = domainNameResolver.resolveDomainName( initialAddress.getHostname() ); ipAddresses = domainNameResolver.resolveDomainName( initialAddress.getHostname() );

for ( InetAddress ipAddress : ipAddresses )
{
addresses.add( new AdvertisedSocketAddress( ipAddress.getHostAddress(), initialAddress.getPort() ) );
}

userLog.info( "Resolved initial host '%s' to %s", initialAddress, addresses );
return addresses;
} }
catch ( UnknownHostException e ) catch ( UnknownHostException e )
{ {
log.error( format( "Failed to resolve host `%s` to IPs due to error: %s", initialAddress, e.getMessage() ), e ); log.error( format("Failed to resolve host '%s'", initialAddress.getHostname()), e);
}


addresses.add( initialAddress ); for ( InetAddress ipAddress : ipAddresses )
return addresses; {
addresses.add( new AdvertisedSocketAddress( ipAddress.getHostAddress(), initialAddress.getPort() ) );
} }

userLog.info( "Resolved initial host '%s' to %s", initialAddress, addresses );
return addresses;
} }
} }
Expand Up @@ -20,7 +20,6 @@
package org.neo4j.causalclustering.discovery; package org.neo4j.causalclustering.discovery;


import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException;


public interface DomainNameResolver public interface DomainNameResolver
{ {
Expand Down
Expand Up @@ -20,12 +20,18 @@
package org.neo4j.causalclustering.discovery; package org.neo4j.causalclustering.discovery;


import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException;


public class DomainNameResolverImpl implements DomainNameResolver public class DomainNameResolverImpl implements DomainNameResolver
{ {
public InetAddress[] resolveDomainName(String hostname) throws UnknownHostException public InetAddress[] resolveDomainName(String hostname) throws UnknownHostException
{ {
return InetAddress.getAllByName( hostname ); try
{
return InetAddress.getAllByName( hostname );
}
catch ( java.net.UnknownHostException e )
{
throw new UnknownHostException( e );
}
} }
} }
Expand Up @@ -37,15 +37,15 @@ public class HazelcastClientConnector implements HazelcastConnector
private final Config config; private final Config config;
private final LogProvider logProvider; private final LogProvider logProvider;
private final SslPolicy sslPolicy; private final SslPolicy sslPolicy;
private final ResolutionResolver resolutionResolver; private final HostnameResolver hostnameResolver;


HazelcastClientConnector( Config config, LogProvider logProvider, SslPolicy sslPolicy, HazelcastClientConnector( Config config, LogProvider logProvider, SslPolicy sslPolicy,
ResolutionResolver resolutionResolver ) HostnameResolver hostnameResolver )
{ {
this.config = config; this.config = config;
this.logProvider = logProvider; this.logProvider = logProvider;
this.sslPolicy = sslPolicy; this.sslPolicy = sslPolicy;
this.resolutionResolver = resolutionResolver; this.hostnameResolver = hostnameResolver;
} }


@Override @Override
Expand All @@ -57,7 +57,7 @@ public HazelcastInstance connectToHazelcast()


for ( AdvertisedSocketAddress address : config.get( CausalClusteringSettings.initial_discovery_members ) ) for ( AdvertisedSocketAddress address : config.get( CausalClusteringSettings.initial_discovery_members ) )
{ {
for ( AdvertisedSocketAddress advertisedSocketAddress : resolutionResolver.resolve( address ) ) for ( AdvertisedSocketAddress advertisedSocketAddress : hostnameResolver.resolve( address ) )
{ {
networkConfig.addAddress( advertisedSocketAddress.toString() ); networkConfig.addAddress( advertisedSocketAddress.toString() );
} }
Expand Down
Expand Up @@ -78,7 +78,7 @@ class HazelcastCoreTopologyService extends LifecycleAdapter implements CoreTopol
private final RobustJobSchedulerWrapper scheduler; private final RobustJobSchedulerWrapper scheduler;
private final long refreshPeriod; private final long refreshPeriod;
private final LogProvider logProvider; private final LogProvider logProvider;
private final ResolutionResolver resolutionResolver; private final HostnameResolver hostnameResolver;


private String membershipRegistrationId; private String membershipRegistrationId;
private JobScheduler.JobHandle refreshJob; private JobScheduler.JobHandle refreshJob;
Expand All @@ -92,7 +92,7 @@ class HazelcastCoreTopologyService extends LifecycleAdapter implements CoreTopol
private volatile boolean stopped; private volatile boolean stopped;


HazelcastCoreTopologyService( Config config, SslPolicy sslPolicy, MemberId myself, JobScheduler jobScheduler, HazelcastCoreTopologyService( Config config, SslPolicy sslPolicy, MemberId myself, JobScheduler jobScheduler,
LogProvider logProvider, LogProvider userLogProvider, ResolutionResolver resolutionResolver ) LogProvider logProvider, LogProvider userLogProvider, HostnameResolver hostnameResolver )
{ {
this.config = config; this.config = config;
this.sslPolicy = sslPolicy; this.sslPolicy = sslPolicy;
Expand All @@ -103,7 +103,7 @@ class HazelcastCoreTopologyService extends LifecycleAdapter implements CoreTopol
this.scheduler = new RobustJobSchedulerWrapper( jobScheduler, log ); this.scheduler = new RobustJobSchedulerWrapper( jobScheduler, log );
this.userLog = userLogProvider.getLog( getClass() ); this.userLog = userLogProvider.getLog( getClass() );
this.refreshPeriod = config.get( CausalClusteringSettings.cluster_topology_refresh ).toMillis(); this.refreshPeriod = config.get( CausalClusteringSettings.cluster_topology_refresh ).toMillis();
this.resolutionResolver = resolutionResolver; this.hostnameResolver = hostnameResolver;
} }


@Override @Override
Expand Down Expand Up @@ -192,7 +192,7 @@ private HazelcastInstance createHazelcastInstance()
List<AdvertisedSocketAddress> initialMembers = config.get( initial_discovery_members ); List<AdvertisedSocketAddress> initialMembers = config.get( initial_discovery_members );
for ( AdvertisedSocketAddress address : initialMembers ) for ( AdvertisedSocketAddress address : initialMembers )
{ {
for ( AdvertisedSocketAddress advertisedSocketAddress : resolutionResolver.resolve( address ) ) for ( AdvertisedSocketAddress advertisedSocketAddress : hostnameResolver.resolve( address ) )
{ {
tcpIpConfig.addMember( advertisedSocketAddress.toString() ); tcpIpConfig.addMember( advertisedSocketAddress.toString() );
} }
Expand Down
Expand Up @@ -32,18 +32,18 @@ public class HazelcastDiscoveryServiceFactory implements DiscoveryServiceFactory
{ {
@Override @Override
public CoreTopologyService coreTopologyService( Config config, SslPolicy sslPolicy, MemberId myself, JobScheduler jobScheduler, public CoreTopologyService coreTopologyService( Config config, SslPolicy sslPolicy, MemberId myself, JobScheduler jobScheduler,
LogProvider logProvider, LogProvider userLogProvider, ResolutionResolver resolutionResolver) LogProvider logProvider, LogProvider userLogProvider, HostnameResolver hostnameResolver )
{ {
configureHazelcast( config ); configureHazelcast( config );
return new HazelcastCoreTopologyService( config, sslPolicy, myself, jobScheduler, logProvider, userLogProvider, resolutionResolver); return new HazelcastCoreTopologyService( config, sslPolicy, myself, jobScheduler, logProvider, userLogProvider, hostnameResolver );
} }


@Override @Override
public TopologyService topologyService( Config config, SslPolicy sslPolicy, LogProvider logProvider, public TopologyService topologyService( Config config, SslPolicy sslPolicy, LogProvider logProvider,
JobScheduler jobScheduler, MemberId myself, ResolutionResolver resolutionResolver) JobScheduler jobScheduler, MemberId myself, HostnameResolver hostnameResolver )
{ {
configureHazelcast( config ); configureHazelcast( config );
return new HazelcastClient( new HazelcastClientConnector( config, logProvider, sslPolicy, resolutionResolver), jobScheduler, logProvider, config, myself ); return new HazelcastClient( new HazelcastClientConnector( config, logProvider, sslPolicy, hostnameResolver ), jobScheduler, logProvider, config, myself );
} }


private static void configureHazelcast( Config config ) private static void configureHazelcast( Config config )
Expand Down
Expand Up @@ -23,7 +23,7 @@


import org.neo4j.helpers.AdvertisedSocketAddress; import org.neo4j.helpers.AdvertisedSocketAddress;


public interface ResolutionResolver public interface HostnameResolver
{ {
Collection<AdvertisedSocketAddress> resolve( AdvertisedSocketAddress advertisedSocketAddresses ); Collection<AdvertisedSocketAddress> resolve( AdvertisedSocketAddress advertisedSocketAddresses );
} }
Expand Up @@ -20,7 +20,6 @@
package org.neo4j.causalclustering.discovery; package org.neo4j.causalclustering.discovery;


import java.net.InetAddress; import java.net.InetAddress;
import java.net.UnknownHostException;
import java.util.Collection; import java.util.Collection;
import java.util.Map; import java.util.Map;
import java.util.stream.Collectors; import java.util.stream.Collectors;
Expand All @@ -41,7 +40,7 @@ public InetAddress[] resolveDomainName( String hostname ) throws UnknownHostExce
{ {
return domainNameMapping.get( hostname ); return domainNameMapping.get( hostname );
} }
throw new UnknownHostException(hostname); throw new UnknownHostException( new java.net.UnknownHostException() );
} }


public void setHostnameAddresses( String hostname, Collection<String> addresses ) public void setHostnameAddresses( String hostname, Collection<String> addresses )
Expand All @@ -58,9 +57,9 @@ private static InetAddress inetAddress( String address )
{ {
return InetAddress.getByName( address ); return InetAddress.getByName( address );
} }
catch ( UnknownHostException e ) catch ( java.net.UnknownHostException e )
{ {
throw new RuntimeException( e ); throw new UnknownHostException( e );
} }
} }
} }
Expand Up @@ -25,7 +25,7 @@


import static java.util.Collections.singleton; import static java.util.Collections.singleton;


public class NoOpResolutionResolver implements ResolutionResolver public class NoOpHostnameResolver implements HostnameResolver
{ {
@Override @Override
public Collection<AdvertisedSocketAddress> resolve( AdvertisedSocketAddress advertisedSocketAddresses ) public Collection<AdvertisedSocketAddress> resolve( AdvertisedSocketAddress advertisedSocketAddresses )
Expand Down
Expand Up @@ -25,17 +25,17 @@


public class ResolutionResolverFactory public class ResolutionResolverFactory
{ {
public static ResolutionResolver chooseResolver( Config config, LogProvider logProvider, public static HostnameResolver chooseResolver( Config config, LogProvider logProvider,
LogProvider userLogProvider ) LogProvider userLogProvider )
{ {
CausalClusteringSettings.DiscoveryType discoveryType = config.get( CausalClusteringSettings.discovery_type ); CausalClusteringSettings.DiscoveryType discoveryType = config.get( CausalClusteringSettings.discovery_type );
if ( discoveryType == CausalClusteringSettings.DiscoveryType.DNS ) if ( discoveryType == CausalClusteringSettings.DiscoveryType.DNS )
{ {
return new DnsResolutionResolver( logProvider, userLogProvider, new DomainNameResolverImpl() ); return new DnsHostnameResolver( logProvider, userLogProvider, new DomainNameResolverImpl() );
} }
else else
{ {
return new NoOpResolutionResolver(); return new NoOpHostnameResolver();
} }
} }
} }
@@ -0,0 +1,28 @@
/*
* Copyright (c) 2002-2017 "Neo Technology,"
* Network Engine for Objects in Lund AB [http://neotechnology.com]
*
* This file is part of Neo4j.
*
* Neo4j is free software: you can redistribute it and/or modify
* it under the terms of the GNU Affero General Public License as
* published by the Free Software Foundation, either version 3 of the
* License, or (at your option) any later version.
*
* This program is distributed in the hope that it will be useful,
* but WITHOUT ANY WARRANTY; without even the implied warranty of
* MERCHANTABILITY or FITNESS FOR A PARTICULAR PURPOSE. See the
* GNU Affero General Public License for more details.
*
* You should have received a copy of the GNU Affero General Public License
* along with this program. If not, see <http://www.gnu.org/licenses/>.
*/
package org.neo4j.causalclustering.discovery;

public class UnknownHostException extends RuntimeException
{
public UnknownHostException(java.net.UnknownHostException unknownHostException)
{
super(unknownHostException);
}
}
Expand Up @@ -43,7 +43,7 @@
import org.neo4j.causalclustering.core.CausalClusteringSettings; import org.neo4j.causalclustering.core.CausalClusteringSettings;
import org.neo4j.causalclustering.core.consensus.schedule.DelayedRenewableTimeoutService; import org.neo4j.causalclustering.core.consensus.schedule.DelayedRenewableTimeoutService;
import org.neo4j.causalclustering.discovery.DiscoveryServiceFactory; import org.neo4j.causalclustering.discovery.DiscoveryServiceFactory;
import org.neo4j.causalclustering.discovery.ResolutionResolver; import org.neo4j.causalclustering.discovery.HostnameResolver;
import org.neo4j.causalclustering.discovery.TopologyService; import org.neo4j.causalclustering.discovery.TopologyService;
import org.neo4j.causalclustering.discovery.procedures.ReadReplicaRoleProcedure; import org.neo4j.causalclustering.discovery.procedures.ReadReplicaRoleProcedure;
import org.neo4j.causalclustering.helper.ExponentialBackoffStrategy; import org.neo4j.causalclustering.helper.ExponentialBackoffStrategy;
Expand Down Expand Up @@ -186,10 +186,10 @@ public class EnterpriseReadReplicaEditionModule extends EditionModule


SslPolicyLoader sslPolicyFactory = dependencies.satisfyDependency( SslPolicyLoader.create( config, logProvider ) ); SslPolicyLoader sslPolicyFactory = dependencies.satisfyDependency( SslPolicyLoader.create( config, logProvider ) );
SslPolicy clusterSslPolicy = sslPolicyFactory.getPolicy( config.get( CausalClusteringSettings.ssl_policy ) ); SslPolicy clusterSslPolicy = sslPolicyFactory.getPolicy( config.get( CausalClusteringSettings.ssl_policy ) );
ResolutionResolver resolutionResolver = chooseResolver( config, logProvider, userLogProvider ); HostnameResolver hostnameResolver = chooseResolver( config, logProvider, userLogProvider );


TopologyService topologyService = discoveryServiceFactory.topologyService( config, clusterSslPolicy, TopologyService topologyService = discoveryServiceFactory.topologyService( config, clusterSslPolicy,
logProvider, platformModule.jobScheduler, myself, resolutionResolver ); logProvider, platformModule.jobScheduler, myself, hostnameResolver );


life.add( dependencies.satisfyDependency( topologyService ) ); life.add( dependencies.satisfyDependency( topologyService ) );


Expand Down
Expand Up @@ -33,14 +33,14 @@
import static org.junit.Assert.assertEquals; import static org.junit.Assert.assertEquals;
import static org.junit.Assert.assertTrue; import static org.junit.Assert.assertTrue;


public class DnsResolutionResolverTest public class DnsHostnameResolverTest
{ {
MapDomainNameResolver mockDomainNameResolver = new MapDomainNameResolver( new HashMap<>() ); MapDomainNameResolver mockDomainNameResolver = new MapDomainNameResolver( new HashMap<>() );
AssertableLogProvider logProvider = new AssertableLogProvider(); AssertableLogProvider logProvider = new AssertableLogProvider();
AssertableLogProvider userLogProvider = new AssertableLogProvider(); AssertableLogProvider userLogProvider = new AssertableLogProvider();


private DnsResolutionResolver resolver = private DnsHostnameResolver resolver =
new DnsResolutionResolver( logProvider, userLogProvider, mockDomainNameResolver ); new DnsHostnameResolver( logProvider, userLogProvider, mockDomainNameResolver );


@Test @Test
public void hostnamesAreResolvedByTheResolver() public void hostnamesAreResolvedByTheResolver()
Expand Down Expand Up @@ -94,7 +94,6 @@ public void unknownHostExceptionsAreLoggedAsErrors()
resolver.resolve( new AdvertisedSocketAddress( "google.com", 1234 ) ); resolver.resolve( new AdvertisedSocketAddress( "google.com", 1234 ) );


// then // then
logProvider.assertContainsMessageContaining( logProvider.assertContainsMessageContaining( "Failed to resolve host 'google.com'" );
"Failed to resolve host `google.com:1234` to IPs due to error: google.com" );
} }
} }
Expand Up @@ -49,7 +49,7 @@ public class SharedDiscoveryService implements DiscoveryServiceFactory


@Override @Override
public CoreTopologyService coreTopologyService( Config config, SslPolicy sslPolicy, MemberId myself, JobScheduler jobScheduler, public CoreTopologyService coreTopologyService( Config config, SslPolicy sslPolicy, MemberId myself, JobScheduler jobScheduler,
LogProvider logProvider, LogProvider userLogProvider, ResolutionResolver resolutionResolver ) LogProvider logProvider, LogProvider userLogProvider, HostnameResolver hostnameResolver )
{ {
SharedDiscoveryCoreClient sharedDiscoveryCoreClient = SharedDiscoveryCoreClient sharedDiscoveryCoreClient =
new SharedDiscoveryCoreClient( this, myself, logProvider, config ); new SharedDiscoveryCoreClient( this, myself, logProvider, config );
Expand All @@ -60,7 +60,7 @@ public CoreTopologyService coreTopologyService( Config config, SslPolicy sslPoli


@Override @Override
public TopologyService topologyService( Config config, SslPolicy sslPolicy, LogProvider logProvider, public TopologyService topologyService( Config config, SslPolicy sslPolicy, LogProvider logProvider,
JobScheduler jobScheduler, MemberId myself, ResolutionResolver resolutionResolver ) JobScheduler jobScheduler, MemberId myself, HostnameResolver hostnameResolver )
{ {
return new SharedDiscoveryReadReplicaClient( this, config, myself, logProvider ); return new SharedDiscoveryReadReplicaClient( this, config, myself, logProvider );
} }
Expand Down
Expand Up @@ -94,11 +94,10 @@ private Callable<Void> createDiscoveryJob( MemberId member, DiscoveryServiceFact
{ {
Neo4jJobScheduler jobScheduler = new Neo4jJobScheduler(); Neo4jJobScheduler jobScheduler = new Neo4jJobScheduler();
jobScheduler.init(); jobScheduler.init();
ResolutionResolver resolutionResolver = new NoOpResolutionResolver(); HostnameResolver hostnameResolver = new NoOpHostnameResolver();


CoreTopologyService topologyService = disoveryServiceFactory CoreTopologyService topologyService = disoveryServiceFactory
.coreTopologyService( config(), null, member, jobScheduler, logProvider, userLogProvider, .coreTopologyService( config(), null, member, jobScheduler, logProvider, userLogProvider, hostnameResolver );
resolutionResolver );
return sharedClientStarter( topologyService, expectedTargetSet ); return sharedClientStarter( topologyService, expectedTargetSet );
} }


Expand Down

0 comments on commit 0c152b2

Please sign in to comment.