diff --git a/driver/src/main/java/org/neo4j/driver/internal/cluster/RediscoveryImpl.java b/driver/src/main/java/org/neo4j/driver/internal/cluster/RediscoveryImpl.java index 1827a75a67..32a57fbc5b 100644 --- a/driver/src/main/java/org/neo4j/driver/internal/cluster/RediscoveryImpl.java +++ b/driver/src/main/java/org/neo4j/driver/internal/cluster/RediscoveryImpl.java @@ -299,13 +299,12 @@ private ClusterComposition handleRoutingProcedureError( throw new CompletionException(error); } - // Retriable error happened during discovery. + // Retryable error happened during discovery. DiscoveryException discoveryError = new DiscoveryException(format(RECOVERABLE_ROUTING_ERROR, routerAddress), error); Futures.combineErrors(baseError, discoveryError); // we record each failure here - String warningMessage = format(RECOVERABLE_DISCOVERY_ERROR_WITH_SERVER, routerAddress); - log.warn(warningMessage); - log.debug(warningMessage, discoveryError); + log.warn(RECOVERABLE_DISCOVERY_ERROR_WITH_SERVER, routerAddress); + log.debug(format(RECOVERABLE_DISCOVERY_ERROR_WITH_SERVER, routerAddress), discoveryError); routingTable.forget(routerAddress); return null; } diff --git a/driver/src/test/java/org/neo4j/driver/internal/cluster/RediscoveryTest.java b/driver/src/test/java/org/neo4j/driver/internal/cluster/RediscoveryTest.java index ce57b73bf2..9df357ed9f 100644 --- a/driver/src/test/java/org/neo4j/driver/internal/cluster/RediscoveryTest.java +++ b/driver/src/test/java/org/neo4j/driver/internal/cluster/RediscoveryTest.java @@ -29,6 +29,8 @@ import static org.junit.jupiter.api.Assertions.assertNotNull; import static org.junit.jupiter.api.Assertions.assertThrows; import static org.mockito.ArgumentMatchers.any; +import static org.mockito.BDDMockito.given; +import static org.mockito.Mockito.doAnswer; import static org.mockito.Mockito.mock; import static org.mockito.Mockito.never; import static org.mockito.Mockito.startsWith; @@ -52,9 +54,11 @@ import java.net.InetAddress; import java.net.UnknownHostException; import java.util.Arrays; +import java.util.Collections; import java.util.HashMap; import java.util.List; import java.util.Map; +import java.util.concurrent.CompletableFuture; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; import org.junit.jupiter.params.provider.ValueSource; @@ -524,6 +528,43 @@ void shouldResolveToIP() throws UnknownHostException { assertEquals(new BoltServerAddress(A.host(), localhost.getHostAddress(), A.port()), addresses.get(0)); } + @Test + void shouldLogScopedIPV6AddressWithStringFormattingLogger() throws UnknownHostException { + // GIVEN + BoltServerAddress initialRouter = new BoltServerAddress("initialRouter", 7687); + ClusterCompositionProvider compositionProvider = compositionProviderMock(Collections.emptyMap()); + ServerAddressResolver resolver = resolverMock(initialRouter, initialRouter); + DomainNameResolver domainNameResolver = mock(DomainNameResolver.class); + InetAddress address = mock(InetAddress.class); + given(address.getHostAddress()).willReturn("fe80:0:0:0:ce66:1564:db8q:94b6%6"); + given(domainNameResolver.resolve(initialRouter.host())).willReturn(new InetAddress[] {address}); + RoutingTable table = routingTableMock(true); + ConnectionPool pool = mock(ConnectionPool.class); + CompletableFuture failedAcquisition = new CompletableFuture<>(); + failedAcquisition.completeExceptionally(new ServiceUnavailableException("not available")); + given(pool.acquire(any())).willReturn(failedAcquisition); + Logging logging = mock(Logging.class); + Logger logger = mock(Logger.class); + given(logging.getLog(any(Class.class))).willReturn(logger); + doAnswer(invocationOnMock -> String.format(invocationOnMock.getArgument(0), invocationOnMock.getArgument(1))) + .when(logger) + .warn(any()); + RoutingSettings settings = new RoutingSettings(1, 0, 0); + RediscoveryImpl rediscovery = new RediscoveryImpl( + initialRouter, + settings, + compositionProvider, + GlobalEventExecutor.INSTANCE, + resolver, + logging, + domainNameResolver); + + // WHEN & THEN + assertThrows( + ServiceUnavailableException.class, + () -> await(rediscovery.lookupClusterComposition(table, pool, null, null))); + } + private Rediscovery newRediscovery( BoltServerAddress initialRouter, ClusterCompositionProvider compositionProvider,