DATAREDIS-794 - Improve Jedis Cluster Topology caching.

We now made JedisClusterTopologyProvider public and configurable through overriding JedisConnectionFactory.createTopologyProvider(…).

The topology provider accepts a configurable timeout to configure the cache timeout. Alternatively, custom ClusterTopologyProvider implementations can be returned through JedisConnectionFactory.createTopologyProvider(…).

Original Pull Request: #383
This commit is contained in:
Mark Paluch
2019-02-08 13:21:17 +01:00
committed by Christoph Strobl
parent a0e3dca1e4
commit 34bcd46620
4 changed files with 105 additions and 15 deletions

View File

@@ -30,6 +30,7 @@ import redis.clients.jedis.JedisPool;
import redis.clients.jedis.exceptions.JedisConnectionException;
import java.io.IOException;
import java.time.Duration;
import java.util.Arrays;
import java.util.Collections;
import java.util.LinkedHashMap;
@@ -370,6 +371,32 @@ public class JedisClusterConnectionUnitTests {
connection.set("foo".getBytes(), "bar".getBytes());
}
@Test // DATAREDIS-794
public void clusterTopologyProviderShouldUseCachedTopology() {
when(clusterMock.getClusterNodes()).thenReturn(Collections.singletonMap("mock", node1PoolMock));
when(con1Mock.clusterNodes()).thenReturn(CLUSTER_NODES_RESPONSE);
JedisClusterTopologyProvider provider = new JedisClusterTopologyProvider(clusterMock, Duration.ofSeconds(5));
provider.getTopology();
provider.getTopology();
verify(con1Mock).clusterNodes();
}
@Test // DATAREDIS-794
public void clusterTopologyProviderShouldRequestTopology() {
when(clusterMock.getClusterNodes()).thenReturn(Collections.singletonMap("mock", node1PoolMock));
when(con1Mock.clusterNodes()).thenReturn(CLUSTER_NODES_RESPONSE);
JedisClusterTopologyProvider provider = new JedisClusterTopologyProvider(clusterMock, Duration.ZERO);
provider.getTopology();
provider.getTopology();
verify(con1Mock, times(2)).clusterNodes();
}
static class StubJedisCluster extends JedisCluster {
JedisClusterConnectionHandler connectionHandler;

View File

@@ -309,8 +309,9 @@ public class JedisConnectionFactoryUnitTests {
private JedisConnectionFactory initSpyedConnectionFactory(RedisClusterConfiguration clusterConfig,
JedisPoolConfig poolConfig) {
JedisCluster clusterMock = mock(JedisCluster.class);
JedisConnectionFactory factorySpy = spy(new JedisConnectionFactory(clusterConfig));
doReturn(null).when(factorySpy).createCluster(any(RedisClusterConfiguration.class),
doReturn(clusterMock).when(factorySpy).createCluster(any(RedisClusterConfiguration.class),
any(GenericObjectPoolConfig.class));
doReturn(null).when(factorySpy).createRedisPool();
return factorySpy;