Skip to content

Commit d7b069d

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

File tree

9 files changed

+95
-35
lines changed

9 files changed

+95
-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: 5 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
/**
5656
* @author Christoph Strobl
5757
* @author Mark Paluch
58+
* @author Mingyuan Wu
5859
*/
5960
@ExtendWith(MockitoExtension.class)
6061
@MockitoSettings(strictness = Strictness.LENIENT)
@@ -196,15 +197,15 @@ void isClosedShouldReturnConnectionStateCorrectly() {
196197
@Test // DATAREDIS-315
197198
void keysShouldOnlyBeRunOnDedicatedNodeWhenPinned() {
198199

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

201202
byte[] pattern = LettuceConverters.toBytes("*");
202203

203204
connection.keys(CLUSTER_NODE_2, pattern);
204205

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

210211
@Test // DATAREDIS-315

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

Lines changed: 25 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;
@@ -78,6 +80,7 @@
7880
* @author Chris Bono
7981
* @author John Blum
8082
* @author Zhian Chen
83+
* @author Mingyuan Wu
8184
*/
8285
class LettuceConnectionFactoryUnitTests {
8386

@@ -186,7 +189,9 @@ void passwordShouldBeSetCorrectlyOnClusterClient() {
186189
Iterable<RedisURI> initialUris = (Iterable<RedisURI>) getField(client, "initialUris");
187190

188191
for (RedisURI uri : initialUris) {
189-
assertThat(uri.getPassword()).isEqualTo(connectionFactory.getPassword().toCharArray());
192+
RedisCredentials credential = getRedisCredentials(uri);
193+
assertThat(credential).isNotNull();
194+
assertThat(credential.getPassword()).isEqualTo(connectionFactory.getPassword().toCharArray());
190195
}
191196
}
192197

@@ -257,10 +262,14 @@ void passwordShouldNotBeSetOnSentinelClient() {
257262

258263
RedisURI redisUri = (RedisURI) getField(client, "redisURI");
259264

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

262269
for (RedisURI sentinel : redisUri.getSentinels()) {
263-
assertThat(sentinel.getPassword()).isNull();
270+
RedisCredentials sentinelCredential = getRedisCredentials(sentinel);
271+
assertThat(sentinelCredential).isNotNull();
272+
assertThat(sentinelCredential.getPassword()).isNull();
264273
}
265274
}
266275

@@ -281,10 +290,14 @@ void sentinelPasswordShouldBeSetOnSentinelClient() {
281290

282291
RedisURI redisUri = (RedisURI) getField(client, "redisURI");
283292

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

286297
for (RedisURI sentinel : redisUri.getSentinels()) {
287-
assertThat(sentinel.getPassword()).isEqualTo("sentinel-pwd".toCharArray());
298+
RedisCredentials sentinelCredentials = getRedisCredentials(sentinel);
299+
assertThat(sentinelCredentials).isNotNull();
300+
assertThat(sentinelCredentials.getPassword()).isEqualTo("sentinel-pwd".toCharArray());
288301
}
289302
}
290303

@@ -338,10 +351,14 @@ void sentinelPasswordShouldNotLeakIntoDataNodeClient() {
338351

339352
RedisURI redisUri = (RedisURI) getField(client, "redisURI");
340353

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

343358
for (RedisURI sentinel : redisUri.getSentinels()) {
344-
assertThat(sentinel.getPassword()).isEqualTo("sentinel-pwd".toCharArray());
359+
RedisCredentials sentinelCredentials = getRedisCredentials(sentinel);
360+
assertThat(sentinelCredentials).isNotNull();
361+
assertThat(sentinelCredentials.getPassword()).isEqualTo("sentinel-pwd".toCharArray());
345362
}
346363
}
347364

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

12291246
RedisSentinelConfiguration expected = new RedisSentinelConfiguration();
12301247
expected.setMaster("5150");

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

Lines changed: 25 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;
@@ -52,6 +54,7 @@
5254
*
5355
* @author Christoph Strobl
5456
* @author Vikas Garg
57+
* @author Mingyuan Wu
5558
*/
5659
class LettuceConvertersUnitTests {
5760

@@ -277,12 +280,16 @@ void sentinelConfigurationWithAuth() {
277280

278281
RedisURI redisURI = LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration);
279282

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

283288
redisURI.getSentinels().forEach(sentinel -> {
284-
assertThat(sentinel.getUsername()).isEqualTo("admin");
285-
assertThat(sentinel.getPassword()).isEqualTo(sentinelPassword.get());
289+
RedisCredentials sentinelCredential = getRedisCredentials(sentinel);
290+
assertThat(sentinelCredential).isNotNull();
291+
assertThat(sentinelCredential.getUsername()).isEqualTo("admin");
292+
assertThat(sentinelCredential.getPassword()).isEqualTo(sentinelPassword.get());
286293
});
287294
}
288295

@@ -299,11 +306,15 @@ void sentinelConfigurationSetSentinelPasswordIfUsernameNotPresent() {
299306

300307
RedisURI redisURI = LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration);
301308

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

304313
redisURI.getSentinels().forEach(sentinel -> {
305-
assertThat(sentinel.getUsername()).isNull();
306-
assertThat(sentinel.getPassword()).isNotNull();
314+
RedisCredentials sentinelCredential = getRedisCredentials(sentinel);
315+
assertThat(sentinelCredential).isNotNull();
316+
assertThat(sentinelCredential.getUsername()).isNull();
317+
assertThat(sentinelCredential.getPassword()).isNotNull();
307318
});
308319
}
309320

@@ -320,11 +331,15 @@ void sentinelConfigurationShouldNotSetSentinelAuthIfUsernameIsPresentWithNoPassw
320331

321332
RedisURI redisURI = LettuceConverters.sentinelConfigurationToRedisURI(sentinelConfiguration);
322333

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

325338
redisURI.getSentinels().forEach(sentinel -> {
326-
assertThat(sentinel.getUsername()).isNull();
327-
assertThat(sentinel.getPassword()).isNull();
339+
RedisCredentials sentinelCredential = getRedisCredentials(sentinel);
340+
assertThat(sentinelCredential).isNotNull();
341+
assertThat(sentinelCredential.getUsername()).isNull();
342+
assertThat(sentinelCredential.getPassword()).isNull();
328343
});
329344
}
330345

0 commit comments

Comments
 (0)