Skip to content

Commit ec02cb6

Browse files
committed
Avoid configuring the database number in JedisClientConfiguration used for Sentinels.
We now no longer configure the database number configured for data node access through JedisClientConfiguration instances that are used for Sentinel node connectivity. Previously, the configured database number lead to issuing a SELECT command on Sentinel that doesn't support database isolation. Fixes #2103.
1 parent faf9ea7 commit ec02cb6

File tree

2 files changed

+48
-7
lines changed

2 files changed

+48
-7
lines changed

src/main/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactory.java

+11-7
Original file line numberDiff line numberDiff line change
@@ -319,7 +319,7 @@ protected JedisConnection postProcessConnection(JedisConnection connection) {
319319
*/
320320
public void afterPropertiesSet() {
321321

322-
clientConfig = createClientConfig(getRedisUsername(), getRedisPassword());
322+
clientConfig = createClientConfig(getDatabase(), getRedisUsername(), getRedisPassword());
323323

324324
if (shardInfo == null && clientConfiguration instanceof MutableJedisClientConfiguration) {
325325

@@ -360,15 +360,19 @@ public void afterPropertiesSet() {
360360
this.initialized = true;
361361
}
362362

363-
private JedisClientConfig createClientConfig(@Nullable String username, RedisPassword password) {
363+
private JedisClientConfig createSentinelClientConfig(SentinelConfiguration sentinelConfiguration) {
364+
return createClientConfig(0, null, sentinelConfiguration.getSentinelPassword());
365+
}
366+
367+
private JedisClientConfig createClientConfig(int database, @Nullable String username, RedisPassword password) {
364368

365369
DefaultJedisClientConfig.Builder builder = DefaultJedisClientConfig.builder();
366370

367371
clientConfiguration.getClientName().ifPresent(builder::clientName);
368372
builder.connectionTimeoutMillis(getConnectTimeout());
369373
builder.socketTimeoutMillis(getReadTimeout());
370374

371-
builder.database(getDatabase());
375+
builder.database(database);
372376

373377
if (!ObjectUtils.isEmpty(username)) {
374378
builder.user(username);
@@ -405,9 +409,8 @@ private Pool<Jedis> createPool() {
405409
protected Pool<Jedis> createRedisSentinelPool(RedisSentinelConfiguration config) {
406410

407411
GenericObjectPoolConfig<Jedis> poolConfig = getPoolConfig() != null ? getPoolConfig() : new JedisPoolConfig();
408-
String sentinelUser = null;
409412

410-
JedisClientConfig sentinelConfig = createClientConfig(sentinelUser, config.getSentinelPassword());
413+
JedisClientConfig sentinelConfig = createSentinelClientConfig(config);
411414
return new JedisSentinelPool(config.getMaster().getName(), convertToJedisSentinelSet(config.getSentinels()),
412415
poolConfig, this.clientConfig, sentinelConfig);
413416
}
@@ -513,7 +516,7 @@ public RedisConnection getConnection() {
513516

514517
SentinelConfiguration sentinelConfiguration = getSentinelConfiguration();
515518
if (sentinelConfiguration != null) {
516-
sentinelConfig = createClientConfig(null, sentinelConfiguration.getSentinelPassword());
519+
sentinelConfig = createSentinelClientConfig(sentinelConfiguration);
517520
}
518521

519522
JedisConnection connection = (getUsePool() ? new JedisConnection(jedis, pool, this.clientConfig, sentinelConfig)
@@ -904,7 +907,7 @@ private Jedis getActiveSentinel() {
904907
Assert.isTrue(RedisConfiguration.isSentinelConfiguration(configuration), "SentinelConfig must not be null!");
905908
SentinelConfiguration sentinelConfiguration = (SentinelConfiguration) configuration;
906909

907-
JedisClientConfig clientConfig = createClientConfig(null, sentinelConfiguration.getSentinelPassword());
910+
JedisClientConfig clientConfig = createSentinelClientConfig(sentinelConfiguration);
908911
for (RedisNode node : sentinelConfiguration.getSentinels()) {
909912

910913
Jedis jedis = null;
@@ -929,6 +932,7 @@ private Jedis getActiveSentinel() {
929932
throw new InvalidDataAccessResourceUsageException("No Sentinel found");
930933
}
931934

935+
932936
private static Set<HostAndPort> convertToJedisSentinelSet(Collection<RedisNode> nodes) {
933937

934938
if (CollectionUtils.isEmpty(nodes)) {

src/test/java/org/springframework/data/redis/connection/jedis/JedisConnectionFactorySentinelIntegrationTests.java

+37
Original file line numberDiff line numberDiff line change
@@ -17,11 +17,14 @@
1717

1818
import static org.assertj.core.api.Assertions.*;
1919

20+
import java.io.IOException;
21+
2022
import org.junit.jupiter.api.AfterEach;
2123
import org.junit.jupiter.api.Test;
2224

2325
import org.springframework.data.redis.connection.RedisConnection;
2426
import org.springframework.data.redis.connection.RedisSentinelConfiguration;
27+
import org.springframework.data.redis.connection.RedisSentinelConnection;
2528
import org.springframework.data.redis.test.condition.EnabledOnRedisSentinelAvailable;
2629
import org.springframework.lang.Nullable;
2730

@@ -48,6 +51,40 @@ void tearDown() {
4851
}
4952
}
5053

54+
@Test // GH-2103
55+
void shouldConnectDataNodeCorrectly() {
56+
57+
RedisSentinelConfiguration configuration = new RedisSentinelConfiguration().master("mymaster")
58+
.sentinel("127.0.0.1", 26379).sentinel("127.0.0.1", 26380);
59+
configuration.setDatabase(5);
60+
61+
factory = new JedisConnectionFactory(configuration);
62+
factory.afterPropertiesSet();
63+
64+
RedisConnection connection = factory.getConnection();
65+
connection.flushAll();
66+
connection.set("key5".getBytes(), "value5".getBytes());
67+
68+
connection.select(0);
69+
assertThat(connection.exists("key5".getBytes())).isFalse();
70+
connection.close();
71+
}
72+
73+
@Test // GH-2103
74+
void shouldConnectSentinelNodeCorrectly() throws IOException {
75+
76+
RedisSentinelConfiguration configuration = new RedisSentinelConfiguration().master("mymaster")
77+
.sentinel("127.0.0.1", 26379).sentinel("127.0.0.1", 26380);
78+
configuration.setDatabase(5);
79+
80+
factory = new JedisConnectionFactory(configuration);
81+
factory.afterPropertiesSet();
82+
83+
RedisSentinelConnection sentinelConnection = factory.getSentinelConnection();
84+
assertThat(sentinelConnection.masters()).isNotNull();
85+
sentinelConnection.close();
86+
}
87+
5188
@Test // DATAREDIS-574, DATAREDIS-765
5289
void shouldInitializeWithSentinelConfiguration() {
5390

0 commit comments

Comments
 (0)