-
Notifications
You must be signed in to change notification settings - Fork 1.1k
Description
Bug Report
Current Behavior
I'm using the client to execute FT.Search command on memoryDB. The ReadFrom strategy is set to Replica. However I noticed that all requests are being sent to the master node. I have one master and one replica so this is a scalability bottle neck. I found that memory DB expects commands to be in read-only mode in order to execute them on replicas. Else it redirects them to the master. I tried several options to make the command read-only but it has been in deterministic. i.e. the requests sometimes are sent to the replicas but at other times they are still sent to master. However they do get consistently sent to the node between JVM recycles.
I have tried executing a read-only command each time before the actual FT.Search execution. I have also tried executing read-only command on the connection during the creation of the connection (singleton) but same result. I tried passing read-only overrides in the client config options while creating the client but same behavior.
Input Code
Input Code
RedisAdvancedClusterAsyncCommands<String, byte[]> redisCommand = connection.async();
redisCommand.readOnly().get();
RedisFuture<List<Object>> nestedOutputFuture =
redisCommand.dispatch(MemoryDbCommands.FT_SEARCH, new NestedMultiOutput<>(codec), args);
List<Object> results = nestedOutputFuture.get(commandTimeout, TimeUnit.MILLISECONDS);RedisClusterClient redisClusterClient = LettuceClusterClientBuilder.createRedisClusterClient(redisConfig);
StatefulRedisClusterConnection<String, byte[]> connection
= redisClusterClient.connect(RedisCodec.of(StringCodec.UTF8, ByteArrayCodec.INSTANCE));
connection.setReadFrom(redisConfig.readFromStrategy());
connection.async().readonly(node -> node.getRole().isReplica());
connection.async().ping().get();
connection.sync().ping();
connection.async().readOnly().get();
connection.sync().readOnly(); return ClusterClientOptions.builder()
.topologyRefreshOptions(topologyOptions)
.socketOptions(socketOptions)
.validateClusterNodeMembership(false)
.publishOnScheduler(true)
.readOnlyCommands(command -> true)
.sslOptions(redisConfig.getSslOptions())
.build();Expected behavior/code
I would expect that all requests go to the replica as desired because I have set the ReadFrom Strategy to Replica and I'm setting the command to read-only
Environment
- Lettuce version(s): 6.4
- Redis version: 7.1