From 5cd8bb8e272f61f673ed6284291aa89cfd2ca683 Mon Sep 17 00:00:00 2001 From: Mark Paluch Date: Wed, 27 Mar 2019 09:51:27 +0100 Subject: [PATCH] DATAREDIS-953 - Release connection after failed validation only once. We now release a connection after a failed validation only once. Previously, a connection was released twice which caused a failure if the connection was obtained from a pool. Original Pull Request: #445 --- .../lettuce/LettuceConnectionFactory.java | 5 ---- .../LettuceConnectionFactoryUnitTests.java | 27 +++++++++++++++++++ 2 files changed, 27 insertions(+), 5 deletions(-) diff --git a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java index f51cd876c..65940f290 100644 --- a/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java +++ b/src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactory.java @@ -1170,12 +1170,7 @@ public class LettuceConnectionFactory if (!valid) { - if (connection != null) { - connectionProvider.release(connection); - } - log.warn("Validation of shared connection failed. Creating a new connection."); - resetConnection(); this.connection = getNativeConnection(); } diff --git a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java index da12090ba..7b40ada1a 100644 --- a/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java +++ b/src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java @@ -692,6 +692,33 @@ public class LettuceConnectionFactoryUnitTests { verify(syncMock).ping(); } + @Test // DATAREDIS-953 + public void shouldReleaseSharedConnectionOnlyOnce() { + + RedisClusterClient clientMock = mock(RedisClusterClient.class); + StatefulRedisClusterConnection connectionMock = mock(StatefulRedisClusterConnection.class); + when(clientMock.connectAsync(ByteArrayCodec.INSTANCE)) + .thenReturn(CompletableFuture.completedFuture(connectionMock)); + when(connectionMock.isOpen()).thenReturn(false); + when(connectionMock.closeAsync()).thenReturn(CompletableFuture.completedFuture(null)); + + LettuceConnectionFactory connectionFactory = new LettuceConnectionFactory(clusterConfig, + LettuceClientConfiguration.defaultConfiguration()) { + + @Override + protected AbstractRedisClient createClient() { + return clientMock; + } + }; + + connectionFactory.setValidateConnection(true); + connectionFactory.afterPropertiesSet(); + + connectionFactory.getConnection().close(); + + verify(connectionMock).closeAsync(); + } + @Test // DATAREDIS-721 @SuppressWarnings("unchecked") public void shouldEagerlyInitializeSharedConnection() {