diff --git a/driver-core/src/main/com/mongodb/ServerAddress.java b/driver-core/src/main/com/mongodb/ServerAddress.java index cb9ec61bd51..a537cd775a2 100644 --- a/driver-core/src/main/com/mongodb/ServerAddress.java +++ b/driver-core/src/main/com/mongodb/ServerAddress.java @@ -22,9 +22,6 @@ import java.io.Serializable; import java.net.InetAddress; import java.net.InetSocketAddress; -import java.net.UnknownHostException; -import java.util.ArrayList; -import java.util.List; /** * Represents the location of a Mongo server - i.e. server name and port number @@ -184,44 +181,6 @@ public int getPort() { return port; } - /** - * Gets the underlying socket address - * - * @return socket address - * @deprecated Prefer {@link InetAddress#getByName(String)} - */ - @Deprecated - public InetSocketAddress getSocketAddress() { - try { - return new InetSocketAddress(InetAddress.getByName(host), port); - } catch (UnknownHostException e) { - throw new MongoSocketException(e.getMessage(), this, e); - } - } - - /** - * Gets all underlying socket addresses - * - * @return array of socket addresses - * - * @since 3.9 - * @deprecated Prefer {@link InetAddress#getAllByName(String)} - */ - @Deprecated - public List getSocketAddresses() { - try { - InetAddress[] inetAddresses = InetAddress.getAllByName(host); - List inetSocketAddressList = new ArrayList<>(); - for (InetAddress inetAddress : inetAddresses) { - inetSocketAddressList.add(new InetSocketAddress(inetAddress, port)); - } - - return inetSocketAddressList; - } catch (UnknownHostException e) { - throw new MongoSocketException(e.getMessage(), this, e); - } - } - @Override public String toString() { return host + ":" + port; diff --git a/driver-core/src/main/com/mongodb/UnixServerAddress.java b/driver-core/src/main/com/mongodb/UnixServerAddress.java index 9f003a6cd48..bba882de794 100644 --- a/driver-core/src/main/com/mongodb/UnixServerAddress.java +++ b/driver-core/src/main/com/mongodb/UnixServerAddress.java @@ -17,10 +17,6 @@ package com.mongodb; import com.mongodb.annotations.Immutable; -import jnr.unixsocket.UnixSocketAddress; - -import java.net.InetSocketAddress; -import java.net.SocketAddress; import static com.mongodb.assertions.Assertions.isTrueArgument; import static com.mongodb.assertions.Assertions.notNull; @@ -44,22 +40,6 @@ public UnixServerAddress(final String path) { isTrueArgument("The path must end in .sock", path.endsWith(".sock")); } - @SuppressWarnings("deprecation") - @Deprecated - @Override - public InetSocketAddress getSocketAddress() { - throw new UnsupportedOperationException("Cannot return a InetSocketAddress from a UnixServerAddress"); - } - - /** - * @return the SocketAddress for the MongoD unix domain socket. - * @deprecated Prefer {@link UnixSocketAddress#UnixSocketAddress(String)} - */ - @Deprecated - public SocketAddress getUnixSocketAddress() { - return new UnixSocketAddress(getHost()); - } - @Override public String toString() { return getHost(); diff --git a/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStream.java b/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStream.java index 5f8104047ca..cb1e2a54868 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStream.java +++ b/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStream.java @@ -22,6 +22,7 @@ import com.mongodb.connection.AsyncCompletionHandler; import com.mongodb.connection.SocketSettings; import com.mongodb.lang.Nullable; +import com.mongodb.spi.dns.InetAddressResolver; import java.io.IOException; import java.net.SocketAddress; @@ -36,29 +37,31 @@ import java.util.concurrent.atomic.AtomicReference; import static com.mongodb.assertions.Assertions.isTrue; +import static com.mongodb.internal.connection.ServerAddressHelper.getSocketAddresses; /** *

This class is not part of the public API and may be removed or changed at any time

*/ public final class AsynchronousSocketChannelStream extends AsynchronousChannelStream { private final ServerAddress serverAddress; + private final InetAddressResolver inetAddressResolver; private final SocketSettings settings; - public AsynchronousSocketChannelStream(final ServerAddress serverAddress, final SocketSettings settings, - final PowerOfTwoBufferPool bufferProvider) { + public AsynchronousSocketChannelStream(final ServerAddress serverAddress, final InetAddressResolver inetAddressResolver, + final SocketSettings settings, final PowerOfTwoBufferPool bufferProvider) { super(serverAddress, settings, bufferProvider); this.serverAddress = serverAddress; + this.inetAddressResolver = inetAddressResolver; this.settings = settings; } - @SuppressWarnings("deprecation") @Override public void openAsync(final AsyncCompletionHandler handler) { isTrue("unopened", getChannel() == null); Queue socketAddressQueue; try { - socketAddressQueue = new LinkedList<>(serverAddress.getSocketAddresses()); + socketAddressQueue = new LinkedList<>(getSocketAddresses(serverAddress, inetAddressResolver)); } catch (Throwable t) { handler.failed(t); return; diff --git a/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactory.java b/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactory.java index 546e6c7eba1..65dd6194dcd 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactory.java @@ -19,6 +19,7 @@ import com.mongodb.ServerAddress; import com.mongodb.connection.SocketSettings; import com.mongodb.connection.SslSettings; +import com.mongodb.spi.dns.InetAddressResolver; import static com.mongodb.assertions.Assertions.assertFalse; import static com.mongodb.assertions.Assertions.notNull; @@ -29,6 +30,7 @@ public class AsynchronousSocketChannelStreamFactory implements StreamFactory { private final PowerOfTwoBufferPool bufferProvider = PowerOfTwoBufferPool.DEFAULT; private final SocketSettings settings; + private final InetAddressResolver inetAddressResolver; /** * Create a new factory with the default {@code BufferProvider} and {@code AsynchronousChannelGroup}. @@ -36,14 +38,16 @@ public class AsynchronousSocketChannelStreamFactory implements StreamFactory { * @param settings the settings for the connection to a MongoDB server * @param sslSettings the settings for connecting via SSL */ - public AsynchronousSocketChannelStreamFactory(final SocketSettings settings, final SslSettings sslSettings) { + public AsynchronousSocketChannelStreamFactory(final InetAddressResolver inetAddressResolver, final SocketSettings settings, + final SslSettings sslSettings) { assertFalse(sslSettings.isEnabled()); + this.inetAddressResolver = inetAddressResolver; this.settings = notNull("settings", settings); } @Override public Stream create(final ServerAddress serverAddress) { - return new AsynchronousSocketChannelStream(serverAddress, settings, bufferProvider); + return new AsynchronousSocketChannelStream(serverAddress, inetAddressResolver, settings, bufferProvider); } } diff --git a/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactory.java b/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactory.java index a26b990d838..8810272b90d 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactory.java @@ -18,6 +18,7 @@ import com.mongodb.connection.SocketSettings; import com.mongodb.connection.SslSettings; +import com.mongodb.spi.dns.InetAddressResolver; /** * A {@code StreamFactoryFactory} implementation for AsynchronousSocketChannel-based streams. @@ -25,8 +26,14 @@ * @see java.nio.channels.AsynchronousSocketChannel */ public final class AsynchronousSocketChannelStreamFactoryFactory implements StreamFactoryFactory { + private final InetAddressResolver inetAddressResolver; + + public AsynchronousSocketChannelStreamFactoryFactory(final InetAddressResolver inetAddressResolver) { + this.inetAddressResolver = inetAddressResolver; + } + @Override public StreamFactory create(final SocketSettings socketSettings, final SslSettings sslSettings) { - return new AsynchronousSocketChannelStreamFactory(socketSettings, sslSettings); + return new AsynchronousSocketChannelStreamFactory(inetAddressResolver, socketSettings, sslSettings); } } diff --git a/driver-core/src/main/com/mongodb/internal/connection/DefaultClusterFactory.java b/driver-core/src/main/com/mongodb/internal/connection/DefaultClusterFactory.java index df5c2302d73..2dada0ec654 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/DefaultClusterFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/DefaultClusterFactory.java @@ -36,7 +36,6 @@ import com.mongodb.internal.diagnostics.logging.Loggers; import com.mongodb.lang.Nullable; import com.mongodb.spi.dns.DnsClient; -import com.mongodb.spi.dns.InetAddressResolver; import java.util.List; @@ -68,7 +67,7 @@ public Cluster createCluster(final ClusterSettings originalClusterSettings, fina @Nullable final String applicationName, @Nullable final MongoDriverInformation mongoDriverInformation, final List compressorList, @Nullable final ServerApi serverApi, - @Nullable final DnsClient dnsClient, @Nullable final InetAddressResolver inetAddressResolver) { + @Nullable final DnsClient dnsClient) { detectAndLogClusterEnvironment(originalClusterSettings); @@ -104,14 +103,14 @@ public Cluster createCluster(final ClusterSettings originalClusterSettings, fina ClusterableServerFactory serverFactory = new LoadBalancedClusterableServerFactory(serverSettings, connectionPoolSettings, internalConnectionPoolSettings, streamFactory, credential, loggerSettings, commandListener, applicationName, mongoDriverInformation != null ? mongoDriverInformation : MongoDriverInformation.builder().build(), - compressorList, serverApi, inetAddressResolver); + compressorList, serverApi); return new LoadBalancedCluster(clusterId, clusterSettings, serverFactory, dnsSrvRecordMonitorFactory); } else { ClusterableServerFactory serverFactory = new DefaultClusterableServerFactory(serverSettings, connectionPoolSettings, internalConnectionPoolSettings, streamFactory, heartbeatStreamFactory, credential, loggerSettings, commandListener, applicationName, mongoDriverInformation != null ? mongoDriverInformation : MongoDriverInformation.builder().build(), compressorList, - serverApi, inetAddressResolver); + serverApi); if (clusterSettings.getMode() == ClusterConnectionMode.SINGLE) { return new SingleServerCluster(clusterId, clusterSettings, serverFactory); diff --git a/driver-core/src/main/com/mongodb/internal/connection/DefaultClusterableServerFactory.java b/driver-core/src/main/com/mongodb/internal/connection/DefaultClusterableServerFactory.java index 1e27891babc..d1a3c41c2d4 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/DefaultClusterableServerFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/DefaultClusterableServerFactory.java @@ -30,7 +30,6 @@ import com.mongodb.event.ServerListener; import com.mongodb.internal.inject.SameObjectProvider; import com.mongodb.lang.Nullable; -import com.mongodb.spi.dns.InetAddressResolver; import java.util.List; @@ -54,8 +53,6 @@ public class DefaultClusterableServerFactory implements ClusterableServerFactory private final List compressorList; @Nullable private final ServerApi serverApi; - @Nullable - private final InetAddressResolver inetAddressResolver; public DefaultClusterableServerFactory( final ServerSettings serverSettings, final ConnectionPoolSettings connectionPoolSettings, @@ -65,8 +62,7 @@ public DefaultClusterableServerFactory( final LoggerSettings loggerSettings, @Nullable final CommandListener commandListener, @Nullable final String applicationName, @Nullable final MongoDriverInformation mongoDriverInformation, - final List compressorList, @Nullable final ServerApi serverApi, - @Nullable final InetAddressResolver inetAddressResolver) { + final List compressorList, @Nullable final ServerApi serverApi) { this.serverSettings = serverSettings; this.connectionPoolSettings = connectionPoolSettings; this.internalConnectionPoolSettings = internalConnectionPoolSettings; @@ -79,7 +75,6 @@ public DefaultClusterableServerFactory( this.mongoDriverInformation = mongoDriverInformation; this.compressorList = compressorList; this.serverApi = serverApi; - this.inetAddressResolver = inetAddressResolver; } @Override @@ -90,11 +85,11 @@ public ClusterableServer create(final Cluster cluster, final ServerAddress serve ServerMonitor serverMonitor = new DefaultServerMonitor(serverId, serverSettings, cluster.getClock(), // no credentials, compressor list, or command listener for the server monitor factory new InternalStreamConnectionFactory(clusterMode, true, heartbeatStreamFactory, null, applicationName, - mongoDriverInformation, emptyList(), loggerSettings, null, serverApi, inetAddressResolver), + mongoDriverInformation, emptyList(), loggerSettings, null, serverApi), clusterMode, serverApi, sdamProvider); ConnectionPool connectionPool = new DefaultConnectionPool(serverId, new InternalStreamConnectionFactory(clusterMode, streamFactory, credential, applicationName, - mongoDriverInformation, compressorList, loggerSettings, commandListener, serverApi, inetAddressResolver), + mongoDriverInformation, compressorList, loggerSettings, commandListener, serverApi), connectionPoolSettings, internalConnectionPoolSettings, sdamProvider); ServerListener serverListener = singleServerListener(serverSettings); SdamServerDescriptionManager sdam = new DefaultSdamServerDescriptionManager(cluster, serverId, serverListener, serverMonitor, diff --git a/driver-core/src/main/com/mongodb/internal/connection/DefaultInetAddressResolver.java b/driver-core/src/main/com/mongodb/internal/connection/DefaultInetAddressResolver.java new file mode 100644 index 00000000000..0f8158cf7d2 --- /dev/null +++ b/driver-core/src/main/com/mongodb/internal/connection/DefaultInetAddressResolver.java @@ -0,0 +1,36 @@ +/* + * Copyright 2008-present MongoDB, Inc. + * + * Licensed under the Apache License, Version 2.0 (the "License"); + * you may not use this file except in compliance with the License. + * You may obtain a copy of the License at + * + * http://www.apache.org/licenses/LICENSE-2.0 + * + * Unless required by applicable law or agreed to in writing, software + * distributed under the License is distributed on an "AS IS" BASIS, + * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. + * See the License for the specific language governing permissions and + * limitations under the License. + */ + +package com.mongodb.internal.connection; + +import com.mongodb.spi.dns.InetAddressResolver; + +import java.net.InetAddress; +import java.net.UnknownHostException; +import java.util.List; + +import static java.util.Arrays.asList; + +/** + *

This class is not part of the public API and may be removed or changed at any time

+ */ +public class DefaultInetAddressResolver implements InetAddressResolver { + + @Override + public List lookupByName(final String host) throws UnknownHostException { + return asList(InetAddress.getAllByName(host)); + } +} diff --git a/driver-core/src/main/com/mongodb/internal/connection/InternalStreamConnection.java b/driver-core/src/main/com/mongodb/internal/connection/InternalStreamConnection.java index d4ea8a7be06..d3cd2eab867 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/InternalStreamConnection.java +++ b/driver-core/src/main/com/mongodb/internal/connection/InternalStreamConnection.java @@ -28,7 +28,6 @@ import com.mongodb.MongoSocketWriteException; import com.mongodb.RequestContext; import com.mongodb.ServerAddress; -import com.mongodb.UnixServerAddress; import com.mongodb.annotations.NotThreadSafe; import com.mongodb.connection.AsyncCompletionHandler; import com.mongodb.connection.ClusterConnectionMode; @@ -48,7 +47,6 @@ import com.mongodb.internal.logging.StructuredLogger; import com.mongodb.internal.session.SessionContext; import com.mongodb.lang.Nullable; -import com.mongodb.spi.dns.InetAddressResolver; import org.bson.BsonBinaryReader; import org.bson.BsonDocument; import org.bson.ByteBuf; @@ -118,8 +116,6 @@ public class InternalStreamConnection implements InternalConnection { private final ConnectionGenerationSupplier connectionGenerationSupplier; private final StreamFactory streamFactory; private final InternalConnectionInitializer connectionInitializer; - private final InetAddressResolver inetAddressResolver; - private volatile ConnectionDescription description; private volatile ServerDescription initialServerDescription; private volatile Stream stream; @@ -150,10 +146,9 @@ static Set getSecuritySensitiveHelloCommands() { public InternalStreamConnection(final ClusterConnectionMode clusterConnectionMode, final ServerId serverId, final ConnectionGenerationSupplier connectionGenerationSupplier, final StreamFactory streamFactory, final List compressorList, - final CommandListener commandListener, final InternalConnectionInitializer connectionInitializer, - @Nullable final InetAddressResolver inetAddressResolver) { + final CommandListener commandListener, final InternalConnectionInitializer connectionInitializer) { this(clusterConnectionMode, false, serverId, connectionGenerationSupplier, streamFactory, compressorList, - LoggerSettings.builder().build(), commandListener, connectionInitializer, inetAddressResolver); + LoggerSettings.builder().build(), commandListener, connectionInitializer); } public InternalStreamConnection(final ClusterConnectionMode clusterConnectionMode, final boolean isMonitoringConnection, @@ -161,8 +156,7 @@ public InternalStreamConnection(final ClusterConnectionMode clusterConnectionMod final ConnectionGenerationSupplier connectionGenerationSupplier, final StreamFactory streamFactory, final List compressorList, final LoggerSettings loggerSettings, - final CommandListener commandListener, final InternalConnectionInitializer connectionInitializer, - @Nullable final InetAddressResolver inetAddressResolver) { + final CommandListener commandListener, final InternalConnectionInitializer connectionInitializer) { this.clusterConnectionMode = clusterConnectionMode; this.isMonitoringConnection = isMonitoringConnection; this.serverId = notNull("serverId", serverId); @@ -179,7 +173,6 @@ public InternalStreamConnection(final ClusterConnectionMode clusterConnectionMod .type(ServerType.UNKNOWN) .state(ServerConnectionState.CONNECTING) .build(); - this.inetAddressResolver = inetAddressResolver; if (clusterConnectionMode != ClusterConnectionMode.LOAD_BALANCED) { generation = connectionGenerationSupplier.getGeneration(); } @@ -203,7 +196,7 @@ public int getGeneration() { @Override public void open() { isTrue("Open already called", stream == null); - stream = streamFactory.create(getServerAddressWithResolver()); + stream = streamFactory.create(serverId.getAddress()); try { stream.open(); @@ -226,7 +219,7 @@ public void open() { public void openAsync(final SingleResultCallback callback) { isTrue("Open already called", stream == null, callback); try { - stream = streamFactory.create(getServerAddressWithResolver()); + stream = streamFactory.create(serverId.getAddress()); stream.openAsync(new AsyncCompletionHandler() { @Override public void completed(@Nullable final Void aVoid) { @@ -265,14 +258,6 @@ public void failed(final Throwable t) { } } - private ServerAddress getServerAddressWithResolver() { - if (serverId.getAddress() instanceof UnixServerAddress) { - return serverId.getAddress(); - } else { - return new ServerAddressWithResolver(serverId.getAddress(), inetAddressResolver); - } - } - private void initAfterHandshakeStart(final InternalConnectionInitializationDescription initializationDescription) { description = initializationDescription.getConnectionDescription(); initialServerDescription = initializationDescription.getServerDescription(); diff --git a/driver-core/src/main/com/mongodb/internal/connection/InternalStreamConnectionFactory.java b/driver-core/src/main/com/mongodb/internal/connection/InternalStreamConnectionFactory.java index a74be77a7d0..6cf2453c187 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/InternalStreamConnectionFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/InternalStreamConnectionFactory.java @@ -24,7 +24,6 @@ import com.mongodb.connection.ServerId; import com.mongodb.event.CommandListener; import com.mongodb.lang.Nullable; -import com.mongodb.spi.dns.InetAddressResolver; import org.bson.BsonDocument; import java.util.List; @@ -43,7 +42,6 @@ class InternalStreamConnectionFactory implements InternalConnectionFactory { private final CommandListener commandListener; @Nullable private final ServerApi serverApi; - private final InetAddressResolver inetAddressResolver; private final MongoCredentialWithCache credential; InternalStreamConnectionFactory(final ClusterConnectionMode clusterConnectionMode, @@ -51,10 +49,9 @@ class InternalStreamConnectionFactory implements InternalConnectionFactory { @Nullable final MongoCredentialWithCache credential, @Nullable final String applicationName, @Nullable final MongoDriverInformation mongoDriverInformation, final List compressorList, - final LoggerSettings loggerSettings, @Nullable final CommandListener commandListener, @Nullable final ServerApi serverApi, - @Nullable final InetAddressResolver inetAddressResolver) { + final LoggerSettings loggerSettings, @Nullable final CommandListener commandListener, @Nullable final ServerApi serverApi) { this(clusterConnectionMode, false, streamFactory, credential, applicationName, mongoDriverInformation, compressorList, - loggerSettings, commandListener, serverApi, inetAddressResolver); + loggerSettings, commandListener, serverApi); } InternalStreamConnectionFactory(final ClusterConnectionMode clusterConnectionMode, final boolean isMonitoringConnection, @@ -62,8 +59,7 @@ class InternalStreamConnectionFactory implements InternalConnectionFactory { @Nullable final MongoCredentialWithCache credential, @Nullable final String applicationName, @Nullable final MongoDriverInformation mongoDriverInformation, final List compressorList, - final LoggerSettings loggerSettings, @Nullable final CommandListener commandListener, @Nullable final ServerApi serverApi, - @Nullable final InetAddressResolver inetAddressResolver) { + final LoggerSettings loggerSettings, @Nullable final CommandListener commandListener, @Nullable final ServerApi serverApi) { this.clusterConnectionMode = clusterConnectionMode; this.isMonitoringConnection = isMonitoringConnection; this.streamFactory = notNull("streamFactory", streamFactory); @@ -71,7 +67,6 @@ class InternalStreamConnectionFactory implements InternalConnectionFactory { this.loggerSettings = loggerSettings; this.commandListener = commandListener; this.serverApi = serverApi; - this.inetAddressResolver = inetAddressResolver; this.clientMetadataDocument = createClientMetadataDocument(applicationName, mongoDriverInformation); this.credential = credential; } @@ -82,7 +77,7 @@ public InternalConnection create(final ServerId serverId, final ConnectionGenera return new InternalStreamConnection(clusterConnectionMode, isMonitoringConnection, serverId, connectionGenerationSupplier, streamFactory, compressorList, loggerSettings, commandListener, new InternalStreamConnectionInitializer(clusterConnectionMode, authenticator, clientMetadataDocument, compressorList, - serverApi), inetAddressResolver); + serverApi)); } private Authenticator createAuthenticator(final MongoCredentialWithCache credential) { diff --git a/driver-core/src/main/com/mongodb/internal/connection/LoadBalancedClusterableServerFactory.java b/driver-core/src/main/com/mongodb/internal/connection/LoadBalancedClusterableServerFactory.java index 418d7842088..0521e094cb1 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/LoadBalancedClusterableServerFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/LoadBalancedClusterableServerFactory.java @@ -30,7 +30,6 @@ import com.mongodb.event.CommandListener; import com.mongodb.internal.inject.EmptyProvider; import com.mongodb.lang.Nullable; -import com.mongodb.spi.dns.InetAddressResolver; import java.util.List; @@ -52,7 +51,6 @@ public class LoadBalancedClusterableServerFactory implements ClusterableServerFa private final MongoDriverInformation mongoDriverInformation; private final List compressorList; private final ServerApi serverApi; - private final InetAddressResolver inetAddressResolver; public LoadBalancedClusterableServerFactory(final ServerSettings serverSettings, final ConnectionPoolSettings connectionPoolSettings, @@ -61,8 +59,7 @@ public LoadBalancedClusterableServerFactory(final ServerSettings serverSettings, final LoggerSettings loggerSettings, @Nullable final CommandListener commandListener, @Nullable final String applicationName, final MongoDriverInformation mongoDriverInformation, - final List compressorList, @Nullable final ServerApi serverApi, - @Nullable final InetAddressResolver inetAddressResolver) { + final List compressorList, @Nullable final ServerApi serverApi) { this.serverSettings = serverSettings; this.connectionPoolSettings = connectionPoolSettings; this.internalConnectionPoolSettings = internalConnectionPoolSettings; @@ -74,14 +71,13 @@ public LoadBalancedClusterableServerFactory(final ServerSettings serverSettings, this.mongoDriverInformation = mongoDriverInformation; this.compressorList = compressorList; this.serverApi = serverApi; - this.inetAddressResolver = inetAddressResolver; } @Override public ClusterableServer create(final Cluster cluster, final ServerAddress serverAddress) { ConnectionPool connectionPool = new DefaultConnectionPool(new ServerId(cluster.getClusterId(), serverAddress), new InternalStreamConnectionFactory(ClusterConnectionMode.LOAD_BALANCED, streamFactory, credential, applicationName, - mongoDriverInformation, compressorList, loggerSettings, commandListener, serverApi, inetAddressResolver), + mongoDriverInformation, compressorList, loggerSettings, commandListener, serverApi), connectionPoolSettings, internalConnectionPoolSettings, EmptyProvider.instance()); connectionPool.ready(); diff --git a/driver-core/src/main/com/mongodb/internal/connection/ServerAddressHelper.java b/driver-core/src/main/com/mongodb/internal/connection/ServerAddressHelper.java index e080fd150da..de004b748ab 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/ServerAddressHelper.java +++ b/driver-core/src/main/com/mongodb/internal/connection/ServerAddressHelper.java @@ -17,8 +17,16 @@ package com.mongodb.internal.connection; +import com.mongodb.MongoClientSettings; +import com.mongodb.MongoSocketException; import com.mongodb.ServerAddress; import com.mongodb.UnixServerAddress; +import com.mongodb.spi.dns.InetAddressResolver; + +import java.net.InetSocketAddress; +import java.net.UnknownHostException; +import java.util.List; +import java.util.stream.Collectors; /** *

This class is not part of the public API and may be removed or changed at any time

@@ -37,6 +45,21 @@ public static ServerAddress createServerAddress(final String host, final int por } } + public static InetAddressResolver getInetAddressResolver(final MongoClientSettings settings) { + InetAddressResolver inetAddressResolver = settings.getInetAddressResolver(); + return inetAddressResolver == null ? new DefaultInetAddressResolver() : inetAddressResolver; + } + + public static List getSocketAddresses(final ServerAddress serverAddress, final InetAddressResolver resolver) { + try { + return resolver.lookupByName(serverAddress.getHost()) + .stream() + .map(inetAddress -> new InetSocketAddress(inetAddress, serverAddress.getPort())).collect(Collectors.toList()); + } catch (UnknownHostException e) { + throw new MongoSocketException(e.getMessage(), serverAddress, e); + } + } + private ServerAddressHelper() { } } diff --git a/driver-core/src/main/com/mongodb/internal/connection/ServerAddressWithResolver.java b/driver-core/src/main/com/mongodb/internal/connection/ServerAddressWithResolver.java deleted file mode 100644 index e86d1fca189..00000000000 --- a/driver-core/src/main/com/mongodb/internal/connection/ServerAddressWithResolver.java +++ /dev/null @@ -1,98 +0,0 @@ -/* - * Copyright 2008-present MongoDB, Inc. - * - * Licensed under the Apache License, Version 2.0 (the "License"); - * you may not use this file except in compliance with the License. - * You may obtain a copy of the License at - * - * http://www.apache.org/licenses/LICENSE-2.0 - * - * Unless required by applicable law or agreed to in writing, software - * distributed under the License is distributed on an "AS IS" BASIS, - * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied. - * See the License for the specific language governing permissions and - * limitations under the License. - */ - -package com.mongodb.internal.connection; - -import com.mongodb.MongoSocketException; -import com.mongodb.ServerAddress; -import com.mongodb.lang.Nullable; -import com.mongodb.spi.dns.InetAddressResolver; -import com.mongodb.spi.dns.InetAddressResolverProvider; - -import java.net.InetSocketAddress; -import java.net.UnknownHostException; -import java.util.List; -import java.util.Objects; -import java.util.ServiceLoader; -import java.util.stream.Collectors; -import java.util.stream.StreamSupport; - -final class ServerAddressWithResolver extends ServerAddress { - private static final long serialVersionUID = 1; - - @Nullable - private static final InetAddressResolver DEFAULT_INET_ADDRESS_RESOLVER; - - static { - DEFAULT_INET_ADDRESS_RESOLVER = StreamSupport.stream(ServiceLoader.load(InetAddressResolverProvider.class).spliterator(), false) - .findFirst() - .map(InetAddressResolverProvider::create) - .orElse(null); - } - - @Nullable - private final transient InetAddressResolver resolver; - - ServerAddressWithResolver(final ServerAddress serverAddress, @Nullable final InetAddressResolver inetAddressResolver) { - super(serverAddress.getHost(), serverAddress.getPort()); - this.resolver = inetAddressResolver == null ? DEFAULT_INET_ADDRESS_RESOLVER : inetAddressResolver; - } - - @SuppressWarnings("deprecation") - @Override - public InetSocketAddress getSocketAddress() { - if (resolver == null) { - return super.getSocketAddress(); - } - - return getSocketAddresses().get(0); - } - - @SuppressWarnings("deprecation") - @Override - public List getSocketAddresses() { - if (resolver == null) { - return super.getSocketAddresses(); - } - try { - return resolver.lookupByName(getHost()) - .stream() - .map(inetAddress -> new InetSocketAddress(inetAddress, getPort())).collect(Collectors.toList()); - } catch (UnknownHostException e) { - throw new MongoSocketException(e.getMessage(), this, e); - } - } - - @Override - public boolean equals(final Object o) { - if (this == o) { - return true; - } - if (o == null || getClass() != o.getClass()) { - return false; - } - if (!super.equals(o)) { - return false; - } - ServerAddressWithResolver that = (ServerAddressWithResolver) o; - return Objects.equals(resolver, that.resolver); - } - - @Override - public int hashCode() { - return Objects.hash(super.hashCode(), resolver); - } -} diff --git a/driver-core/src/main/com/mongodb/internal/connection/SocketStream.java b/driver-core/src/main/com/mongodb/internal/connection/SocketStream.java index 0e1824d7f8a..a7f71314757 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/SocketStream.java +++ b/driver-core/src/main/com/mongodb/internal/connection/SocketStream.java @@ -24,6 +24,7 @@ import com.mongodb.connection.ProxySettings; import com.mongodb.connection.SocketSettings; import com.mongodb.connection.SslSettings; +import com.mongodb.spi.dns.InetAddressResolver; import org.bson.ByteBuf; import javax.net.SocketFactory; @@ -41,6 +42,7 @@ import static com.mongodb.assertions.Assertions.assertTrue; import static com.mongodb.assertions.Assertions.notNull; +import static com.mongodb.internal.connection.ServerAddressHelper.getSocketAddresses; import static com.mongodb.internal.connection.SocketStreamHelper.configureSocket; import static com.mongodb.internal.connection.SslHelper.configureSslSocket; import static com.mongodb.internal.thread.InterruptionUtil.translateInterruptedException; @@ -51,6 +53,7 @@ */ public class SocketStream implements Stream { private final ServerAddress address; + private final InetAddressResolver inetAddressResolver; private final SocketSettings settings; private final SslSettings sslSettings; private final SocketFactory socketFactory; @@ -60,13 +63,15 @@ public class SocketStream implements Stream { private volatile InputStream inputStream; private volatile boolean isClosed; - public SocketStream(final ServerAddress address, final SocketSettings settings, final SslSettings sslSettings, - final SocketFactory socketFactory, final BufferProvider bufferProvider) { + public SocketStream(final ServerAddress address, final InetAddressResolver inetAddressResolver, + final SocketSettings settings, final SslSettings sslSettings, + final SocketFactory socketFactory, final BufferProvider bufferProvider) { this.address = notNull("address", address); this.settings = notNull("settings", settings); this.sslSettings = notNull("sslSettings", sslSettings); this.socketFactory = notNull("socketFactory", socketFactory); this.bufferProvider = notNull("bufferProvider", bufferProvider); + this.inetAddressResolver = inetAddressResolver; } @Override @@ -82,7 +87,6 @@ public void open() { } } - @SuppressWarnings("deprecation") protected Socket initializeSocket() throws IOException { ProxySettings proxySettings = settings.getProxySettings(); if (proxySettings.isProxyEnabled()) { @@ -94,7 +98,7 @@ protected Socket initializeSocket() throws IOException { return initializeSocketOverSocksProxy(); } - Iterator inetSocketAddresses = address.getSocketAddresses().iterator(); + Iterator inetSocketAddresses = getSocketAddresses(address, inetAddressResolver).iterator(); while (inetSocketAddresses.hasNext()) { Socket socket = socketFactory.createSocket(); try { diff --git a/driver-core/src/main/com/mongodb/internal/connection/SocketStreamFactory.java b/driver-core/src/main/com/mongodb/internal/connection/SocketStreamFactory.java index d50e9c9313a..793fc8b3dc4 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/SocketStreamFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/SocketStreamFactory.java @@ -21,6 +21,7 @@ import com.mongodb.UnixServerAddress; import com.mongodb.connection.SocketSettings; import com.mongodb.connection.SslSettings; +import com.mongodb.spi.dns.InetAddressResolver; import javax.net.SocketFactory; import javax.net.ssl.SSLContext; @@ -33,6 +34,7 @@ * Factory for creating instances of {@code SocketStream}. */ public class SocketStreamFactory implements StreamFactory { + private final InetAddressResolver inetAddressResolver; private final SocketSettings settings; private final SslSettings sslSettings; private final BufferProvider bufferProvider = PowerOfTwoBufferPool.DEFAULT; @@ -40,10 +42,13 @@ public class SocketStreamFactory implements StreamFactory { /** * Creates a new factory with the given settings for connecting to servers and the given SSL settings * - * @param settings the SocketSettings for connecting to a MongoDB server - * @param sslSettings whether SSL is enabled. + * @param inetAddressResolver resolver + * @param settings the SocketSettings for connecting to a MongoDB server + * @param sslSettings whether SSL is enabled. */ - public SocketStreamFactory(final SocketSettings settings, final SslSettings sslSettings) { + public SocketStreamFactory(final InetAddressResolver inetAddressResolver, final SocketSettings settings, + final SslSettings sslSettings) { + this.inetAddressResolver = inetAddressResolver; this.settings = notNull("settings", settings); this.sslSettings = notNull("sslSettings", sslSettings); } @@ -58,9 +63,11 @@ public Stream create(final ServerAddress serverAddress) { stream = new UnixSocketChannelStream((UnixServerAddress) serverAddress, settings, sslSettings, bufferProvider); } else { if (sslSettings.isEnabled()) { - stream = new SocketStream(serverAddress, settings, sslSettings, getSslContext().getSocketFactory(), bufferProvider); + stream = new SocketStream(serverAddress, inetAddressResolver, settings, sslSettings, getSslContext().getSocketFactory(), + bufferProvider); } else { - stream = new SocketStream(serverAddress, settings, sslSettings, SocketFactory.getDefault(), bufferProvider); + stream = new SocketStream(serverAddress, inetAddressResolver, settings, sslSettings, SocketFactory.getDefault(), + bufferProvider); } } return stream; diff --git a/driver-core/src/main/com/mongodb/internal/connection/StreamFactoryHelper.java b/driver-core/src/main/com/mongodb/internal/connection/StreamFactoryHelper.java index dd08aea9ace..ef40c164cba 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/StreamFactoryHelper.java +++ b/driver-core/src/main/com/mongodb/internal/connection/StreamFactoryHelper.java @@ -20,14 +20,18 @@ import com.mongodb.connection.NettyTransportSettings; import com.mongodb.connection.TransportSettings; import com.mongodb.internal.connection.netty.NettyStreamFactoryFactory; +import com.mongodb.spi.dns.InetAddressResolver; /** *

This class is not part of the public API and may be removed or changed at any time

*/ public final class StreamFactoryHelper { - public static StreamFactoryFactory getStreamFactoryFactoryFromSettings(final TransportSettings transportSettings) { + public static StreamFactoryFactory getStreamFactoryFactoryFromSettings(final TransportSettings transportSettings, + final InetAddressResolver inetAddressResolver) { if (transportSettings instanceof NettyTransportSettings) { - return NettyStreamFactoryFactory.builder().applySettings((NettyTransportSettings) transportSettings).build(); + return NettyStreamFactoryFactory.builder().applySettings((NettyTransportSettings) transportSettings) + .inetAddressResolver(inetAddressResolver) + .build(); } else { throw new MongoClientException("Unsupported transport settings: " + transportSettings.getClass().getName()); } diff --git a/driver-core/src/main/com/mongodb/internal/connection/TlsChannelStreamFactoryFactory.java b/driver-core/src/main/com/mongodb/internal/connection/TlsChannelStreamFactoryFactory.java index 70db0cced2c..4f6bacef191 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/TlsChannelStreamFactoryFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/TlsChannelStreamFactoryFactory.java @@ -30,6 +30,7 @@ import com.mongodb.internal.diagnostics.logging.Logger; import com.mongodb.internal.diagnostics.logging.Loggers; import com.mongodb.lang.Nullable; +import com.mongodb.spi.dns.InetAddressResolver; import javax.net.ssl.SSLContext; import javax.net.ssl.SSLEngine; @@ -50,6 +51,7 @@ import static com.mongodb.assertions.Assertions.assertTrue; import static com.mongodb.assertions.Assertions.isTrue; +import static com.mongodb.internal.connection.ServerAddressHelper.getSocketAddresses; import static com.mongodb.internal.connection.SslHelper.enableHostNameVerification; import static com.mongodb.internal.connection.SslHelper.enableSni; import static java.util.Optional.ofNullable; @@ -64,11 +66,13 @@ public class TlsChannelStreamFactoryFactory implements StreamFactoryFactory, Clo private final SelectorMonitor selectorMonitor; private final AsynchronousTlsChannelGroup group; private final PowerOfTwoBufferPool bufferPool = PowerOfTwoBufferPool.DEFAULT; + private final InetAddressResolver inetAddressResolver; /** * Construct a new instance */ - public TlsChannelStreamFactoryFactory() { + public TlsChannelStreamFactoryFactory(final InetAddressResolver inetAddressResolver) { + this.inetAddressResolver = inetAddressResolver; this.group = new AsynchronousTlsChannelGroup(); selectorMonitor = new SelectorMonitor(); selectorMonitor.start(); @@ -77,7 +81,8 @@ public TlsChannelStreamFactoryFactory() { @Override public StreamFactory create(final SocketSettings socketSettings, final SslSettings sslSettings) { assertTrue(sslSettings.isEnabled()); - return serverAddress -> new TlsChannelStream(serverAddress, socketSettings, sslSettings, bufferPool, group, selectorMonitor); + return serverAddress -> new TlsChannelStream(serverAddress, inetAddressResolver, socketSettings, sslSettings, bufferPool, group, + selectorMonitor); } @Override @@ -161,12 +166,14 @@ private static class TlsChannelStream extends AsynchronousChannelStream { private final AsynchronousTlsChannelGroup group; private final SelectorMonitor selectorMonitor; + private final InetAddressResolver inetAddressResolver; private final SslSettings sslSettings; - TlsChannelStream(final ServerAddress serverAddress, final SocketSettings settings, final SslSettings sslSettings, - final PowerOfTwoBufferPool bufferProvider, final AsynchronousTlsChannelGroup group, - final SelectorMonitor selectorMonitor) { + TlsChannelStream(final ServerAddress serverAddress, final InetAddressResolver inetAddressResolver, + final SocketSettings settings, final SslSettings sslSettings, final PowerOfTwoBufferPool bufferProvider, + final AsynchronousTlsChannelGroup group, final SelectorMonitor selectorMonitor) { super(serverAddress, settings, bufferProvider); + this.inetAddressResolver = inetAddressResolver; this.sslSettings = sslSettings; this.group = group; this.selectorMonitor = selectorMonitor; @@ -177,7 +184,6 @@ public boolean supportsAdditionalTimeout() { return true; } - @SuppressWarnings("deprecation") @Override public void openAsync(final AsyncCompletionHandler handler) { isTrue("unopened", getChannel() == null); @@ -194,7 +200,7 @@ public void openAsync(final AsyncCompletionHandler handler) { socketChannel.setOption(StandardSocketOptions.SO_SNDBUF, getSettings().getSendBufferSize()); } - socketChannel.connect(getServerAddress().getSocketAddress()); + socketChannel.connect(getSocketAddresses(getServerAddress(), inetAddressResolver).get(0)); selectorMonitor.register(socketChannel, () -> { try { diff --git a/driver-core/src/main/com/mongodb/internal/connection/UnixSocketChannelStream.java b/driver-core/src/main/com/mongodb/internal/connection/UnixSocketChannelStream.java index 1e776481bdd..e80909a2c79 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/UnixSocketChannelStream.java +++ b/driver-core/src/main/com/mongodb/internal/connection/UnixSocketChannelStream.java @@ -34,13 +34,12 @@ public class UnixSocketChannelStream extends SocketStream { public UnixSocketChannelStream(final UnixServerAddress address, final SocketSettings settings, final SslSettings sslSettings, final BufferProvider bufferProvider) { - super(address, settings, sslSettings, SocketFactory.getDefault(), bufferProvider); + super(address, new DefaultInetAddressResolver(), settings, sslSettings, SocketFactory.getDefault(), bufferProvider); this.address = address; } - @SuppressWarnings("deprecation") @Override protected Socket initializeSocket() throws IOException { - return UnixSocketChannel.open((UnixSocketAddress) address.getUnixSocketAddress()).socket(); + return UnixSocketChannel.open(new UnixSocketAddress(address.getHost())).socket(); } } diff --git a/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStream.java b/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStream.java index 786b191ffdc..8d9f9b65372 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStream.java +++ b/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStream.java @@ -29,6 +29,7 @@ import com.mongodb.connection.SslSettings; import com.mongodb.internal.connection.Stream; import com.mongodb.lang.Nullable; +import com.mongodb.spi.dns.InetAddressResolver; import io.netty.bootstrap.Bootstrap; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.CompositeByteBuf; @@ -68,6 +69,7 @@ import static com.mongodb.assertions.Assertions.assertNotNull; import static com.mongodb.assertions.Assertions.isTrueArgument; import static com.mongodb.internal.Locks.withLock; +import static com.mongodb.internal.connection.ServerAddressHelper.getSocketAddresses; import static com.mongodb.internal.connection.SslHelper.enableHostNameVerification; import static com.mongodb.internal.connection.SslHelper.enableSni; import static com.mongodb.internal.thread.InterruptionUtil.interruptAndCreateMongoInterruptedException; @@ -110,6 +112,7 @@ final class NettyStream implements Stream { private static final byte NO_SCHEDULE_TIME = 0; private final ServerAddress address; + private final InetAddressResolver inetAddressResolver; private final SocketSettings settings; private final SslSettings sslSettings; private final EventLoopGroup workerGroup; @@ -136,10 +139,12 @@ final class NettyStream implements Stream { private ReadTimeoutTask readTimeoutTask; private long readTimeoutMillis = NO_SCHEDULE_TIME; - NettyStream(final ServerAddress address, final SocketSettings settings, final SslSettings sslSettings, final EventLoopGroup workerGroup, - final Class socketChannelClass, final ByteBufAllocator allocator, - @Nullable final SslContext sslContext) { + NettyStream(final ServerAddress address, final InetAddressResolver inetAddressResolver, final SocketSettings settings, + final SslSettings sslSettings, final EventLoopGroup workerGroup, + final Class socketChannelClass, final ByteBufAllocator allocator, + @Nullable final SslContext sslContext) { this.address = address; + this.inetAddressResolver = inetAddressResolver; this.settings = settings; this.sslSettings = sslSettings; this.workerGroup = workerGroup; @@ -166,7 +171,7 @@ public void openAsync(final AsyncCompletionHandler handler) { Queue socketAddressQueue; try { - socketAddressQueue = new LinkedList<>(address.getSocketAddresses()); + socketAddressQueue = new LinkedList<>(getSocketAddresses(address, inetAddressResolver)); } catch (Throwable t) { handler.failed(t); return; diff --git a/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactory.java b/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactory.java index 91b5e11d863..ace80a347a2 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactory.java @@ -19,9 +19,11 @@ import com.mongodb.ServerAddress; import com.mongodb.connection.SocketSettings; import com.mongodb.connection.SslSettings; +import com.mongodb.internal.connection.DefaultInetAddressResolver; import com.mongodb.internal.connection.Stream; import com.mongodb.internal.connection.StreamFactory; import com.mongodb.lang.Nullable; +import com.mongodb.spi.dns.InetAddressResolver; import io.netty.buffer.ByteBufAllocator; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.EventLoopGroup; @@ -33,9 +35,10 @@ import static com.mongodb.assertions.Assertions.notNull; /** - * A StreamFactory for Streams based on Netty 4.x. + * A StreamFactory for Streams based on Netty 4.x. */ public class NettyStreamFactory implements StreamFactory { + private final InetAddressResolver inetAddressResolver; private final SocketSettings settings; private final SslSettings sslSettings; private final EventLoopGroup eventLoopGroup; @@ -55,10 +58,10 @@ public class NettyStreamFactory implements StreamFactory { * @param sslContext the Netty {@link SslContext} * as specified by {@link NettyStreamFactoryFactory.Builder#sslContext(SslContext)}. */ - public NettyStreamFactory(final SocketSettings settings, final SslSettings sslSettings, - final EventLoopGroup eventLoopGroup, final Class socketChannelClass, - final ByteBufAllocator allocator, - @Nullable final SslContext sslContext) { + public NettyStreamFactory(final InetAddressResolver inetAddressResolver, final SocketSettings settings, + final SslSettings sslSettings, final EventLoopGroup eventLoopGroup, final Class socketChannelClass, + final ByteBufAllocator allocator, @Nullable final SslContext sslContext) { + this.inetAddressResolver = inetAddressResolver; this.settings = notNull("settings", settings); this.sslSettings = notNull("sslSettings", sslSettings); this.eventLoopGroup = notNull("eventLoopGroup", eventLoopGroup); @@ -79,7 +82,7 @@ public NettyStreamFactory(final SocketSettings settings, final SslSettings sslSe public NettyStreamFactory(final SocketSettings settings, final SslSettings sslSettings, final EventLoopGroup eventLoopGroup, final Class socketChannelClass, final ByteBufAllocator allocator) { - this(settings, sslSettings, eventLoopGroup, socketChannelClass, allocator, null); + this(new DefaultInetAddressResolver(), settings, sslSettings, eventLoopGroup, socketChannelClass, allocator, null); } /** @@ -118,7 +121,8 @@ public NettyStreamFactory(final SocketSettings settings, final SslSettings sslSe @Override public Stream create(final ServerAddress serverAddress) { - return new NettyStream(serverAddress, settings, sslSettings, eventLoopGroup, socketChannelClass, allocator, sslContext); + return new NettyStream(serverAddress, inetAddressResolver, settings, sslSettings, eventLoopGroup, socketChannelClass, allocator, + sslContext); } } diff --git a/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactoryFactory.java b/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactoryFactory.java index bc72e7514e9..d1f6e52f356 100644 --- a/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactoryFactory.java +++ b/driver-core/src/main/com/mongodb/internal/connection/netty/NettyStreamFactoryFactory.java @@ -19,10 +19,11 @@ import com.mongodb.connection.NettyTransportSettings; import com.mongodb.connection.SocketSettings; import com.mongodb.connection.SslSettings; +import com.mongodb.internal.VisibleForTesting; import com.mongodb.internal.connection.StreamFactory; import com.mongodb.internal.connection.StreamFactoryFactory; -import com.mongodb.internal.VisibleForTesting; import com.mongodb.lang.Nullable; +import com.mongodb.spi.dns.InetAddressResolver; import io.netty.buffer.ByteBufAllocator; import io.netty.channel.EventLoopGroup; import io.netty.channel.nio.NioEventLoopGroup; @@ -41,7 +42,7 @@ import static com.mongodb.internal.VisibleForTesting.AccessModifier.PRIVATE; /** - * A {@code StreamFactoryFactory} implementation for Netty-based streams. + * A {@code StreamFactoryFactory} implementation for Netty-based streams. */ public final class NettyStreamFactoryFactory implements StreamFactoryFactory { @@ -50,6 +51,7 @@ public final class NettyStreamFactoryFactory implements StreamFactoryFactory { private final ByteBufAllocator allocator; @Nullable private final SslContext sslContext; + private final InetAddressResolver inetAddressResolver; /** * Gets a builder for an instance of {@code NettyStreamFactoryFactory}. @@ -89,6 +91,7 @@ public static final class Builder { private EventLoopGroup eventLoopGroup; @Nullable private SslContext sslContext; + private InetAddressResolver inetAddressResolver; private Builder() { } @@ -179,6 +182,11 @@ public Builder sslContext(final SslContext sslContext) { return this; } + public Builder inetAddressResolver(final InetAddressResolver inetAddressResolver) { + this.inetAddressResolver = inetAddressResolver; + return this; + } + /** * Build an instance of {@code NettyStreamFactoryFactory}. * @return factory of the netty stream factory @@ -190,7 +198,8 @@ public NettyStreamFactoryFactory build() { @Override public StreamFactory create(final SocketSettings socketSettings, final SslSettings sslSettings) { - return new NettyStreamFactory(socketSettings, sslSettings, eventLoopGroup, socketChannelClass, allocator, sslContext); + return new NettyStreamFactory(inetAddressResolver, socketSettings, sslSettings, eventLoopGroup, socketChannelClass, allocator, + sslContext); } @Override @@ -203,22 +212,13 @@ public boolean equals(final Object o) { } NettyStreamFactoryFactory that = (NettyStreamFactoryFactory) o; return Objects.equals(eventLoopGroup, that.eventLoopGroup) && Objects.equals(socketChannelClass, that.socketChannelClass) - && Objects.equals(allocator, that.allocator) && Objects.equals(sslContext, that.sslContext); + && Objects.equals(allocator, that.allocator) && Objects.equals(sslContext, that.sslContext) + && Objects.equals(inetAddressResolver, that.inetAddressResolver); } @Override public int hashCode() { - return Objects.hash(eventLoopGroup, socketChannelClass, allocator, sslContext); - } - - @Override - public String toString() { - return "NettyStreamFactoryFactory{" - + "eventLoopGroup=" + eventLoopGroup - + ", socketChannelClass=" + socketChannelClass - + ", allocator=" + allocator - + ", sslContext=" + sslContext - + '}'; + return Objects.hash(eventLoopGroup, socketChannelClass, allocator, sslContext, inetAddressResolver); } private NettyStreamFactoryFactory(final Builder builder) { @@ -226,5 +226,6 @@ private NettyStreamFactoryFactory(final Builder builder) { socketChannelClass = builder.socketChannelClass == null ? NioSocketChannel.class : builder.socketChannelClass; eventLoopGroup = builder.eventLoopGroup == null ? new NioEventLoopGroup() : builder.eventLoopGroup; sslContext = builder.sslContext; + inetAddressResolver = builder.inetAddressResolver; } } diff --git a/driver-core/src/test/functional/com/mongodb/ClusterFixture.java b/driver-core/src/test/functional/com/mongodb/ClusterFixture.java index 5583889b179..d653d39e01e 100644 --- a/driver-core/src/test/functional/com/mongodb/ClusterFixture.java +++ b/driver-core/src/test/functional/com/mongodb/ClusterFixture.java @@ -17,23 +17,18 @@ package com.mongodb; import com.mongodb.async.FutureResultCallback; -import com.mongodb.connection.NettyTransportSettings; -import com.mongodb.connection.TransportSettings; -import com.mongodb.internal.connection.AsynchronousSocketChannelStreamFactory; import com.mongodb.connection.ClusterConnectionMode; import com.mongodb.connection.ClusterDescription; import com.mongodb.connection.ClusterSettings; import com.mongodb.connection.ClusterType; import com.mongodb.connection.ConnectionPoolSettings; +import com.mongodb.connection.NettyTransportSettings; import com.mongodb.connection.ServerDescription; import com.mongodb.connection.ServerSettings; import com.mongodb.connection.ServerVersion; import com.mongodb.connection.SocketSettings; -import com.mongodb.internal.connection.SocketStreamFactory; import com.mongodb.connection.SslSettings; -import com.mongodb.internal.connection.StreamFactory; -import com.mongodb.internal.connection.StreamFactoryFactory; -import com.mongodb.internal.connection.TlsChannelStreamFactoryFactory; +import com.mongodb.connection.TransportSettings; import com.mongodb.internal.IgnorableRequestContext; import com.mongodb.internal.async.AsyncBatchCursor; import com.mongodb.internal.async.SingleResultCallback; @@ -50,10 +45,16 @@ import com.mongodb.internal.binding.SessionBinding; import com.mongodb.internal.binding.SingleConnectionBinding; import com.mongodb.internal.connection.AsyncConnection; +import com.mongodb.internal.connection.AsynchronousSocketChannelStreamFactory; import com.mongodb.internal.connection.Cluster; import com.mongodb.internal.connection.DefaultClusterFactory; +import com.mongodb.internal.connection.DefaultInetAddressResolver; import com.mongodb.internal.connection.InternalConnectionPoolSettings; import com.mongodb.internal.connection.MongoCredentialWithCache; +import com.mongodb.internal.connection.SocketStreamFactory; +import com.mongodb.internal.connection.StreamFactory; +import com.mongodb.internal.connection.StreamFactoryFactory; +import com.mongodb.internal.connection.TlsChannelStreamFactoryFactory; import com.mongodb.internal.connection.netty.NettyStreamFactoryFactory; import com.mongodb.internal.operation.AsyncReadOperation; import com.mongodb.internal.operation.AsyncWriteOperation; @@ -257,7 +258,7 @@ public static synchronized ConnectionString getConnectionString() { // Figure out what the connection string should be Cluster cluster = createCluster(new ConnectionString(DEFAULT_URI), - new SocketStreamFactory(SocketSettings.builder().build(), SslSettings.builder().build())); + new SocketStreamFactory(new DefaultInetAddressResolver(), SocketSettings.builder().build(), SslSettings.builder().build())); try { BsonDocument helloResult = new CommandReadOperation<>("admin", new BsonDocument(LEGACY_HELLO, new BsonInt32(1)), new BsonDocumentCodec()).execute(new ClusterBinding(cluster, @@ -367,7 +368,7 @@ public static AsyncReadWriteBinding getAsyncBinding(final Cluster cluster, final public static synchronized Cluster getCluster() { if (cluster == null) { - cluster = createCluster(new SocketStreamFactory(getSocketSettings(), getSslSettings())); + cluster = createCluster(new SocketStreamFactory(new DefaultInetAddressResolver(), getSocketSettings(), getSslSettings())); } return cluster; } @@ -397,7 +398,7 @@ private static Cluster createCluster(final MongoCredential credential, final Str ServerSettings.builder().build(), ConnectionPoolSettings.builder().maxSize(1).build(), InternalConnectionPoolSettings.builder().build(), streamFactory, streamFactory, credential, LoggerSettings.builder().build(), null, null, null, - Collections.emptyList(), getServerApi(), null, null); + Collections.emptyList(), getServerApi(), null); } private static Cluster createCluster(final ConnectionString connectionString, final StreamFactory streamFactory) { @@ -406,23 +407,24 @@ private static Cluster createCluster(final ConnectionString connectionString, fi ConnectionPoolSettings.builder().applyConnectionString(connectionString).build(), InternalConnectionPoolSettings.builder().build(), streamFactory, - new SocketStreamFactory(SocketSettings.builder().readTimeout(5, SECONDS).build(), getSslSettings(connectionString)), + new SocketStreamFactory(new DefaultInetAddressResolver(), SocketSettings.builder().readTimeout(5, SECONDS).build(), + getSslSettings(connectionString)), connectionString.getCredential(), LoggerSettings.builder().build(), null, null, null, - connectionString.getCompressorList(), getServerApi(), null, null); + connectionString.getCompressorList(), getServerApi(), null); } public static StreamFactory getStreamFactory() { - return new SocketStreamFactory(SocketSettings.builder().build(), getSslSettings()); + return new SocketStreamFactory(new DefaultInetAddressResolver(), SocketSettings.builder().build(), getSslSettings()); } public static StreamFactory getAsyncStreamFactory() { TransportSettings transportSettings = getOverriddenTransportSettings(); if (transportSettings == null) { // use NIO2 if (getSslSettings().isEnabled()) { - return new TlsChannelStreamFactoryFactory().create(getSocketSettings(), getSslSettings()); + return new TlsChannelStreamFactoryFactory(new DefaultInetAddressResolver()).create(getSocketSettings(), getSslSettings()); } else { - return new AsynchronousSocketChannelStreamFactory(getSocketSettings(), getSslSettings()); + return new AsynchronousSocketChannelStreamFactory(new DefaultInetAddressResolver(), getSocketSettings(), getSslSettings()); } } else { StreamFactoryFactory overriddenStreamFactoryFactory = NettyStreamFactoryFactory.builder() diff --git a/driver-core/src/test/functional/com/mongodb/connection/netty/NettyStreamSpecification.groovy b/driver-core/src/test/functional/com/mongodb/connection/netty/NettyStreamSpecification.groovy index 7ce5e9dd72f..74dad9221c0 100644 --- a/driver-core/src/test/functional/com/mongodb/connection/netty/NettyStreamSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/connection/netty/NettyStreamSpecification.groovy @@ -1,15 +1,19 @@ package com.mongodb.connection.netty -import com.mongodb.internal.connection.netty.NettyStreamFactory -import util.spock.annotations.Slow import com.mongodb.MongoSocketException import com.mongodb.MongoSocketOpenException import com.mongodb.ServerAddress import com.mongodb.connection.AsyncCompletionHandler import com.mongodb.connection.SocketSettings import com.mongodb.connection.SslSettings +import com.mongodb.internal.connection.netty.NettyStreamFactory +import com.mongodb.spi.dns.InetAddressResolver +import io.netty.buffer.PooledByteBufAllocator +import io.netty.channel.nio.NioEventLoopGroup +import io.netty.channel.socket.nio.NioSocketChannel import spock.lang.IgnoreIf import spock.lang.Specification +import util.spock.annotations.Slow import java.util.concurrent.CountDownLatch import java.util.concurrent.TimeUnit @@ -22,19 +26,20 @@ class NettyStreamSpecification extends Specification { @IgnoreIf({ getSslSettings().isEnabled() }) def 'should successfully connect with working ip address group'() { given: - def port = 27017 SocketSettings socketSettings = SocketSettings.builder().connectTimeout(1000, TimeUnit.MILLISECONDS).build() SslSettings sslSettings = SslSettings.builder().build() - def factory = new NettyStreamFactory(socketSettings, sslSettings) - - def inetAddresses = [new InetSocketAddress(InetAddress.getByName('192.168.255.255'), port), - new InetSocketAddress(InetAddress.getByName('1.2.3.4'), port), - new InetSocketAddress(InetAddress.getByName('127.0.0.1'), port)] - - def serverAddress = Stub(ServerAddress) - serverAddress.getSocketAddresses() >> inetAddresses + def inetAddressResolver = new InetAddressResolver() { + @Override + List lookupByName(String host) { + [InetAddress.getByName('192.168.255.255'), + InetAddress.getByName('1.2.3.4'), + InetAddress.getByName('127.0.0.1')] + } + } + def factory = new NettyStreamFactory(inetAddressResolver, socketSettings, sslSettings, new NioEventLoopGroup(), + NioSocketChannel, PooledByteBufAllocator.DEFAULT, null) - def stream = factory.create(serverAddress) + def stream = factory.create(new ServerAddress()) when: stream.open() @@ -47,19 +52,20 @@ class NettyStreamSpecification extends Specification { @IgnoreIf({ getSslSettings().isEnabled() }) def 'should throw exception with non-working ip address group'() { given: - def port = 27017 SocketSettings socketSettings = SocketSettings.builder().connectTimeout(1000, TimeUnit.MILLISECONDS).build() SslSettings sslSettings = SslSettings.builder().build() - def factory = new NettyStreamFactory(socketSettings, sslSettings) - - def inetAddresses = [new InetSocketAddress(InetAddress.getByName('192.168.255.255'), port), - new InetSocketAddress(InetAddress.getByName('1.2.3.4'), port), - new InetSocketAddress(InetAddress.getByName('1.2.3.5'), port)] - - def serverAddress = Stub(ServerAddress) - serverAddress.getSocketAddresses() >> inetAddresses + def inetAddressResolver = new InetAddressResolver() { + @Override + List lookupByName(String host) { + [InetAddress.getByName('192.168.255.255'), + InetAddress.getByName('1.2.3.4'), + InetAddress.getByName('1.2.3.5')] + } + } + def factory = new NettyStreamFactory(inetAddressResolver, socketSettings, sslSettings, new NioEventLoopGroup(), + NioSocketChannel, PooledByteBufAllocator.DEFAULT, null) - def stream = factory.create(serverAddress) + def stream = factory.create(new ServerAddress()) when: stream.open() @@ -75,8 +81,17 @@ class NettyStreamSpecification extends Specification { def exception = new MongoSocketException('Temporary failure in name resolution', serverAddress) serverAddress.getSocketAddresses() >> { throw exception } - def stream = new NettyStreamFactory(SocketSettings.builder().connectTimeout(1000, TimeUnit.MILLISECONDS).build(), - SslSettings.builder().build()).create(serverAddress) + SocketSettings socketSettings = SocketSettings.builder().connectTimeout(1000, TimeUnit.MILLISECONDS).build() + SslSettings sslSettings = SslSettings.builder().build() + def inetAddressResolver = new InetAddressResolver() { + @Override + List lookupByName(String host) { + throw exception + } + } + def stream = new NettyStreamFactory(inetAddressResolver, socketSettings, sslSettings, new NioEventLoopGroup(), + NioSocketChannel, PooledByteBufAllocator.DEFAULT, null) + .create(new ServerAddress()) def callback = new CallbackErrorHolder() when: diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/AsyncSocketChannelStreamSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/AsyncSocketChannelStreamSpecification.groovy index 2709aa09e16..b857c2574bd 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/AsyncSocketChannelStreamSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/AsyncSocketChannelStreamSpecification.groovy @@ -6,6 +6,7 @@ import com.mongodb.ServerAddress import com.mongodb.connection.AsyncCompletionHandler import com.mongodb.connection.SocketSettings import com.mongodb.connection.SslSettings +import com.mongodb.spi.dns.InetAddressResolver import spock.lang.IgnoreIf import spock.lang.Specification import util.spock.annotations.Slow @@ -21,18 +22,21 @@ class AsyncSocketChannelStreamSpecification extends Specification { @IgnoreIf({ getSslSettings().isEnabled() }) def 'should successfully connect with working ip address list'() { given: - def port = 27017 def socketSettings = SocketSettings.builder().connectTimeout(100, MILLISECONDS).build() def sslSettings = SslSettings.builder().build() - def factoryFactory = new AsynchronousSocketChannelStreamFactoryFactory() - def factory = factoryFactory.create(socketSettings, sslSettings) - def inetAddresses = [new InetSocketAddress(InetAddress.getByName('192.168.255.255'), port), - new InetSocketAddress(InetAddress.getByName('127.0.0.1'), port)] - def serverAddress = Stub(ServerAddress) - serverAddress.getSocketAddresses() >> inetAddresses + def inetAddressResolver = new InetAddressResolver() { + @Override + List lookupByName(String host) { + [InetAddress.getByName('192.168.255.255'), + InetAddress.getByName('127.0.0.1')] + } + } - def stream = factory.create(serverAddress) + def factoryFactory = new AsynchronousSocketChannelStreamFactoryFactory(inetAddressResolver) + def factory = factoryFactory.create(socketSettings, sslSettings) + + def stream = factory.create(new ServerAddress('host1')) when: stream.open() @@ -45,20 +49,20 @@ class AsyncSocketChannelStreamSpecification extends Specification { @IgnoreIf({ getSslSettings().isEnabled() }) def 'should fail to connect with non-working ip address list'() { given: - def port = 27017 def socketSettings = SocketSettings.builder().connectTimeout(100, MILLISECONDS).build() def sslSettings = SslSettings.builder().build() - def factoryFactory = new AsynchronousSocketChannelStreamFactoryFactory() - - def factory = factoryFactory.create(socketSettings, sslSettings) - - def inetAddresses = [new InetSocketAddress(InetAddress.getByName('192.168.255.255'), port), - new InetSocketAddress(InetAddress.getByName('1.2.3.4'), port)] - def serverAddress = Stub(ServerAddress) - serverAddress.getSocketAddresses() >> inetAddresses + def inetAddressResolver = new InetAddressResolver() { + @Override + List lookupByName(String host) { + [InetAddress.getByName('192.168.255.255'), + InetAddress.getByName('1.2.3.4')] + } + } - def stream = factory.create(serverAddress) + def factoryFactory = new AsynchronousSocketChannelStreamFactoryFactory(inetAddressResolver) + def factory = factoryFactory.create(socketSettings, sslSettings) + def stream = factory.create(new ServerAddress()) when: stream.open() @@ -70,11 +74,16 @@ class AsyncSocketChannelStreamSpecification extends Specification { @IgnoreIf({ getSslSettings().isEnabled() }) def 'should fail AsyncCompletionHandler if name resolution fails'() { given: - def serverAddress = Stub(ServerAddress) + def serverAddress = new ServerAddress() def exception = new MongoSocketException('Temporary failure in name resolution', serverAddress) - serverAddress.getSocketAddresses() >> { throw exception } - def stream = new AsynchronousSocketChannelStream(serverAddress, + def inetAddressResolver = new InetAddressResolver() { + @Override + List lookupByName(String host) { + throw exception + } + } + def stream = new AsynchronousSocketChannelStream(serverAddress, inetAddressResolver, SocketSettings.builder().connectTimeout(100, MILLISECONDS).build(), new PowerOfTwoBufferPool()) def callback = new CallbackErrorHolder() diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/AsyncStreamTimeoutsSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/AsyncStreamTimeoutsSpecification.groovy index aa8156dd88c..858b5ce6c84 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/AsyncStreamTimeoutsSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/AsyncStreamTimeoutsSpecification.groovy @@ -51,8 +51,8 @@ class AsyncStreamTimeoutsSpecification extends OperationFunctionalSpecification def 'should throw a MongoSocketOpenException when the AsynchronousSocket Stream fails to open'() { given: def connection = new InternalStreamConnectionFactory(ClusterConnectionMode.SINGLE, - new AsynchronousSocketChannelStreamFactory(openSocketSettings, getSslSettings()), getCredentialWithCache(), null, null, - [], LoggerSettings.builder().build(), null, getServerApi(), null) + new AsynchronousSocketChannelStreamFactory(new DefaultInetAddressResolver(), openSocketSettings, getSslSettings()), + getCredentialWithCache(), null, null, [], LoggerSettings.builder().build(), null, getServerApi()) .create(new ServerId(new ClusterId(), new ServerAddress(new InetSocketAddress('192.168.255.255', 27017)))) when: @@ -66,8 +66,9 @@ class AsyncStreamTimeoutsSpecification extends OperationFunctionalSpecification def 'should throw a MongoSocketReadTimeoutException with the AsynchronousSocket stream'() { given: def connection = new InternalStreamConnectionFactory(ClusterConnectionMode.SINGLE, - new AsynchronousSocketChannelStreamFactory(readSocketSettings, getSslSettings()), getCredentialWithCache(), null, null, - [], LoggerSettings.builder().build(), null, getServerApi(), null).create(new ServerId(new ClusterId(), getPrimary())) + new AsynchronousSocketChannelStreamFactory(new DefaultInetAddressResolver(), readSocketSettings, getSslSettings()), + getCredentialWithCache(), null, null, + [], LoggerSettings.builder().build(), null, getServerApi()).create(new ServerId(new ClusterId(), getPrimary())) connection.open() getCollectionHelper().insertDocuments(new BsonDocument('_id', new BsonInt32(1))) @@ -88,7 +89,7 @@ class AsyncStreamTimeoutsSpecification extends OperationFunctionalSpecification given: def connection = new InternalStreamConnectionFactory(ClusterConnectionMode.SINGLE, new NettyStreamFactory(openSocketSettings, getSslSettings()), getCredentialWithCache(), null, null, - [], LoggerSettings.builder().build(), null, getServerApi(), null).create(new ServerId(new ClusterId(), + [], LoggerSettings.builder().build(), null, getServerApi()).create(new ServerId(new ClusterId(), new ServerAddress(new InetSocketAddress('192.168.255.255', 27017)))) when: @@ -103,7 +104,7 @@ class AsyncStreamTimeoutsSpecification extends OperationFunctionalSpecification given: def connection = new InternalStreamConnectionFactory(ClusterConnectionMode.SINGLE, new NettyStreamFactory(readSocketSettings, getSslSettings()), getCredentialWithCache(), null, null, - [], LoggerSettings.builder().build(), null, getServerApi(), null).create(new ServerId(new ClusterId(), getPrimary())) + [], LoggerSettings.builder().build(), null, getServerApi()).create(new ServerId(new ClusterId(), getPrimary())) connection.open() getCollectionHelper().insertDocuments(new BsonDocument('_id', new BsonInt32(1))) diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/AwsAuthenticationSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/AwsAuthenticationSpecification.groovy index e8cb470c604..21979eb87ce 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/AwsAuthenticationSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/AwsAuthenticationSpecification.groovy @@ -145,10 +145,11 @@ class AwsAuthenticationSpecification extends Specification { new InternalStreamConnection(SINGLE, new ServerId(new ClusterId(), new ServerAddress(getConnectionString().getHosts().get(0))), new TestConnectionGenerationSupplier(), - async ? new AsynchronousSocketChannelStreamFactory(SocketSettings.builder().build(), getSslSettings()) - : new SocketStreamFactory(SocketSettings.builder().build(), getSslSettings()), [], null, - new InternalStreamConnectionInitializer(SINGLE, createAuthenticator(credential), null, [], null), - null) + async ? new AsynchronousSocketChannelStreamFactory(new DefaultInetAddressResolver(), SocketSettings.builder().build(), + getSslSettings()) : new SocketStreamFactory(new DefaultInetAddressResolver(), SocketSettings.builder().build(), + getSslSettings()), [], null, new InternalStreamConnectionInitializer(SINGLE, createAuthenticator(credential), + null, [], null) + ) } private static Authenticator createAuthenticator(final MongoCredential credential) { diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/CommandHelperSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/CommandHelperSpecification.groovy index f8a662da88d..76eba8a0dac 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/CommandHelperSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/CommandHelperSpecification.groovy @@ -49,7 +49,7 @@ class CommandHelperSpecification extends Specification { def setup() { connection = new InternalStreamConnectionFactory(ClusterConnectionMode.SINGLE, new NettyStreamFactory(SocketSettings.builder().build(), getSslSettings()), - getCredentialWithCache(), null, null, [], LoggerSettings.builder().build(), null, getServerApi(), null) + getCredentialWithCache(), null, null, [], LoggerSettings.builder().build(), null, getServerApi()) .create(new ServerId(new ClusterId(), getPrimary())) connection.open() } diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/GSSAPIAuthenticationSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/GSSAPIAuthenticationSpecification.groovy index ae8698aae88..6a78ce97f7c 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/GSSAPIAuthenticationSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/GSSAPIAuthenticationSpecification.groovy @@ -206,9 +206,9 @@ class GSSAPIAuthenticationSpecification extends Specification { new InternalStreamConnection(SINGLE, new ServerId(new ClusterId(), new ServerAddress(getConnectionString().getHosts().get(0))), new TestConnectionGenerationSupplier(), async ? new NettyStreamFactory(SocketSettings.builder().build(), getSslSettings()) - : new SocketStreamFactory(SocketSettings.builder().build(), getSslSettings()), [], null, - new InternalStreamConnectionInitializer(SINGLE, createAuthenticator(credential), null, [], null), - null) + : new SocketStreamFactory(new DefaultInetAddressResolver(), SocketSettings.builder().build(), getSslSettings()), + [], null, new InternalStreamConnectionInitializer(SINGLE, createAuthenticator(credential), null, [], null) + ) } private static Authenticator createAuthenticator(final MongoCredential credential) { diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/GSSAPIAuthenticatorSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/GSSAPIAuthenticatorSpecification.groovy index a0eb5ff12b9..02f6652ded0 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/GSSAPIAuthenticatorSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/GSSAPIAuthenticatorSpecification.groovy @@ -47,9 +47,9 @@ class GSSAPIAuthenticatorSpecification extends Specification { def subjectProvider = Mock(SubjectProvider) def credential = ClusterFixture.getCredential().withMechanismProperty(JAVA_SUBJECT_PROVIDER_KEY, subjectProvider) def credentialWithCache = new MongoCredentialWithCache(credential) - def streamFactory = new SocketStreamFactory(SocketSettings.builder().build(), getSslSettings()) + def streamFactory = new SocketStreamFactory(settings.getInetAddressResolver(), SocketSettings.builder().build(), getSslSettings()) def internalConnection = new InternalStreamConnectionFactory(SINGLE, streamFactory, credentialWithCache, null, - null, Collections. emptyList(), LoggerSettings.builder().build(), null, getServerApi(), null) + null, Collections. emptyList(), LoggerSettings.builder().build(), null, getServerApi()) .create(new ServerId(new ClusterId(), getPrimary())) when: diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/PlainAuthenticationSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/PlainAuthenticationSpecification.groovy index a0e2571897f..e57627ce325 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/PlainAuthenticationSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/PlainAuthenticationSpecification.groovy @@ -110,9 +110,9 @@ class PlainAuthenticationSpecification extends Specification { new ServerId(new ClusterId(), new ServerAddress(getConnectionString().getHosts().get(0))), new TestConnectionGenerationSupplier(), async ? new NettyStreamFactory(SocketSettings.builder().build(), getSslSettings()) - : new SocketStreamFactory(SocketSettings.builder().build(), getSslSettings()), [], null, - new InternalStreamConnectionInitializer(SINGLE, createAuthenticator(credential), null, [], null), - null) + : new SocketStreamFactory(new DefaultInetAddressResolver(), SocketSettings.builder().build(), getSslSettings()), + [], null, new InternalStreamConnectionInitializer(SINGLE, createAuthenticator(credential), null, [], null) + ) } private static Authenticator createAuthenticator(final MongoCredential credential) { diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/PlainAuthenticatorTest.java b/driver-core/src/test/functional/com/mongodb/internal/connection/PlainAuthenticatorTest.java index cd47dfb5182..e2377c8efef 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/PlainAuthenticatorTest.java +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/PlainAuthenticatorTest.java @@ -43,7 +43,7 @@ public class PlainAuthenticatorTest { private String userName; private String source; private String password; - private final StreamFactory streamFactory = new SocketStreamFactory(SocketSettings.builder().build(), getSslSettings()); + private final StreamFactory streamFactory = new SocketStreamFactory(new DefaultInetAddressResolver(), SocketSettings.builder().build(), getSslSettings()); @Before public void setUp() { @@ -52,8 +52,8 @@ public void setUp() { source = System.getProperty("org.mongod.test.source"); password = System.getProperty("org.mongodb.test.password"); internalConnection = new InternalStreamConnectionFactory(ClusterConnectionMode.SINGLE, streamFactory, null, null, - null, Collections.emptyList(), LoggerSettings.builder().build(), null, getServerApi(), - null).create(new ServerId(new ClusterId(), + null, Collections.emptyList(), LoggerSettings.builder().build(), null, getServerApi() + ).create(new ServerId(new ClusterId(), new ServerAddress(host))); connectionDescription = new ConnectionDescription(new ServerId(new ClusterId(), new ServerAddress())); } diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/ServerMonitorSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/ServerMonitorSpecification.groovy index b8ea72dc246..e88de876273 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/ServerMonitorSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/ServerMonitorSpecification.groovy @@ -221,12 +221,11 @@ class ServerMonitorSpecification extends OperationFunctionalSpecification { } serverMonitor = new DefaultServerMonitor(new ServerId(new ClusterId(), address), ServerSettings.builder().build(), new ClusterClock(), - new InternalStreamConnectionFactory(SINGLE, new SocketStreamFactory(SocketSettings.builder() - .connectTimeout(500, TimeUnit.MILLISECONDS) - .build(), - getSslSettings()), getCredentialWithCache(), null, null, [], LoggerSettings.builder().build(), null, - getServerApi(), null), - getClusterConnectionMode(), getServerApi(), SameObjectProvider.initialized(sdam)) + new InternalStreamConnectionFactory(SINGLE, new SocketStreamFactory(new DefaultInetAddressResolver(), + SocketSettings.builder().connectTimeout(500, TimeUnit.MILLISECONDS).build(), getSslSettings()), + getCredentialWithCache(), null, null, [], LoggerSettings.builder().build(), null, + getServerApi()), + getClusterConnectionMode(), getServerApi(), SameObjectProvider.initialized(sdam)) serverMonitor.start() serverMonitor } diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/SingleServerClusterTest.java b/driver-core/src/test/functional/com/mongodb/internal/connection/SingleServerClusterTest.java index e25c433e3ec..55ba6875a16 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/SingleServerClusterTest.java +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/SingleServerClusterTest.java @@ -50,13 +50,12 @@ import static org.junit.Assert.assertNotNull; import static org.junit.Assert.assertTrue; -@SuppressWarnings("deprecation") public class SingleServerClusterTest { private SingleServerCluster cluster; private void setUpCluster(final ServerAddress serverAddress) { - SocketStreamFactory streamFactory = new SocketStreamFactory(SocketSettings.builder().build(), + SocketStreamFactory streamFactory = new SocketStreamFactory(new DefaultInetAddressResolver(), SocketSettings.builder().build(), getSslSettings()); ClusterId clusterId = new ClusterId(); ClusterSettings clusterSettings = ClusterSettings.builder() @@ -70,7 +69,7 @@ private void setUpCluster(final ServerAddress serverAddress) { streamFactory, streamFactory, getCredential(), LoggerSettings.builder().build(), null, null, null, - Collections.emptyList(), getServerApi(), null)); + Collections.emptyList(), getServerApi())); } @After diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/SocketStreamHelperSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/SocketStreamHelperSpecification.groovy index 5a2492da109..21e9d20b984 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/SocketStreamHelperSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/SocketStreamHelperSpecification.groovy @@ -31,6 +31,7 @@ import javax.net.ssl.SSLSocketFactory import java.lang.reflect.Method import static com.mongodb.ClusterFixture.getPrimary +import static com.mongodb.internal.connection.ServerAddressHelper.getSocketAddresses import static java.util.concurrent.TimeUnit.MILLISECONDS import static java.util.concurrent.TimeUnit.SECONDS @@ -44,7 +45,8 @@ class SocketStreamHelperSpecification extends Specification { .build() when: - SocketStreamHelper.initialize(socket, getPrimary().getSocketAddress(), socketSettings, SslSettings.builder().build()) + SocketStreamHelper.initialize(socket, getSocketAddresses(getPrimary(), new DefaultInetAddressResolver()).get(0), + socketSettings, SslSettings.builder().build()) then: socket.getTcpNoDelay() @@ -68,7 +70,7 @@ class SocketStreamHelperSpecification extends Specification { Socket socket = SocketFactory.default.createSocket() when: - SocketStreamHelper.initialize(socket, getPrimary().getSocketAddress(), + SocketStreamHelper.initialize(socket, getSocketAddresses(getPrimary(), new DefaultInetAddressResolver()).get(0), SocketSettings.builder().build(), SslSettings.builder().build()) then: @@ -84,7 +86,8 @@ class SocketStreamHelperSpecification extends Specification { SSLSocket socket = SSLSocketFactory.default.createSocket() when: - SocketStreamHelper.initialize(socket, getPrimary().getSocketAddress(), SocketSettings.builder().build(), sslSettings) + SocketStreamHelper.initialize(socket, getSocketAddresses(getPrimary(), new DefaultInetAddressResolver()).get(0), SocketSettings. + builder().build(), sslSettings) then: socket.getSSLParameters().endpointIdentificationAlgorithm == (sslSettings.invalidHostNameAllowed ? null : 'HTTPS') @@ -104,7 +107,8 @@ class SocketStreamHelperSpecification extends Specification { SSLSocket socket = SSLSocketFactory.default.createSocket() when: - SocketStreamHelper.initialize(socket, getPrimary().getSocketAddress(), SocketSettings.builder().build(), sslSettings) + SocketStreamHelper.initialize(socket, getSocketAddresses(getPrimary(), new DefaultInetAddressResolver()).get(0), + SocketSettings.builder().build(), sslSettings) then: socket.getSSLParameters().getServerNames() == [new SNIHostName(getPrimary().getHost())] @@ -122,8 +126,8 @@ class SocketStreamHelperSpecification extends Specification { Socket socket = SocketFactory.default.createSocket() when: - SocketStreamHelper.initialize(socket, getPrimary().getSocketAddress(), SocketSettings.builder().build(), - SslSettings.builder().enabled(true).build()) + SocketStreamHelper.initialize(socket, getSocketAddresses(getPrimary(), new DefaultInetAddressResolver()).get(0), + SocketSettings.builder().build(), SslSettings.builder().enabled(true).build()) then: thrown(MongoInternalException) diff --git a/driver-core/src/test/functional/com/mongodb/internal/connection/StreamSocketAddressSpecification.groovy b/driver-core/src/test/functional/com/mongodb/internal/connection/StreamSocketAddressSpecification.groovy index 961b72ca0c8..7fcf694723c 100644 --- a/driver-core/src/test/functional/com/mongodb/internal/connection/StreamSocketAddressSpecification.groovy +++ b/driver-core/src/test/functional/com/mongodb/internal/connection/StreamSocketAddressSpecification.groovy @@ -1,5 +1,6 @@ package com.mongodb.internal.connection +import com.mongodb.spi.dns.InetAddressResolver import util.spock.annotations.Slow import com.mongodb.MongoSocketOpenException import com.mongodb.ServerAddress @@ -39,7 +40,7 @@ class StreamSocketAddressSpecification extends Specification { def socket2 = SocketFactory.default.createSocket() socketFactory.createSocket() >>> [socket0, socket1, socket2] - def socketStream = new SocketStream(serverAddress, socketSettings, sslSettings, socketFactory, bufferProvider) + def socketStream = new SocketStream(serverAddress, null, socketSettings, sslSettings, socketFactory, bufferProvider) when: socketStream.open() @@ -57,18 +58,11 @@ class StreamSocketAddressSpecification extends Specification { @IgnoreIf({ getSslSettings().isEnabled() }) def 'should throw exception when attempting to connect with incorrect ip address group'() { given: - def port = 27017 def socketSettings = SocketSettings.builder().connectTimeout(100, TimeUnit.MILLISECONDS).build() def sslSettings = SslSettings.builder().build() def bufferProvider = Stub(BufferProvider) - def inetAddresses = new InetSocketAddress[3] - - inetAddresses[0] = new InetSocketAddress(InetAddress.getByName('1.2.3.4'), port) - inetAddresses[1] = new InetSocketAddress(InetAddress.getByName('2.3.4.5'), port) - inetAddresses[2] = new InetSocketAddress(InetAddress.getByName('1.2.3.5'), port) - def serverAddress = Stub(ServerAddress) - serverAddress.getSocketAddresses() >> inetAddresses + def serverAddress = new ServerAddress() def socketFactory = Stub(SocketFactory) def socket0 = SocketFactory.default.createSocket() @@ -76,7 +70,16 @@ class StreamSocketAddressSpecification extends Specification { def socket2 = SocketFactory.default.createSocket() socketFactory.createSocket() >>> [socket0, socket1, socket2] - def socketStream = new SocketStream(serverAddress, socketSettings, sslSettings, socketFactory, bufferProvider) + def inetAddressResolver = new InetAddressResolver() { + @Override + List lookupByName(String host) { + [InetAddress.getByName('1.2.3.4'), + InetAddress.getByName('2.3.4.5'), + InetAddress.getByName('1.2.3.5')] + } + } + + def socketStream = new SocketStream(serverAddress, inetAddressResolver, socketSettings, sslSettings, socketFactory, bufferProvider) when: socketStream.open() diff --git a/driver-core/src/test/unit/com/mongodb/UnixServerAddressSpecification.groovy b/driver-core/src/test/unit/com/mongodb/UnixServerAddressSpecification.groovy index 24b473cc40d..b8e18198eb2 100644 --- a/driver-core/src/test/unit/com/mongodb/UnixServerAddressSpecification.groovy +++ b/driver-core/src/test/unit/com/mongodb/UnixServerAddressSpecification.groovy @@ -31,17 +31,9 @@ class UnixServerAddressSpecification extends Specification { def 'should throw if the path does not end with .sock'() { when: - new UnixServerAddress('localhost').getSocketAddress() + new UnixServerAddress('localhost') then: thrown(IllegalArgumentException) } - - def 'should throw when trying to get a InetSocketAddress'() { - when: - new UnixServerAddress('/tmp/mongodb.sock').getSocketAddress() - - then: - thrown(UnsupportedOperationException) - } } diff --git a/driver-core/src/test/unit/com/mongodb/internal/connection/AbstractConnectionPoolTest.java b/driver-core/src/test/unit/com/mongodb/internal/connection/AbstractConnectionPoolTest.java index 0e832457b82..81b92e5cf9a 100644 --- a/driver-core/src/test/unit/com/mongodb/internal/connection/AbstractConnectionPoolTest.java +++ b/driver-core/src/test/unit/com/mongodb/internal/connection/AbstractConnectionPoolTest.java @@ -185,8 +185,8 @@ public void setUp() { Collections.emptyList(), LoggerSettings.builder().build(), new TestCommandListener(), - ClusterFixture.getServerApi(), - null), + ClusterFixture.getServerApi() + ), settings, internalSettings, sdamProvider)); sdamProvider.initialize(new DefaultSdamServerDescriptionManager(mockedCluster(), serverId, mock(ServerListener.class), mock(ServerMonitor.class), pool, connectionMode)); diff --git a/driver-core/src/test/unit/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactorySpecification.groovy b/driver-core/src/test/unit/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactorySpecification.groovy index 6c8e117b4cf..245c6c87a5a 100644 --- a/driver-core/src/test/unit/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactorySpecification.groovy +++ b/driver-core/src/test/unit/com/mongodb/internal/connection/AsynchronousSocketChannelStreamFactoryFactorySpecification.groovy @@ -27,7 +27,8 @@ class AsynchronousSocketChannelStreamFactoryFactorySpecification extends Specifi @Unroll def 'should create the expected #description AsynchronousSocketChannelStream'() { given: - def factory = new AsynchronousSocketChannelStreamFactoryFactory().create(socketSettings, sslSettings) + def factory = new AsynchronousSocketChannelStreamFactoryFactory(new DefaultInetAddressResolver()) + .create(socketSettings, sslSettings) when: AsynchronousSocketChannelStream stream = factory.create(serverAddress) as AsynchronousSocketChannelStream diff --git a/driver-core/src/test/unit/com/mongodb/internal/connection/ConnectionPoolAsyncTest.java b/driver-core/src/test/unit/com/mongodb/internal/connection/ConnectionPoolAsyncTest.java index 60d443fbc7e..b8574081f5c 100644 --- a/driver-core/src/test/unit/com/mongodb/internal/connection/ConnectionPoolAsyncTest.java +++ b/driver-core/src/test/unit/com/mongodb/internal/connection/ConnectionPoolAsyncTest.java @@ -80,9 +80,9 @@ protected Callable createCallable(final BsonDocument operation) { @Override protected StreamFactory createStreamFactory(final SocketSettings socketSettings, final SslSettings sslSettings) { if (sslSettings.isEnabled()) { - return new TlsChannelStreamFactoryFactory().create(socketSettings, sslSettings); + return new TlsChannelStreamFactoryFactory(new DefaultInetAddressResolver()).create(socketSettings, sslSettings); } else { - return new AsynchronousSocketChannelStreamFactory(socketSettings, sslSettings); + return new AsynchronousSocketChannelStreamFactory(new DefaultInetAddressResolver(), socketSettings, sslSettings); } } diff --git a/driver-core/src/test/unit/com/mongodb/internal/connection/ConnectionPoolTest.java b/driver-core/src/test/unit/com/mongodb/internal/connection/ConnectionPoolTest.java index aecd88a50a9..b5b449c755d 100644 --- a/driver-core/src/test/unit/com/mongodb/internal/connection/ConnectionPoolTest.java +++ b/driver-core/src/test/unit/com/mongodb/internal/connection/ConnectionPoolTest.java @@ -70,6 +70,6 @@ protected Callable createCallable(final BsonDocument operation) { @Override protected StreamFactory createStreamFactory(final SocketSettings socketSettings, final SslSettings sslSettings) { - return new SocketStreamFactory(socketSettings, sslSettings); + return new SocketStreamFactory(new DefaultInetAddressResolver(), socketSettings, sslSettings); } } diff --git a/driver-core/src/test/unit/com/mongodb/internal/connection/InternalStreamConnectionSpecification.groovy b/driver-core/src/test/unit/com/mongodb/internal/connection/InternalStreamConnectionSpecification.groovy index 22a1aac3766..0eb7be11988 100644 --- a/driver-core/src/test/unit/com/mongodb/internal/connection/InternalStreamConnectionSpecification.groovy +++ b/driver-core/src/test/unit/com/mongodb/internal/connection/InternalStreamConnectionSpecification.groovy @@ -107,7 +107,7 @@ class InternalStreamConnectionSpecification extends Specification { def getConnection() { new InternalStreamConnection(SINGLE, SERVER_ID, new TestConnectionGenerationSupplier(), streamFactory, [], commandListener, - initializer, null) + initializer) } def getOpenedConnection() { @@ -172,7 +172,7 @@ class InternalStreamConnectionSpecification extends Specification { startHandshake(_) >> { throw new MongoInternalException('Something went wrong') } } def connection = new InternalStreamConnection(SINGLE, SERVER_ID, new TestConnectionGenerationSupplier(), streamFactory, [], null, - failedInitializer, null) + failedInitializer) when: connection.open() @@ -189,7 +189,7 @@ class InternalStreamConnectionSpecification extends Specification { startHandshakeAsync(_, _) >> { it[1].onResult(null, new MongoInternalException('Something went wrong')) } } def connection = new InternalStreamConnection(SINGLE, SERVER_ID, new TestConnectionGenerationSupplier(), streamFactory, [], null, - failedInitializer, null) + failedInitializer) when: def futureResultCallback = new FutureResultCallback() diff --git a/driver-core/src/test/unit/com/mongodb/internal/connection/StreamFactoryHelperTest.java b/driver-core/src/test/unit/com/mongodb/internal/connection/StreamFactoryHelperTest.java index 24cf24f2890..90989a8e133 100644 --- a/driver-core/src/test/unit/com/mongodb/internal/connection/StreamFactoryHelperTest.java +++ b/driver-core/src/test/unit/com/mongodb/internal/connection/StreamFactoryHelperTest.java @@ -19,6 +19,7 @@ import com.mongodb.connection.NettyTransportSettings; import com.mongodb.connection.TransportSettings; import com.mongodb.internal.connection.netty.NettyStreamFactoryFactory; +import com.mongodb.spi.dns.InetAddressResolver; import io.netty.buffer.PooledByteBufAllocator; import io.netty.channel.nio.NioEventLoopGroup; import org.junit.jupiter.api.Test; @@ -30,12 +31,14 @@ class StreamFactoryHelperTest { @Test void streamFactoryFactoryIsDerivedFromTransportSettings() { + InetAddressResolver inetAddressResolver = new DefaultInetAddressResolver(); NettyTransportSettings nettyTransportSettings = TransportSettings.nettyBuilder() .eventLoopGroup(new NioEventLoopGroup()) .allocator(PooledByteBufAllocator.DEFAULT) .socketChannelClass(io.netty.channel.socket.oio.OioSocketChannel.class) .build(); - assertEquals(NettyStreamFactoryFactory.builder().applySettings(nettyTransportSettings).build(), - StreamFactoryHelper.getStreamFactoryFactoryFromSettings(nettyTransportSettings)); + assertEquals(NettyStreamFactoryFactory.builder().applySettings(nettyTransportSettings) + .inetAddressResolver(inetAddressResolver).build(), + StreamFactoryHelper.getStreamFactoryFactoryFromSettings(nettyTransportSettings, inetAddressResolver)); } } diff --git a/driver-core/src/test/unit/com/mongodb/internal/connection/netty/NettyStreamFactoryFactorySpecification.groovy b/driver-core/src/test/unit/com/mongodb/internal/connection/netty/NettyStreamFactoryFactorySpecification.groovy index 59dd78f40e2..a92e4f26ee6 100644 --- a/driver-core/src/test/unit/com/mongodb/internal/connection/netty/NettyStreamFactoryFactorySpecification.groovy +++ b/driver-core/src/test/unit/com/mongodb/internal/connection/netty/NettyStreamFactoryFactorySpecification.groovy @@ -20,6 +20,7 @@ import com.mongodb.ServerAddress import com.mongodb.connection.SocketSettings import com.mongodb.connection.SslSettings import com.mongodb.connection.TransportSettings +import com.mongodb.internal.connection.DefaultInetAddressResolver import io.netty.buffer.ByteBufAllocator import io.netty.buffer.UnpooledByteBufAllocator import io.netty.channel.nio.NioEventLoopGroup @@ -43,6 +44,7 @@ class NettyStreamFactoryFactorySpecification extends Specification { when: def factoryFactory = NettyStreamFactoryFactory.builder() + .inetAddressResolver(new DefaultInetAddressResolver()) .applySettings(nettySettings) .build() @@ -78,10 +80,13 @@ class NettyStreamFactoryFactorySpecification extends Specification { SocketSettings socketSettings = SocketSettings.builder().build() SslSettings sslSettings = SslSettings.builder().build() ServerAddress serverAddress = new ServerAddress() - static final DEFAULT_FACTORY = NettyStreamFactoryFactory.builder().build() + static final DEFAULT_FACTORY = NettyStreamFactoryFactory.builder() + .inetAddressResolver(new DefaultInetAddressResolver()) + .build() static final CUSTOM_FACTORY = NettyStreamFactoryFactory.builder() .allocator(UnpooledByteBufAllocator.DEFAULT) .socketChannelClass(OioSocketChannel) .eventLoopGroup(new OioEventLoopGroup()) + .inetAddressResolver(new DefaultInetAddressResolver()) .build() } diff --git a/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/MongoClients.java b/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/MongoClients.java index f22d3ab7c91..d4ad39bdec9 100644 --- a/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/MongoClients.java +++ b/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/MongoClients.java @@ -30,9 +30,11 @@ import com.mongodb.internal.connection.TlsChannelStreamFactoryFactory; import com.mongodb.lang.Nullable; import com.mongodb.reactivestreams.client.internal.MongoClientImpl; +import com.mongodb.spi.dns.InetAddressResolver; import org.bson.codecs.configuration.CodecRegistry; import static com.mongodb.assertions.Assertions.notNull; +import static com.mongodb.internal.connection.ServerAddressHelper.getInetAddressResolver; import static com.mongodb.internal.connection.StreamFactoryHelper.getStreamFactoryFactoryFromSettings; import static com.mongodb.internal.event.EventListenerHelper.getCommandListener; @@ -113,14 +115,15 @@ public static MongoClient create(final MongoClientSettings settings, @Nullable f throw new MongoClientException("Proxy is not supported for reactive clients"); } + InetAddressResolver inetAddressResolver = getInetAddressResolver(settings); StreamFactoryFactory streamFactoryFactory; TransportSettings transportSettings = settings.getTransportSettings(); if (transportSettings != null) { - streamFactoryFactory = getStreamFactoryFactoryFromSettings(transportSettings); + streamFactoryFactory = getStreamFactoryFactoryFromSettings(transportSettings, inetAddressResolver); } else if (settings.getSslSettings().isEnabled()) { - streamFactoryFactory = new TlsChannelStreamFactoryFactory(); + streamFactoryFactory = new TlsChannelStreamFactoryFactory(inetAddressResolver); } else { - streamFactoryFactory = new AsynchronousSocketChannelStreamFactoryFactory(); + streamFactoryFactory = new AsynchronousSocketChannelStreamFactoryFactory(inetAddressResolver); } StreamFactory streamFactory = getStreamFactory(streamFactoryFactory, settings, false); StreamFactory heartbeatStreamFactory = getStreamFactory(streamFactoryFactory, settings, true); @@ -150,7 +153,7 @@ private static Cluster createCluster(final MongoClientSettings settings, InternalConnectionPoolSettings.builder().prestartAsyncWorkManager(true).build(), streamFactory, heartbeatStreamFactory, settings.getCredential(), settings.getLoggerSettings(), getCommandListener(settings.getCommandListeners()), settings.getApplicationName(), mongoDriverInformation, - settings.getCompressorList(), settings.getServerApi(), settings.getDnsClient(), settings.getInetAddressResolver()); + settings.getCompressorList(), settings.getServerApi(), settings.getDnsClient()); } private static MongoDriverInformation wrapMongoDriverInformation(@Nullable final MongoDriverInformation mongoDriverInformation) { diff --git a/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/crypt/KeyManagementService.java b/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/crypt/KeyManagementService.java index c392b2a3f45..887129b24e1 100644 --- a/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/crypt/KeyManagementService.java +++ b/driver-reactive-streams/src/main/com/mongodb/reactivestreams/client/internal/crypt/KeyManagementService.java @@ -21,11 +21,12 @@ import com.mongodb.connection.AsyncCompletionHandler; import com.mongodb.connection.SocketSettings; import com.mongodb.connection.SslSettings; +import com.mongodb.crypt.capi.MongoKeyDecryptor; +import com.mongodb.internal.connection.AsynchronousChannelStream; +import com.mongodb.internal.connection.DefaultInetAddressResolver; import com.mongodb.internal.connection.Stream; import com.mongodb.internal.connection.StreamFactory; import com.mongodb.internal.connection.TlsChannelStreamFactoryFactory; -import com.mongodb.crypt.capi.MongoKeyDecryptor; -import com.mongodb.internal.connection.AsynchronousChannelStream; import com.mongodb.internal.diagnostics.logging.Logger; import com.mongodb.internal.diagnostics.logging.Loggers; import com.mongodb.lang.Nullable; @@ -51,7 +52,7 @@ class KeyManagementService implements Closeable { KeyManagementService(final Map kmsProviderSslContextMap, final int timeoutMillis) { this.kmsProviderSslContextMap = kmsProviderSslContextMap; - this.tlsChannelStreamFactoryFactory = new TlsChannelStreamFactoryFactory(); + this.tlsChannelStreamFactoryFactory = new TlsChannelStreamFactoryFactory(new DefaultInetAddressResolver()); this.timeoutMillis = timeoutMillis; } diff --git a/driver-sync/src/main/com/mongodb/client/internal/MongoClientImpl.java b/driver-sync/src/main/com/mongodb/client/internal/MongoClientImpl.java index 47a55f18f34..e745c1f2a23 100644 --- a/driver-sync/src/main/com/mongodb/client/internal/MongoClientImpl.java +++ b/driver-sync/src/main/com/mongodb/client/internal/MongoClientImpl.java @@ -43,6 +43,7 @@ import com.mongodb.internal.diagnostics.logging.Loggers; import com.mongodb.internal.session.ServerSessionPool; import com.mongodb.lang.Nullable; +import com.mongodb.spi.dns.InetAddressResolver; import org.bson.BsonDocument; import org.bson.Document; import org.bson.codecs.configuration.CodecRegistry; @@ -54,6 +55,7 @@ import static com.mongodb.assertions.Assertions.notNull; import static com.mongodb.client.internal.Crypts.createCrypt; import static com.mongodb.internal.connection.ClientMetadataHelper.createClientMetadataDocument; +import static com.mongodb.internal.connection.ServerAddressHelper.getInetAddressResolver; import static com.mongodb.internal.connection.StreamFactoryHelper.getStreamFactoryFactoryFromSettings; import static com.mongodb.internal.event.EventListenerHelper.getCommandListener; import static java.lang.String.format; @@ -227,16 +229,18 @@ private static Cluster createCluster(final MongoClientSettings settings, getStreamFactory(settings, false), getStreamFactory(settings, true), settings.getCredential(), settings.getLoggerSettings(), getCommandListener(settings.getCommandListeners()), settings.getApplicationName(), mongoDriverInformation, settings.getCompressorList(), settings.getServerApi(), - settings.getDnsClient(), settings.getInetAddressResolver()); + settings.getDnsClient()); } private static StreamFactory getStreamFactory(final MongoClientSettings settings, final boolean isHeartbeat) { SocketSettings socketSettings = isHeartbeat ? settings.getHeartbeatSocketSettings() : settings.getSocketSettings(); TransportSettings transportSettings = settings.getTransportSettings(); + InetAddressResolver inetAddressResolver = getInetAddressResolver(settings); if (transportSettings == null) { - return new SocketStreamFactory(socketSettings, settings.getSslSettings()); + return new SocketStreamFactory(inetAddressResolver, socketSettings, settings.getSslSettings()); } else { - return getStreamFactoryFactoryFromSettings(transportSettings).create(socketSettings, settings.getSslSettings()); + return getStreamFactoryFactoryFromSettings(transportSettings, inetAddressResolver) + .create(socketSettings, settings.getSslSettings()); } }