RRM
RRM

Reputation: 2679

Lettuce client for Redis - Cluster Topology Refresh Options not working

I'm using lettuce client version 6.2.0 to connect to a Redis cluster (v 6.2) with 3 masters each having 1 replica. I'm trying that the client re-discovers the cluster topology after a master goes down. Here is the client code I have:

  List<RedisURI> redisURIs = new ArrayList<>();
  redisURIs.add(RedisURI.create("redis://127.0.0.1:7000"));
  redisURIs.add(RedisURI.create("redis://127.0.0.1:7001"));
  redisURIs.add(RedisURI.create("redis://127.0.0.1:7002"));
  redisURIs.add(RedisURI.create("redis://127.0.0.1:7003"));
  redisURIs.add(RedisURI.create("redis://127.0.0.1:7004"));
  redisURIs.add(RedisURI.create("redis://127.0.0.1:7005"));

  ClusterTopologyRefreshOptions topologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
        .enableAllAdaptiveRefreshTriggers()
        .refreshTriggersReconnectAttempts(1)
        .enablePeriodicRefresh(Duration.ofSeconds(5))
        .build();
  ClusterClientOptions clientOptions = ClusterClientOptions.builder()
        .autoReconnect(true).topologyRefreshOptions(topologyRefreshOptions).build();

  ClientResources clientResources = ClientResources.builder().reconnectDelay(Delay.equalJitter()).build();
  RedisClusterClient clusterClient = RedisClusterClient.create(clientResources, redisURIs);
  clusterClient.setOptions(clientOptions);

The problem is that despite the setting enablePeriodicRefresh(Duration.ofSeconds(5)) the refresh interval is still taken as 60 seconds, instead of 5 seconds. Till 1 minute after a master goes down, the client stops working, i.e. it is not able to issue incr operation through clusterClient and the error keeps repeating:

Jul 18, 2022 5:56:21 PM io.lettuce.core.protocol.ConnectionWatchdog lambda$run$4
WARNING: Cannot reconnect to [127.0.0.1:7000]: Connection refused: /127.0.0.1:7000

After 1 minute timeout, it shows the warning message:

Jul 18, 2022 5:56:22 PM io.lettuce.core.cluster.topology.DefaultClusterTopologyRefresh lambda$openConnections$12
WARNING: Unable to connect to [127.0.0.1:7000]: Connection refused: /127.0.0.1:7000
Command timed out after 1 minute(s)

..and then it is able to proceed with commands. Even after that, it keeps showing the warning message:

Jul 18, 2022 5:56:27 PM io.lettuce.core.cluster.topology.DefaultClusterTopologyRefresh lambda$openConnections$12
WARNING: Unable to connect to [127.0.0.1:7000]: Connection refused: /127.0.0.1:7000

What am I missing here?

Upvotes: 0

Views: 4998

Answers (1)

redisgate
redisgate

Reputation: 11

The enablePeriodicRefresh() setting works after the connection timeout. You don't set the connection timeout, but it defaults to 60sec. Adjusting the connection timeout will give you the desired result.

ex) redisURIs.add(RedisURI.create("redis://127.0.0.1:7000/0?timeout=10s"));

Upvotes: 1

Related Questions