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 4992b23953..4de48a6446 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 @@ -316,13 +316,11 @@ private ClusterComposition handleRoutingProcedureError( throw new CompletionException(error); } - // Retriable error happened during discovery. - DiscoveryException discoveryError = - new DiscoveryException(format(RECOVERABLE_ROUTING_ERROR, routerAddress), error); + // Retryable error happened during discovery. + var 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 b826260c53..94206364b3 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 @@ -28,6 +28,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; @@ -54,6 +56,7 @@ import java.util.List; import java.util.Map; import java.util.Set; +import java.util.concurrent.CompletableFuture; import org.junit.jupiter.api.Disabled; import org.junit.jupiter.api.Test; import org.junit.jupiter.params.ParameterizedTest; @@ -525,6 +528,35 @@ void shouldFailImmediatelyOnUnsupportedFeatureException() { verify(table).forget(A); } + @Test + void shouldLogScopedIPV6AddressWithStringFormattingLogger() throws UnknownHostException { + // GIVEN + var initialRouter = new BoltServerAddress("initialRouter", 7687); + var compositionProvider = compositionProviderMock(Collections.emptyMap()); + var resolver = resolverMock(initialRouter, initialRouter); + var domainNameResolver = mock(DomainNameResolver.class); + var 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}); + var table = routingTableMock(true); + var pool = mock(ConnectionPool.class); + given(pool.acquire(any(), any())) + .willReturn(CompletableFuture.failedFuture(new ServiceUnavailableException("not available"))); + var logging = mock(Logging.class); + var 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()); + var rediscovery = + new RediscoveryImpl(initialRouter, compositionProvider, resolver, logging, domainNameResolver); + + // WHEN & THEN + assertThrows( + ServiceUnavailableException.class, + () -> await(rediscovery.lookupClusterComposition(table, pool, Collections.emptySet(), null, null))); + } + private Rediscovery newRediscovery( BoltServerAddress initialRouter, ClusterCompositionProvider compositionProvider,