Skip to content

Commit 51ccec8

Browse files
committed
Upgrade to Lettuce 7.0.0
Signed-off-by: Mingyuan Wu <[email protected]>
1 parent fc93414 commit 51ccec8

File tree

9 files changed

+92
-35
lines changed

9 files changed

+92
-35
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<beanutils>1.11.0</beanutils>
2424
<xstream>1.4.21</xstream>
2525
<pool>2.11.1</pool>
26-
<lettuce>6.8.1.RELEASE</lettuce>
26+
<lettuce>7.0.0.RELEASE</lettuce>
2727
<jedis>7.0.0</jedis>
2828
<multithreadedtc>1.01</multithreadedtc>
2929
<netty>4.2.3.Final</netty>

src/main/java/org/springframework/data/redis/connection/lettuce/LettuceClusterKeyCommands.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
/**
3838
* @author Christoph Strobl
3939
* @author Mark Paluch
40+
* @author Mingyuan Wu
4041
* @since 2.0
4142
*/
4243
@NullUnmarked
@@ -108,7 +109,7 @@ public Boolean move(byte @NonNull [] key, int dbIndex) {
108109
Assert.notNull(pattern, "Pattern must not be null");
109110

110111
return LettuceConverters.toBytesSet(connection.getClusterCommandExecutor()
111-
.executeCommandOnSingleNode((LettuceClusterCommandCallback<List<byte[]>>) client -> client.keys(pattern), node)
112+
.executeCommandOnSingleNode((LettuceClusterCommandCallback<List<byte[]>>) client -> client.keysLegacy(pattern), node)
112113
.getValue());
113114
}
114115

src/main/java/org/springframework/data/redis/connection/lettuce/LettuceConverters.java

Lines changed: 31 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -19,6 +19,7 @@
1919
import static org.springframework.data.redis.domain.geo.GeoReference.*;
2020

2121
import io.lettuce.core.*;
22+
import io.lettuce.core.RedisCredentialsProvider.ImmediateRedisCredentialsProvider;
2223
import io.lettuce.core.cluster.models.partitions.Partitions;
2324
import io.lettuce.core.cluster.models.partitions.RedisClusterNode.NodeFlag;
2425

@@ -87,6 +88,7 @@
8788
* @author Vikas Garg
8889
* @author John Blum
8990
* @author Roman Osadchuk
91+
* @author Mingyuan Wu
9092
*/
9193
@SuppressWarnings("ConstantConditions")
9294
public abstract class LettuceConverters extends Converters {
@@ -452,8 +454,9 @@ static RedisSentinelConfiguration createRedisSentinelConfiguration(RedisURI redi
452454

453455
RedisNode sentinelNode = new RedisNode(sentinelNodeRedisUri.getHost(), sentinelNodeRedisUri.getPort());
454456

455-
if (sentinelNodeRedisUri.getPassword() != null) {
456-
sentinelConfiguration.setSentinelPassword(sentinelNodeRedisUri.getPassword());
457+
RedisCredentials credentials;
458+
if( (credentials = getRedisCredentials(redisURI)) != null && credentials.getPassword() != null) {
459+
sentinelConfiguration.setSentinelPassword(credentials.getPassword());
457460
}
458461

459462
sentinelConfiguration.addSentinel(sentinelNode);
@@ -466,15 +469,35 @@ static RedisSentinelConfiguration createRedisSentinelConfiguration(RedisURI redi
466469

467470
private static void applyAuthentication(RedisURI redisURI, RedisConfiguration.WithAuthentication redisConfiguration) {
468471

469-
if (StringUtils.hasText(redisURI.getUsername())) {
470-
redisConfiguration.setUsername(redisURI.getUsername());
471-
}
472+
RedisCredentials credentials;
473+
if( (credentials = getRedisCredentials(redisURI)) != null) {
474+
if (StringUtils.hasText(credentials.getUsername())) {
475+
redisConfiguration.setUsername(credentials.getUsername());
476+
}
472477

473-
if (redisURI.getPassword() != null) {
474-
redisConfiguration.setPassword(redisURI.getPassword());
475-
}
478+
if (credentials.getPassword() != null) {
479+
redisConfiguration.setPassword(credentials.getPassword());
480+
}
481+
}
476482
}
477483

484+
public static RedisCredentials getRedisCredentials(RedisURI redisURI) {
485+
486+
if (redisURI != null) {
487+
RedisCredentialsProvider credentialsProvider = redisURI.getCredentialsProvider();
488+
if (credentialsProvider != null) {
489+
RedisCredentials credentials;
490+
if(credentialsProvider instanceof ImmediateRedisCredentialsProvider immediateCredentialsProvider) {
491+
credentials = immediateCredentialsProvider.resolveCredentialsNow();
492+
}else {
493+
credentials = credentialsProvider.resolveCredentials().block();
494+
}
495+
return credentials;
496+
}
497+
}
498+
return null;
499+
}
500+
478501
@Contract("null -> null;!null -> !null")
479502
public static byte @Nullable [] toBytes(@Nullable String source) {
480503
return source != null ? source.getBytes() : null;

src/main/java/org/springframework/data/redis/connection/lettuce/LettuceKeyCommands.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -50,6 +50,7 @@
5050
* @author Christoph Strobl
5151
* @author Mark Paluch
5252
* @author ihaohong
53+
* @author Mingyuan Wu
5354
* @since 2.0
5455
*/
5556
@NullUnmarked
@@ -126,7 +127,7 @@ public Long touch(byte @NonNull [] @NonNull... keys) {
126127
127128
Assert.notNull(pattern, "Pattern must not be null");
128129
129-
return connection.invoke().fromMany(RedisKeyAsyncCommands::keys, pattern).toSet();
130+
return connection.invoke().fromMany(RedisKeyAsyncCommands::keysLegacy, pattern).toSet();
130131
}
131132
132133
/**

src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveClusterKeyCommands.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
/**
3838
* @author Christoph Strobl
3939
* @author Mark Paluch
40+
* @author Mingyuan Wu
4041
* @since 2.0
4142
*/
4243
class LettuceReactiveClusterKeyCommands extends LettuceReactiveKeyCommands implements ReactiveClusterKeyCommands {
@@ -62,7 +63,7 @@ public Mono<List<ByteBuffer>> keys(RedisClusterNode node, ByteBuffer pattern) {
6263

6364
Assert.notNull(pattern, "Pattern must not be null");
6465

65-
return cmd.keys(pattern).collectList();
66+
return cmd.keysLegacy(pattern).collectList();
6667
}).next();
6768
}
6869

src/main/java/org/springframework/data/redis/connection/lettuce/LettuceReactiveKeyCommands.java

Lines changed: 2 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@
4848
* @author Christoph Strobl
4949
* @author Mark Paluch
5050
* @author Dahye Anne Lee
51+
* @author Mingyuan Wu
5152
* @since 2.0
5253
*/
5354
class LettuceReactiveKeyCommands implements ReactiveKeyCommands {
@@ -125,7 +126,7 @@ public Flux<MultiValueResponse<ByteBuffer, ByteBuffer>> keys(Publisher<ByteBuffe
125126

126127
Assert.notNull(pattern, "Pattern must not be null");
127128
// TODO: stream elements instead of collection
128-
return cmd.keys(pattern).collectList().map(value -> new MultiValueResponse<>(pattern, value));
129+
return cmd.keysLegacy(pattern).collectList().map(value -> new MultiValueResponse<>(pattern, value));
129130
}));
130131
}
131132

src/test/java/org/springframework/data/redis/connection/lettuce/LettuceClusterConnectionUnitTests.java

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -196,15 +196,15 @@ void isClosedShouldReturnConnectionStateCorrectly() {
196196
@Test // DATAREDIS-315
197197
void keysShouldOnlyBeRunOnDedicatedNodeWhenPinned() {
198198

199-
when(clusterConnection2Mock.keys(any(byte[].class))).thenReturn(Collections.<byte[]> emptyList());
199+
when(clusterConnection2Mock.keysLegacy(any(byte[].class))).thenReturn(Collections.<byte[]> emptyList());
200200

201201
byte[] pattern = LettuceConverters.toBytes("*");
202202

203203
connection.keys(CLUSTER_NODE_2, pattern);
204204

205-
verify(clusterConnection1Mock, never()).keys(pattern);
206-
verify(clusterConnection2Mock, times(1)).keys(pattern);
207-
verify(clusterConnection3Mock, never()).keys(pattern);
205+
verify(clusterConnection1Mock, never()).keysLegacy(pattern);
206+
verify(clusterConnection2Mock, times(1)).keysLegacy(pattern);
207+
verify(clusterConnection3Mock, never()).keysLegacy(pattern);
208208
}
209209

210210
@Test // DATAREDIS-315

src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConnectionFactoryUnitTests.java

Lines changed: 24 additions & 8 deletions
Original file line numberDiff line numberDiff line change
@@ -21,9 +21,11 @@
2121
import static org.springframework.data.redis.connection.RedisConfiguration.*;
2222
import static org.springframework.data.redis.test.extension.LettuceTestClientResources.*;
2323
import static org.springframework.test.util.ReflectionTestUtils.*;
24+
import static org.springframework.data.redis.connection.lettuce.LettuceConverters.getRedisCredentials;
2425

2526
import io.lettuce.core.AbstractRedisClient;
2627
import io.lettuce.core.ClientOptions;
28+
import io.lettuce.core.RedisCredentials;
2729
import io.lettuce.core.RedisClient;
2830
import io.lettuce.core.RedisURI;
2931
import io.lettuce.core.SslVerifyMode;
@@ -186,7 +188,9 @@ void passwordShouldBeSetCorrectlyOnClusterClient() {
186188
Iterable<RedisURI> initialUris = (Iterable<RedisURI>) getField(client, "initialUris");
187189

188190
for (RedisURI uri : initialUris) {
189-
assertThat(uri.getPassword()).isEqualTo(connectionFactory.getPassword().toCharArray());
191+
RedisCredentials credential = getRedisCredentials(uri);
192+
assertThat(credential).isNotNull();
193+
assertThat(credential.getPassword()).isEqualTo(connectionFactory.getPassword().toCharArray());
190194
}
191195
}
192196

@@ -257,10 +261,14 @@ void passwordShouldNotBeSetOnSentinelClient() {
257261

258262
RedisURI redisUri = (RedisURI) getField(client, "redisURI");
259263

260-
assertThat(redisUri.getPassword()).isEqualTo(connectionFactory.getPassword().toCharArray());
264+
RedisCredentials credential = getRedisCredentials(redisUri);
265+
assertThat(credential).isNotNull();
266+
assertThat(credential.getPassword()).isEqualTo(connectionFactory.getPassword().toCharArray());
261267

262268
for (RedisURI sentinel : redisUri.getSentinels()) {
263-
assertThat(sentinel.getPassword()).isNull();
269+
RedisCredentials sentinelCredential = getRedisCredentials(sentinel);
270+
assertThat(sentinelCredential).isNotNull();
271+
assertThat(sentinelCredential.getPassword()).isNull();
264272
}
265273
}
266274

@@ -281,10 +289,14 @@ void sentinelPasswordShouldBeSetOnSentinelClient() {
281289

282290
RedisURI redisUri = (RedisURI) getField(client, "redisURI");
283291

284-
assertThat(redisUri.getPassword()).isEqualTo(connectionFactory.getPassword().toCharArray());
292+
RedisCredentials credential = getRedisCredentials(redisUri);
293+
assertThat(credential).isNotNull();
294+
assertThat(credential.getPassword()).isEqualTo(connectionFactory.getPassword().toCharArray());
285295

286296
for (RedisURI sentinel : redisUri.getSentinels()) {
287-
assertThat(sentinel.getPassword()).isEqualTo("sentinel-pwd".toCharArray());
297+
RedisCredentials sentinelCredentials = getRedisCredentials(sentinel);
298+
assertThat(sentinelCredentials).isNotNull();
299+
assertThat(sentinelCredentials.getPassword()).isEqualTo("sentinel-pwd".toCharArray());
288300
}
289301
}
290302

@@ -338,10 +350,14 @@ void sentinelPasswordShouldNotLeakIntoDataNodeClient() {
338350

339351
RedisURI redisUri = (RedisURI) getField(client, "redisURI");
340352

341-
assertThat(redisUri.getPassword()).isNull();
353+
RedisCredentials credential = getRedisCredentials(redisUri);
354+
assertThat(credential).isNotNull();
355+
assertThat(credential.getPassword()).isNull();
342356

343357
for (RedisURI sentinel : redisUri.getSentinels()) {
344-
assertThat(sentinel.getPassword()).isEqualTo("sentinel-pwd".toCharArray());
358+
RedisCredentials sentinelCredentials = getRedisCredentials(sentinel);
359+
assertThat(sentinelCredentials).isNotNull();
360+
assertThat(sentinelCredentials.getPassword()).isEqualTo("sentinel-pwd".toCharArray());
345361
}
346362
}
347363

@@ -1224,7 +1240,7 @@ void createFullRedisSentinelConfiguration() {
12241240
.create("redis-sentinel://fooUser:fooPass@myserver1:111,myserver2:222/7?sentinelMasterId=5150");
12251241
// Set the passwords directly on the sentinels so that it gets picked up by converter
12261242
char[] sentinelPass = "changeme".toCharArray();
1227-
redisURI.getSentinels().forEach(sentinelRedisUri -> sentinelRedisUri.setPassword(sentinelPass));
1243+
redisURI.getSentinels().forEach(sentinelRedisUri -> sentinelRedisUri.setAuthentication(sentinelPass));
12281244

12291245
RedisSentinelConfiguration expected = new RedisSentinelConfiguration();
12301246
expected.setMaster("5150");

src/test/java/org/springframework/data/redis/connection/lettuce/LettuceConvertersUnitTests.java

Lines changed: 24 additions & 10 deletions
Original file line numberDiff line numberDiff line change
@@ -19,9 +19,11 @@
1919
import static org.springframework.data.redis.connection.ClusterTestVariables.*;
2020
import static org.springframework.data.redis.connection.lettuce.LettuceCommandArgsComparator.*;
2121
import static org.springframework.test.util.ReflectionTestUtils.*;
22+
import static org.springframework.data.redis.connection.lettuce.LettuceConverters.getRedisCredentials;
2223

2324
import io.lettuce.core.GetExArgs;
2425
import io.lettuce.core.Limit;
26+
import io.lettuce.core.RedisCredentials;
2527
import io.lettuce.core.RedisURI;
2628
import io.lettuce.core.SetArgs;
2729
import io.lettuce.core.cluster.models.partitions.Partitions;
@@ -277,12 +279,16 @@ void sentinelConfigurationWithAuth() {
277279

278280
RedisURI redisURI = LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration);
279281

280-
assertThat(redisURI.getUsername()).isEqualTo("app");
281-
assertThat(redisURI.getPassword()).isEqualTo(dataPassword.get());
282+
RedisCredentials credential = getRedisCredentials(redisURI);
283+
assertThat(credential).isNotNull();
284+
assertThat(credential.getUsername()).isEqualTo("app");
285+
assertThat(credential.getPassword()).isEqualTo(dataPassword.get());
282286

283287
redisURI.getSentinels().forEach(sentinel -> {
284-
assertThat(sentinel.getUsername()).isEqualTo("admin");
285-
assertThat(sentinel.getPassword()).isEqualTo(sentinelPassword.get());
288+
RedisCredentials sentinelCredential = getRedisCredentials(sentinel);
289+
assertThat(sentinelCredential).isNotNull();
290+
assertThat(sentinelCredential.getUsername()).isEqualTo("admin");
291+
assertThat(sentinelCredential.getPassword()).isEqualTo(sentinelPassword.get());
286292
});
287293
}
288294

@@ -299,11 +305,15 @@ void sentinelConfigurationSetSentinelPasswordIfUsernameNotPresent() {
299305

300306
RedisURI redisURI = LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration);
301307

302-
assertThat(redisURI.getUsername()).isEqualTo("app");
308+
RedisCredentials credential = getRedisCredentials(redisURI);
309+
assertThat(credential).isNotNull();
310+
assertThat(credential.getUsername()).isEqualTo("app");
303311

304312
redisURI.getSentinels().forEach(sentinel -> {
305-
assertThat(sentinel.getUsername()).isNull();
306-
assertThat(sentinel.getPassword()).isNotNull();
313+
RedisCredentials sentinelCredential = getRedisCredentials(sentinel);
314+
assertThat(sentinelCredential).isNotNull();
315+
assertThat(sentinelCredential.getUsername()).isNull();
316+
assertThat(sentinelCredential.getPassword()).isNotNull();
307317
});
308318
}
309319

@@ -320,11 +330,15 @@ void sentinelConfigurationShouldNotSetSentinelAuthIfUsernameIsPresentWithNoPassw
320330

321331
RedisURI redisURI = LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration);
322332

323-
assertThat(redisURI.getUsername()).isEqualTo("app");
333+
RedisCredentials credential = getRedisCredentials(redisURI);
334+
assertThat(credential).isNotNull();
335+
assertThat(credential.getUsername()).isEqualTo("app");
324336

325337
redisURI.getSentinels().forEach(sentinel -> {
326-
assertThat(sentinel.getUsername()).isNull();
327-
assertThat(sentinel.getPassword()).isNull();
338+
RedisCredentials sentinelCredential = getRedisCredentials(sentinel);
339+
assertThat(sentinelCredential).isNotNull();
340+
assertThat(sentinelCredential.getUsername()).isNull();
341+
assertThat(sentinelCredential.getPassword()).isNull();
328342
});
329343
}
330344

0 commit comments

Comments
 (0)