Skip to content

Commit a944aa2

Browse files
mp911dechristophstrobl
authored andcommitted
Upgrade to Jedis 3.7.
Enable support for SCAN with type, call appropriate shutdown methods with save/nosave flags. Closes: #2153 Original Pull Request: #2154
1 parent 99053cf commit a944aa2

File tree

6 files changed

+44
-46
lines changed

6 files changed

+44
-46
lines changed

pom.xml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -23,7 +23,7 @@
2323
<xstream>1.4.18</xstream>
2424
<pool>2.9.0</pool>
2525
<lettuce>6.1.4.RELEASE</lettuce>
26-
<jedis>3.6.3</jedis>
26+
<jedis>3.7.0</jedis>
2727
<multithreadedtc>1.01</multithreadedtc>
2828
<netty>4.1.65.Final</netty>
2929
<java-module-name>spring.data.redis</java-module-name>

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

Lines changed: 21 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -18,8 +18,10 @@
1818
import redis.clients.jedis.BinaryJedis;
1919
import redis.clients.jedis.MultiKeyPipelineBase;
2020
import redis.clients.jedis.ScanParams;
21+
import redis.clients.jedis.ScanResult;
2122
import redis.clients.jedis.SortingParams;
2223

24+
import java.nio.charset.StandardCharsets;
2325
import java.time.Duration;
2426
import java.util.List;
2527
import java.util.Set;
@@ -38,6 +40,7 @@
3840
import org.springframework.data.redis.core.ScanOptions;
3941
import org.springframework.lang.Nullable;
4042
import org.springframework.util.Assert;
43+
import org.springframework.util.ObjectUtils;
4144

4245
/**
4346
* @author Christoph Strobl
@@ -172,10 +175,6 @@ public Cursor<byte[]> scan(ScanOptions options) {
172175
*/
173176
public Cursor<byte[]> scan(long cursorId, ScanOptions options) {
174177

175-
if (options instanceof KeyScanOptions && ((KeyScanOptions) options).getType() != null) {
176-
throw new UnsupportedOperationException("'SCAN' with type is not yet supported using the Jedis driver");
177-
}
178-
179178
return new ScanCursor<byte[]>(cursorId, options) {
180179

181180
@Override
@@ -186,8 +185,25 @@ protected ScanIteration<byte[]> doScan(long cursorId, ScanOptions options) {
186185
}
187186

188187
ScanParams params = JedisConverters.toScanParams(options);
189-
redis.clients.jedis.ScanResult<byte[]> result = connection.getJedis().scan(Long.toString(cursorId).getBytes(),
188+
189+
ScanResult<byte[]> result;
190+
byte[] type = null;
191+
192+
if (options instanceof KeyScanOptions) {
193+
String typeAsString = ((KeyScanOptions) options).getType();
194+
195+
if (!ObjectUtils.isEmpty(typeAsString)) {
196+
type = typeAsString.getBytes(StandardCharsets.US_ASCII);
197+
}
198+
}
199+
200+
if (type != null) {
201+
result = connection.getJedis().scan(Long.toString(cursorId).getBytes(), params, type);
202+
} else {
203+
result = connection.getJedis().scan(Long.toString(cursorId).getBytes(),
190204
params);
205+
}
206+
191207
return new ScanIteration<>(Long.parseLong(result.getCursor()),
192208
result.getResult());
193209
}

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

Lines changed: 4 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -18,14 +18,14 @@
1818
import redis.clients.jedis.BinaryJedis;
1919
import redis.clients.jedis.Jedis;
2020
import redis.clients.jedis.MultiKeyPipelineBase;
21+
import redis.clients.jedis.args.SaveMode;
2122

2223
import java.util.List;
2324
import java.util.Properties;
2425
import java.util.concurrent.TimeUnit;
2526

2627
import org.springframework.data.redis.connection.RedisNode;
2728
import org.springframework.data.redis.connection.RedisServerCommands;
28-
import org.springframework.data.redis.connection.ReturnType;
2929
import org.springframework.data.redis.connection.convert.Converters;
3030
import org.springframework.data.redis.core.types.RedisClientInfo;
3131
import org.springframework.lang.Nullable;
@@ -151,7 +151,9 @@ public void shutdown(ShutdownOption option) {
151151
return;
152152
}
153153

154-
connection.eval(String.format(SHUTDOWN_SCRIPT, option.name()).getBytes(), ReturnType.STATUS, 0);
154+
SaveMode saveMode = (option == ShutdownOption.NOSAVE) ? SaveMode.NOSAVE : SaveMode.SAVE;
155+
156+
connection.getJedis().shutdown(saveMode);
155157
}
156158

157159
/*

src/test/java/org/springframework/data/redis/connection/AbstractConnectionIntegrationTests.java

Lines changed: 1 addition & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -2600,8 +2600,7 @@ void scanShouldReadEntireValueRange() {
26002600
assertThat(i).isEqualTo(itemCount);
26012601
}
26022602

2603-
@Test // GH-2089
2604-
@EnabledOnRedisDriver(RedisDriver.LETTUCE)
2603+
@Test // GH-2089, GH-2153
26052604
@EnabledOnRedisVersion("6.0")
26062605
void scanWithType() {
26072606

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

Lines changed: 0 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -61,9 +61,6 @@ public void tearDown() {
6161
connection = null;
6262
}
6363

64-
@Disabled("Jedis issue: Pipeline tries to return String instead of List<String>")
65-
public void testGetConfig() {}
66-
6764
@Test
6865
public void testWatch() {
6966
connection.set("testitnow", "willdo");

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

Lines changed: 17 additions & 33 deletions
Original file line numberDiff line numberDiff line change
@@ -22,6 +22,8 @@
2222
import redis.clients.jedis.Jedis;
2323
import redis.clients.jedis.ScanParams;
2424
import redis.clients.jedis.ScanResult;
25+
import redis.clients.jedis.args.SaveMode;
26+
import redis.clients.jedis.exceptions.JedisException;
2527

2628
import java.io.IOException;
2729
import java.util.Collections;
@@ -30,8 +32,8 @@
3032
import org.junit.jupiter.api.BeforeEach;
3133
import org.junit.jupiter.api.Nested;
3234
import org.junit.jupiter.api.Test;
33-
import org.mockito.ArgumentCaptor;
3435

36+
import org.springframework.dao.InvalidDataAccessApiUsageException;
3537
import org.springframework.dao.InvalidDataAccessResourceUsageException;
3638
import org.springframework.data.redis.connection.AbstractConnectionUnitTestBase;
3739
import org.springframework.data.redis.connection.RedisServerCommands.ShutdownOption;
@@ -58,34 +60,32 @@ public void setUp() {
5860
connection = new JedisConnection(jedisSpy);
5961
}
6062

61-
@Test // DATAREDIS-184
63+
@Test // DATAREDIS-184, GH-2153
6264
void shutdownWithNullShouldDelegateCommandCorrectly() {
6365

64-
connection.shutdown(null);
66+
try {
67+
connection.shutdown(null);
68+
} catch (InvalidDataAccessApiUsageException e) {
69+
// all good. Sometimes it throws an Exception.
70+
}
6571

6672
verifyNativeConnectionInvocation().shutdown();
6773
}
6874

69-
@Test // DATAREDIS-184
70-
public void shutdownNosaveShouldBeSentCorrectlyUsingLuaScript() {
75+
@Test // DATAREDIS-184, GH-2153
76+
void shutdownNosaveShouldBeSentCorrectly() {
7177

72-
connection.shutdown(ShutdownOption.NOSAVE);
78+
assertThatExceptionOfType(JedisException.class).isThrownBy(() -> connection.shutdown(ShutdownOption.NOSAVE));
7379

74-
ArgumentCaptor<byte[]> captor = ArgumentCaptor.forClass(byte[].class);
75-
verifyNativeConnectionInvocation().eval(captor.capture(), any(byte[].class), any(byte[][].class));
76-
77-
assertThat(captor.getValue()).isEqualTo("return redis.call('SHUTDOWN','NOSAVE')".getBytes());
80+
verifyNativeConnectionInvocation().shutdown(SaveMode.NOSAVE);
7881
}
7982

80-
@Test // DATAREDIS-184
81-
public void shutdownSaveShouldBeSentCorrectlyUsingLuaScript() {
82-
83-
connection.shutdown(ShutdownOption.SAVE);
83+
@Test // DATAREDIS-184, GH-2153
84+
void shutdownSaveShouldBeSentCorrectly() {
8485

85-
ArgumentCaptor<byte[]> captor = ArgumentCaptor.forClass(byte[].class);
86-
verifyNativeConnectionInvocation().eval(captor.capture(), any(byte[].class), any(byte[][].class));
86+
assertThatExceptionOfType(JedisException.class).isThrownBy(() -> connection.shutdown(ShutdownOption.SAVE));
8787

88-
assertThat(captor.getValue()).isEqualTo("return redis.call('SHUTDOWN','SAVE')".getBytes());
88+
verifyNativeConnectionInvocation().shutdown(SaveMode.SAVE);
8989
}
9090

9191
@Test // DATAREDIS-267
@@ -279,22 +279,6 @@ public void setUp() {
279279
connection.openPipeline();
280280
}
281281

282-
@Test
283-
@Override
284-
// DATAREDIS-184
285-
public void shutdownNosaveShouldBeSentCorrectlyUsingLuaScript() {
286-
assertThatExceptionOfType(UnsupportedOperationException.class)
287-
.isThrownBy(() -> super.shutdownNosaveShouldBeSentCorrectlyUsingLuaScript());
288-
}
289-
290-
@Test
291-
@Override
292-
// DATAREDIS-184
293-
public void shutdownSaveShouldBeSentCorrectlyUsingLuaScript() {
294-
assertThatExceptionOfType(UnsupportedOperationException.class)
295-
.isThrownBy(() -> super.shutdownSaveShouldBeSentCorrectlyUsingLuaScript());
296-
}
297-
298282
@Test // DATAREDIS-267
299283
public void killClientShouldDelegateCallCorrectly() {
300284
assertThatExceptionOfType(UnsupportedOperationException.class)

0 commit comments

Comments
 (0)