Skip to content

Commit 812db7e

Browse files
authored
Merge pull request #592 from ali-ince/1.7-boltserveraddress
Change how BoltServerAddress equality works
2 parents 2b2181b + 7027f73 commit 812db7e

File tree

11 files changed

+176
-137
lines changed

11 files changed

+176
-137
lines changed

driver/src/main/java/org/neo4j/driver/internal/BoltServerAddress.java

Lines changed: 30 additions & 24 deletions
Original file line numberDiff line numberDiff line change
@@ -23,11 +23,15 @@
2323
import java.net.SocketAddress;
2424
import java.net.URI;
2525
import java.net.UnknownHostException;
26+
import java.util.List;
2627
import java.util.Objects;
28+
import java.util.stream.Collectors;
29+
import java.util.stream.Stream;
2730

2831
import org.neo4j.driver.v1.net.ServerAddress;
2932

3033
import static java.util.Objects.requireNonNull;
34+
import static java.util.stream.Collectors.toList;
3135

3236
/**
3337
* Holds a host and port pair that denotes a Bolt server address.
@@ -37,11 +41,12 @@ public class BoltServerAddress implements ServerAddress
3741
public static final int DEFAULT_PORT = 7687;
3842
public static final BoltServerAddress LOCAL_DEFAULT = new BoltServerAddress( "localhost", DEFAULT_PORT );
3943

40-
private final String originalHost; // This keeps the original host name provided by the user.
4144
private final String host; // This could either be the same as originalHost or it is an IP address resolved from the original host.
4245
private final int port;
4346
private final String stringValue;
4447

48+
private InetAddress resolved;
49+
4550
public BoltServerAddress( String address )
4651
{
4752
this( uriFrom( address ) );
@@ -54,15 +59,15 @@ public BoltServerAddress( URI uri )
5459

5560
public BoltServerAddress( String host, int port )
5661
{
57-
this( host, host, port );
62+
this( host, null, port );
5863
}
5964

60-
public BoltServerAddress( String originalHost, String host, int port )
65+
private BoltServerAddress( String host, InetAddress resolved, int port )
6166
{
62-
this.originalHost = requireNonNull( originalHost, "original host" );
6367
this.host = requireNonNull( host, "host" );
68+
this.resolved = resolved;
6469
this.port = requireValidPort( port );
65-
this.stringValue = String.format( "%s:%d", host, port );
70+
this.stringValue = resolved != null ? String.format( "%s(%s):%d", host, resolved.getHostAddress(), port ) : String.format( "%s:%d", host, port );
6671
}
6772

6873
public static BoltServerAddress from( ServerAddress address )
@@ -84,13 +89,13 @@ public boolean equals( Object o )
8489
return false;
8590
}
8691
BoltServerAddress that = (BoltServerAddress) o;
87-
return port == that.port && originalHost.equals( that.originalHost ) && host.equals( that.host );
92+
return port == that.port && host.equals( that.host );
8893
}
8994

9095
@Override
9196
public int hashCode()
9297
{
93-
return Objects.hash( originalHost, host, port );
98+
return Objects.hash( host, port );
9499
}
95100

96101
@Override
@@ -108,38 +113,39 @@ public String toString()
108113
*/
109114
public SocketAddress toSocketAddress()
110115
{
111-
return new InetSocketAddress( host, port );
116+
return resolved == null ? new InetSocketAddress( host, port ) : new InetSocketAddress( resolved, port );
112117
}
113118

114119
/**
115-
* Resolve the host name down to an IP address, if not already resolved.
120+
* Resolve the host name down to an IP address
116121
*
117-
* @return this instance if already resolved, otherwise a new address instance
122+
* @return a new address instance
118123
* @throws UnknownHostException if no IP address for the host could be found
119124
* @see InetAddress#getByName(String)
120125
*/
121126
public BoltServerAddress resolve() throws UnknownHostException
122127
{
123-
String ipAddress = InetAddress.getByName( host ).getHostAddress();
124-
if ( ipAddress.equals( host ) )
125-
{
126-
return this;
127-
}
128-
else
129-
{
130-
return new BoltServerAddress( host, ipAddress, port );
131-
}
128+
return new BoltServerAddress( host, InetAddress.getByName( host ), port );
132129
}
133130

134-
@Override
135-
public String host()
131+
/**
132+
* Resolve the host name down to all IP addresses that can be resolved to
133+
*
134+
* @return an array of new address instances that holds resolved addresses
135+
* @throws UnknownHostException if no IP address for the host could be found
136+
* @see InetAddress#getAllByName(String)
137+
*/
138+
public List<BoltServerAddress> resolveAll() throws UnknownHostException
136139
{
137-
return host;
140+
return Stream.of( InetAddress.getAllByName( host ) )
141+
.map( address -> new BoltServerAddress( host, address, port ) )
142+
.collect( toList() );
138143
}
139144

140-
public String originalHost()
145+
@Override
146+
public String host()
141147
{
142-
return originalHost;
148+
return host;
143149
}
144150

145151
@Override

driver/src/main/java/org/neo4j/driver/internal/DriverFactory.java

Lines changed: 8 additions & 7 deletions
Original file line numberDiff line numberDiff line change
@@ -31,7 +31,7 @@
3131
import org.neo4j.driver.internal.async.ChannelConnectorImpl;
3232
import org.neo4j.driver.internal.async.pool.ConnectionPoolImpl;
3333
import org.neo4j.driver.internal.async.pool.PoolSettings;
34-
import org.neo4j.driver.internal.cluster.DnsResolver;
34+
import org.neo4j.driver.internal.cluster.IdentityResolver;
3535
import org.neo4j.driver.internal.cluster.RoutingContext;
3636
import org.neo4j.driver.internal.cluster.RoutingSettings;
3737
import org.neo4j.driver.internal.cluster.loadbalancing.LeastConnectedLoadBalancingStrategy;
@@ -62,6 +62,7 @@
6262
import org.neo4j.driver.v1.net.ServerAddressResolver;
6363

6464
import static java.lang.String.format;
65+
import static org.neo4j.driver.internal.cluster.IdentityResolver.IDENTITY_RESOLVER;
6566
import static org.neo4j.driver.internal.metrics.InternalAbstractMetrics.DEV_NULL_METRICS;
6667
import static org.neo4j.driver.internal.metrics.spi.Metrics.isMetricsEnabled;
6768
import static org.neo4j.driver.internal.security.SecurityPlan.insecure;
@@ -109,7 +110,7 @@ protected ConnectionPool createConnectionPool( AuthToken authToken, SecurityPlan
109110

110111
protected static InternalAbstractMetrics createDriverMetrics( Config config )
111112
{
112-
if( isMetricsEnabled() )
113+
if ( isMetricsEnabled() )
113114
{
114115
return new InternalMetrics( config );
115116
}
@@ -160,7 +161,7 @@ protected InternalDriver createDirectDriver( SecurityPlan securityPlan, BoltServ
160161
{
161162
ConnectionProvider connectionProvider = new DirectConnectionProvider( address, connectionPool );
162163
SessionFactory sessionFactory = createSessionFactory( connectionProvider, retryLogic, config );
163-
InternalDriver driver = createDriver(securityPlan, sessionFactory, metrics, config);
164+
InternalDriver driver = createDriver( securityPlan, sessionFactory, metrics, config );
164165
Logger log = config.logging().getLog( Driver.class.getSimpleName() );
165166
log.info( "Direct driver instance %s created for server address %s", driver.hashCode(), address );
166167
return driver;
@@ -181,7 +182,7 @@ protected InternalDriver createRoutingDriver( SecurityPlan securityPlan, BoltSer
181182
ConnectionProvider connectionProvider = createLoadBalancer( address, connectionPool, eventExecutorGroup,
182183
config, routingSettings );
183184
SessionFactory sessionFactory = createSessionFactory( connectionProvider, retryLogic, config );
184-
InternalDriver driver = createDriver(securityPlan, sessionFactory, metrics, config);
185+
InternalDriver driver = createDriver( securityPlan, sessionFactory, metrics, config );
185186
Logger log = config.logging().getLog( Driver.class.getSimpleName() );
186187
log.info( "Routing driver instance %s created for server address %s", driver.hashCode(), address );
187188
return driver;
@@ -228,7 +229,7 @@ private static LoadBalancingStrategy createLoadBalancingStrategy( Config config,
228229
private static ServerAddressResolver createResolver( Config config )
229230
{
230231
ServerAddressResolver configuredResolver = config.resolver();
231-
return configuredResolver != null ? configuredResolver : new DnsResolver( config.logging() );
232+
return configuredResolver != null ? configuredResolver : IDENTITY_RESOLVER;
232233
}
233234

234235
/**
@@ -303,12 +304,12 @@ private static SecurityPlan createSecurityPlanImpl( BoltServerAddress address, C
303304
case TRUST_ON_FIRST_USE:
304305
logger.warn(
305306
"Option `TRUST_ON_FIRST_USE` has been deprecated and will be removed in a future " +
306-
"version of the driver. Please switch to use `TRUST_ALL_CERTIFICATES` instead." );
307+
"version of the driver. Please switch to use `TRUST_ALL_CERTIFICATES` instead." );
307308
return SecurityPlan.forTrustOnFirstUse( trustStrategy.certFile(), hostnameVerificationEnabled, address, logger );
308309
case TRUST_SIGNED_CERTIFICATES:
309310
logger.warn(
310311
"Option `TRUST_SIGNED_CERTIFICATE` has been deprecated and will be removed in a future " +
311-
"version of the driver. Please switch to use `TRUST_CUSTOM_CA_SIGNED_CERTIFICATES` instead." );
312+
"version of the driver. Please switch to use `TRUST_CUSTOM_CA_SIGNED_CERTIFICATES` instead." );
312313
// intentional fallthrough
313314

314315
case TRUST_CUSTOM_CA_SIGNED_CERTIFICATES:

driver/src/main/java/org/neo4j/driver/internal/async/NettyChannelInitializer.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -77,7 +77,7 @@ private SslHandler createSslHandler()
7777
private SSLEngine createSslEngine()
7878
{
7979
SSLContext sslContext = securityPlan.sslContext();
80-
SSLEngine sslEngine = sslContext.createSSLEngine( address.originalHost(), address.port() );
80+
SSLEngine sslEngine = sslContext.createSSLEngine( address.host(), address.port() );
8181
sslEngine.setUseClientMode( true );
8282
if ( securityPlan.requiresHostnameVerification() )
8383
{

driver/src/main/java/org/neo4j/driver/internal/cluster/DnsResolver.java renamed to driver/src/main/java/org/neo4j/driver/internal/cluster/IdentityResolver.java

Lines changed: 5 additions & 22 deletions
Original file line numberDiff line numberDiff line change
@@ -18,42 +18,25 @@
1818
*/
1919
package org.neo4j.driver.internal.cluster;
2020

21-
import java.net.InetAddress;
22-
import java.net.UnknownHostException;
2321
import java.util.Set;
24-
import java.util.stream.Stream;
2522

26-
import org.neo4j.driver.internal.BoltServerAddress;
27-
import org.neo4j.driver.v1.Logger;
28-
import org.neo4j.driver.v1.Logging;
2923
import org.neo4j.driver.v1.net.ServerAddress;
3024
import org.neo4j.driver.v1.net.ServerAddressResolver;
3125

3226
import static java.util.Collections.singleton;
33-
import static java.util.stream.Collectors.toSet;
3427

35-
public class DnsResolver implements ServerAddressResolver
28+
public class IdentityResolver implements ServerAddressResolver
3629
{
37-
private final Logger logger;
30+
public static final IdentityResolver IDENTITY_RESOLVER = new IdentityResolver();
3831

39-
public DnsResolver( Logging logging )
32+
private IdentityResolver()
4033
{
41-
this.logger = logging.getLog( DnsResolver.class.getSimpleName() );
34+
4235
}
4336

4437
@Override
4538
public Set<ServerAddress> resolve( ServerAddress initialRouter )
4639
{
47-
try
48-
{
49-
return Stream.of( InetAddress.getAllByName( initialRouter.host() ) )
50-
.map( address -> new BoltServerAddress( initialRouter.host(), address.getHostAddress(), initialRouter.port() ) )
51-
.collect( toSet() );
52-
}
53-
catch ( UnknownHostException e )
54-
{
55-
logger.error( "Failed to resolve address `" + initialRouter + "` to IPs due to error: " + e.getMessage(), e );
56-
return singleton( initialRouter );
57-
}
40+
return singleton( initialRouter );
5841
}
5942
}

driver/src/main/java/org/neo4j/driver/internal/cluster/Rediscovery.java

Lines changed: 19 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,16 @@
2020

2121
import io.netty.util.concurrent.EventExecutorGroup;
2222

23+
import java.net.UnknownHostException;
24+
import java.util.Arrays;
2325
import java.util.HashSet;
2426
import java.util.List;
2527
import java.util.Set;
2628
import java.util.concurrent.CompletableFuture;
2729
import java.util.concurrent.CompletionException;
2830
import java.util.concurrent.CompletionStage;
2931
import java.util.concurrent.TimeUnit;
32+
import java.util.stream.Stream;
3033

3134
import org.neo4j.driver.internal.BoltServerAddress;
3235
import org.neo4j.driver.internal.spi.Connection;
@@ -35,10 +38,12 @@
3538
import org.neo4j.driver.v1.Logger;
3639
import org.neo4j.driver.v1.exceptions.SecurityException;
3740
import org.neo4j.driver.v1.exceptions.ServiceUnavailableException;
41+
import org.neo4j.driver.v1.net.ServerAddress;
3842
import org.neo4j.driver.v1.net.ServerAddressResolver;
3943

4044
import static java.lang.String.format;
4145
import static java.util.Collections.emptySet;
46+
import static java.util.Collections.singleton;
4247
import static java.util.concurrent.CompletableFuture.completedFuture;
4348
import static java.util.stream.Collectors.toList;
4449
import static org.neo4j.driver.internal.util.Futures.completedWithNull;
@@ -270,7 +275,20 @@ private List<BoltServerAddress> resolve( BoltServerAddress address )
270275
{
271276
return resolver.resolve( address )
272277
.stream()
273-
.map( BoltServerAddress::from )
278+
.flatMap( resolved -> resolveAll( BoltServerAddress.from( resolved ) ) )
274279
.collect( toList() ); // collect to list to preserve the order
275280
}
281+
282+
private Stream<BoltServerAddress> resolveAll( BoltServerAddress address )
283+
{
284+
try
285+
{
286+
return address.resolveAll().stream();
287+
}
288+
catch ( UnknownHostException e )
289+
{
290+
logger.error( "Failed to resolve address `" + address + "` to IPs due to error: " + e.getMessage(), e );
291+
return Stream.of( address );
292+
}
293+
}
276294
}

driver/src/main/java/org/neo4j/driver/internal/metrics/InternalMetrics.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -142,7 +142,7 @@ public String toString()
142142

143143
static String serverAddressToUniqueName( BoltServerAddress serverAddress )
144144
{
145-
return serverAddress.toString();
145+
return String.format( "%s:%d", serverAddress.host(), serverAddress.port() );
146146
}
147147

148148
private ConnectionPoolMetricsListener poolMetrics( BoltServerAddress serverAddress )

driver/src/main/java/org/neo4j/driver/v1/net/ServerAddress.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,6 @@ public interface ServerAddress
4949
*/
5050
static ServerAddress of( String host, int port )
5151
{
52-
return new BoltServerAddress( host, host, port );
52+
return new BoltServerAddress( host, port );
5353
}
5454
}

driver/src/test/java/org/neo4j/driver/internal/async/NettyChannelInitializerTest.java

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -114,7 +114,7 @@ void shouldUpdateChannelAttributes()
114114
@Test
115115
void shouldIncludeSniHostName() throws Exception
116116
{
117-
BoltServerAddress address = new BoltServerAddress( "database.neo4j.com", "10.0.0.18", 8989 );
117+
BoltServerAddress address = new BoltServerAddress( "database.neo4j.com", 8989 );
118118
NettyChannelInitializer initializer = new NettyChannelInitializer( address, trustAllCertificates(), 10000, Clock.SYSTEM, DEV_NULL_LOGGING );
119119

120120
initializer.initChannel( channel );
@@ -125,7 +125,7 @@ void shouldIncludeSniHostName() throws Exception
125125
List<SNIServerName> sniServerNames = sslParameters.getServerNames();
126126
assertThat( sniServerNames, hasSize( 1 ) );
127127
assertThat( sniServerNames.get( 0 ), instanceOf( SNIHostName.class ) );
128-
assertThat( ((SNIHostName) sniServerNames.get( 0 )).getAsciiName(), equalTo( address.originalHost() ) );
128+
assertThat( ((SNIHostName) sniServerNames.get( 0 )).getAsciiName(), equalTo( address.host() ) );
129129
}
130130

131131
@Test

0 commit comments

Comments
 (0)