DATAREDIS-949 - Consider max-redirects using Lettuce.

LettuceConnectionFactory now considers the maximal redirection limit for Redis Cluster redirections.

Previously, the max-redirects limit was not configured in Lettuce.

Original Pull Request: #417
This commit is contained in:
Mark Paluch
2019-03-21 11:43:59 +02:00
committed by Christoph Strobl
parent 2eb7067e8c
commit 50818fbb32
2 changed files with 83 additions and 4 deletions

View File

@@ -979,7 +979,8 @@ public class LettuceConnectionFactory
if (isClusterAware()) {
List<RedisURI> initialUris = new ArrayList<>();
for (RedisNode node : ((ClusterConfiguration) configuration).getClusterNodes()) {
ClusterConfiguration configuration = (ClusterConfiguration) this.configuration;
for (RedisNode node : configuration.getClusterNodes()) {
initialUris.add(createRedisURIAndApplySettings(node.getHost(), node.getPort()));
}
@@ -987,9 +988,7 @@ public class LettuceConnectionFactory
.map(clientResources -> RedisClusterClient.create(clientResources, initialUris)) //
.orElseGet(() -> RedisClusterClient.create(initialUris));
clientConfiguration.getClientOptions() //
.filter(clientOptions -> clientOptions instanceof ClusterClientOptions) //
.ifPresent(clientOptions -> clusterClient.setOptions((ClusterClientOptions) clientOptions));
clusterClient.setOptions(getClusterClientOptions(configuration));
return clusterClient;
}
@@ -1006,6 +1005,41 @@ public class LettuceConnectionFactory
return redisClient;
}
private ClusterClientOptions getClusterClientOptions(ClusterConfiguration configuration) {
Optional<ClientOptions> clientOptions = clientConfiguration.getClientOptions();
ClusterClientOptions clusterClientOptions = clientOptions //
.filter(ClusterClientOptions.class::isInstance) //
.map(ClusterClientOptions.class::cast) //
.orElseGet(() -> {
return clientOptions //
.map(LettuceConnectionFactory::toClusterClientOptions) //
.orElseGet(ClusterClientOptions::create);
});
if (configuration.getMaxRedirects() != null) {
return clusterClientOptions.mutate().maxRedirects(configuration.getMaxRedirects()).build();
}
return clusterClientOptions;
}
// TODO: Replace with Lettuce 5.1.6 ClusterClientOptions.builder(ClientOptions)
private static ClusterClientOptions toClusterClientOptions(ClientOptions it) {
return ClusterClientOptions.builder() //
.autoReconnect(it.isAutoReconnect()) //
.cancelCommandsOnReconnectFailure(it.isCancelCommandsOnReconnectFailure()) //
.disconnectedBehavior(it.getDisconnectedBehavior()) //
.pingBeforeActivateConnection(it.isPingBeforeActivateConnection()) //
.requestQueueSize(it.getRequestQueueSize()) //
.socketOptions(it.getSocketOptions()) //
.sslOptions(it.getSslOptions()) //
.suspendReconnectOnProtocolFailure(it.isSuspendReconnectOnProtocolFailure())//
.timeoutOptions(it.getTimeoutOptions()) //
.build();
}
private RedisURI getSentinelRedisURI() {
RedisURI redisUri = LettuceConverters.sentinelConfigurationToRedisURI(