Skip to content

Commit c02e5be

Browse files
authored
Merge branch 'master' into 5.2.0
2 parents e66f498 + 25acc8d commit c02e5be

32 files changed

+766
-57
lines changed

Diff for: .github/workflows/doctests.yml

+2
Original file line numberDiff line numberDiff line change
@@ -4,6 +4,8 @@ on:
44
push:
55
tags-ignore:
66
- '*'
7+
branches:
8+
- 'emb-examples'
79
pull_request:
810
workflow_dispatch:
911

Diff for: pom.xml

+2-2
Original file line numberDiff line numberDiff line change
@@ -67,7 +67,7 @@
6767
<dependency>
6868
<groupId>org.json</groupId>
6969
<artifactId>json</artifactId>
70-
<version>20231013</version>
70+
<version>20240205</version>
7171
</dependency>
7272
<dependency>
7373
<groupId>com.google.code.gson</groupId>
@@ -100,7 +100,7 @@
100100
<dependency>
101101
<groupId>com.kohlschutter.junixsocket</groupId>
102102
<artifactId>junixsocket-core</artifactId>
103-
<version>2.8.3</version>
103+
<version>2.9.0</version>
104104
<type>pom</type>
105105
<scope>test</scope>
106106
</dependency>

Diff for: src/main/java/redis/clients/jedis/AbstractTransaction.java

+4
Original file line numberDiff line numberDiff line change
@@ -9,6 +9,10 @@ protected AbstractTransaction() {
99
super(new CommandObjects());
1010
}
1111

12+
protected AbstractTransaction(CommandObjects commandObjects) {
13+
super(commandObjects);
14+
}
15+
1216
public abstract void multi();
1317

1418
/**

Diff for: src/main/java/redis/clients/jedis/BuilderFactory.java

+47
Original file line numberDiff line numberDiff line change
@@ -997,6 +997,53 @@ public Map<String, CommandInfo> build(Object data) {
997997
}
998998
};
999999

1000+
public static final Builder<Map<String, LatencyLatestInfo>> LATENCY_LATEST_RESPONSE = new Builder<Map<String, LatencyLatestInfo>>() {
1001+
@Override
1002+
public Map<String, LatencyLatestInfo> build(Object data) {
1003+
if (data == null) {
1004+
return null;
1005+
}
1006+
1007+
List<Object> rawList = (List<Object>) data;
1008+
Map<String, LatencyLatestInfo> map = new HashMap<>(rawList.size());
1009+
1010+
for (Object rawLatencyLatestInfo : rawList) {
1011+
if (rawLatencyLatestInfo == null) {
1012+
continue;
1013+
}
1014+
1015+
LatencyLatestInfo latestInfo = LatencyLatestInfo.LATENCY_LATEST_BUILDER.build(rawLatencyLatestInfo);
1016+
String name = latestInfo.getCommand();
1017+
map.put(name, latestInfo);
1018+
}
1019+
1020+
return map;
1021+
}
1022+
};
1023+
1024+
public static final Builder<List<LatencyHistoryInfo>> LATENCY_HISTORY_RESPONSE = new Builder<List<LatencyHistoryInfo>>() {
1025+
@Override
1026+
public List<LatencyHistoryInfo> build(Object data) {
1027+
if (data == null) {
1028+
return null;
1029+
}
1030+
1031+
List<Object> rawList = (List<Object>) data;
1032+
List<LatencyHistoryInfo> response = new ArrayList<>(rawList.size());
1033+
1034+
for (Object rawLatencyHistoryInfo : rawList) {
1035+
if (rawLatencyHistoryInfo == null) {
1036+
continue;
1037+
}
1038+
1039+
LatencyHistoryInfo historyInfo = LatencyHistoryInfo.LATENCY_HISTORY_BUILDER.build(rawLatencyHistoryInfo);
1040+
response.add(historyInfo);
1041+
}
1042+
1043+
return response;
1044+
}
1045+
};
1046+
10001047
private static final Builder<List<List<Long>>> CLUSTER_SHARD_SLOTS_RANGES = new Builder<List<List<Long>>>() {
10011048

10021049
@Override

Diff for: src/main/java/redis/clients/jedis/CommandObjects.java

+8
Original file line numberDiff line numberDiff line change
@@ -1128,6 +1128,10 @@ public final CommandObject<ScanResult<Map.Entry<String, String>>> hscan(String k
11281128
return new CommandObject<>(commandArguments(HSCAN).key(key).add(cursor).addParams(params), BuilderFactory.HSCAN_RESPONSE);
11291129
}
11301130

1131+
public final CommandObject<ScanResult<String>> hscanNoValues(String key, String cursor, ScanParams params) {
1132+
return new CommandObject<>(commandArguments(HSCAN).key(key).add(cursor).addParams(params).add(NOVALUES), BuilderFactory.SCAN_RESPONSE);
1133+
}
1134+
11311135
public final CommandObject<Long> hstrlen(String key, String field) {
11321136
return new CommandObject<>(commandArguments(HSTRLEN).key(key).add(field), BuilderFactory.LONG);
11331137
}
@@ -1136,6 +1140,10 @@ public final CommandObject<ScanResult<Map.Entry<byte[], byte[]>>> hscan(byte[] k
11361140
return new CommandObject<>(commandArguments(HSCAN).key(key).add(cursor).addParams(params), BuilderFactory.HSCAN_BINARY_RESPONSE);
11371141
}
11381142

1143+
public final CommandObject<ScanResult<byte[]>> hscanNoValues(byte[] key, byte[] cursor, ScanParams params) {
1144+
return new CommandObject<>(commandArguments(HSCAN).key(key).add(cursor).addParams(params).add(NOVALUES), BuilderFactory.SCAN_BINARY_RESPONSE);
1145+
}
1146+
11391147
public final CommandObject<Long> hstrlen(byte[] key, byte[] field) {
11401148
return new CommandObject<>(commandArguments(HSTRLEN).key(key).add(field), BuilderFactory.LONG);
11411149
}

Diff for: src/main/java/redis/clients/jedis/ConnectionFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -84,7 +84,7 @@ public boolean validateObject(PooledObject<Connection> pooledConnection) {
8484
// check HostAndPort ??
8585
return jedis.isConnected() && jedis.ping();
8686
} catch (final Exception e) {
87-
logger.error("Error while validating pooled Connection object.", e);
87+
logger.warn("Error while validating pooled Connection object.", e);
8888
return false;
8989
}
9090
}

Diff for: src/main/java/redis/clients/jedis/Jedis.java

+33-5
Original file line numberDiff line numberDiff line change
@@ -14,6 +14,7 @@
1414
import java.util.Map.Entry;
1515
import java.util.Set;
1616
import java.util.stream.Collectors;
17+
import java.util.Arrays;
1718

1819
import javax.net.ssl.HostnameVerifier;
1920
import javax.net.ssl.SSLParameters;
@@ -4412,18 +4413,19 @@ public ScanResult<byte[]> scan(final byte[] cursor, final ScanParams params, fin
44124413
return connection.executeCommand(commandObjects.scan(cursor, params, type));
44134414
}
44144415

4415-
@Override
4416-
public ScanResult<Map.Entry<byte[], byte[]>> hscan(final byte[] key, final byte[] cursor) {
4417-
return hscan(key, cursor, new ScanParams());
4418-
}
4419-
44204416
@Override
44214417
public ScanResult<Map.Entry<byte[], byte[]>> hscan(final byte[] key, final byte[] cursor,
44224418
final ScanParams params) {
44234419
checkIsInMultiOrPipeline();
44244420
return connection.executeCommand(commandObjects.hscan(key, cursor, params));
44254421
}
44264422

4423+
@Override
4424+
public ScanResult<byte[]> hscanNoValues(final byte[] key, final byte[] cursor, final ScanParams params) {
4425+
checkIsInMultiOrPipeline();
4426+
return connection.executeCommand(commandObjects.hscanNoValues(key, cursor, params));
4427+
}
4428+
44274429
@Override
44284430
public ScanResult<byte[]> sscan(final byte[] key, final byte[] cursor) {
44294431
return sscan(key, cursor, new ScanParams());
@@ -8616,6 +8618,12 @@ public ScanResult<Map.Entry<String, String>> hscan(final String key, final Strin
86168618
return connection.executeCommand(commandObjects.hscan(key, cursor, params));
86178619
}
86188620

8621+
@Override
8622+
public ScanResult<String> hscanNoValues(final String key, final String cursor, final ScanParams params) {
8623+
checkIsInMultiOrPipeline();
8624+
return connection.executeCommand(commandObjects.hscanNoValues(key, cursor, params));
8625+
}
8626+
86198627
@Override
86208628
public ScanResult<String> sscan(final String key, final String cursor, final ScanParams params) {
86218629
checkIsInMultiOrPipeline();
@@ -9280,6 +9288,26 @@ public String latencyDoctor() {
92809288
return connection.getBulkReply();
92819289
}
92829290

9291+
public Map<String, LatencyLatestInfo> latencyLatest() {
9292+
checkIsInMultiOrPipeline();
9293+
connection.sendCommand(LATENCY, LATEST);
9294+
return BuilderFactory.LATENCY_LATEST_RESPONSE.build(connection.getOne());
9295+
}
9296+
9297+
public List<LatencyHistoryInfo> latencyHistory(LatencyEvent event) {
9298+
checkIsInMultiOrPipeline();
9299+
connection.sendCommand(new CommandArguments(LATENCY).add(HISTORY).add(event));
9300+
return BuilderFactory.LATENCY_HISTORY_RESPONSE.build(connection.getOne());
9301+
}
9302+
9303+
public long latencyReset(LatencyEvent... events) {
9304+
checkIsInMultiOrPipeline();
9305+
CommandArguments arguments = new CommandArguments(LATENCY).add(Keyword.RESET);
9306+
Arrays.stream(events).forEach(arguments::add);
9307+
connection.sendCommand(arguments);
9308+
return connection.getIntegerReply();
9309+
}
9310+
92839311
@Override
92849312
public StreamEntryID xadd(final String key, final StreamEntryID id, final Map<String, String> hash) {
92859313
checkIsInMultiOrPipeline();

Diff for: src/main/java/redis/clients/jedis/JedisFactory.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -197,7 +197,7 @@ public boolean validateObject(PooledObject<Jedis> pooledJedis) {
197197
&& jedis.getConnection().isConnected()
198198
&& jedis.ping().equals("PONG");
199199
} catch (final Exception e) {
200-
logger.error("Error while validating pooled Jedis object.", e);
200+
logger.warn("Error while validating pooled Jedis object.", e);
201201
return false;
202202
}
203203
}

Diff for: src/main/java/redis/clients/jedis/JedisPubSubBase.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -172,7 +172,7 @@ private void process() {
172172
} else {
173173
throw new JedisException("Unknown message type: " + reply);
174174
}
175-
} while (isSubscribed());
175+
} while (!Thread.currentThread().isInterrupted() && isSubscribed());
176176

177177
// /* Invalidate instance since this thread is no longer listening */
178178
// this.client = null;

Diff for: src/main/java/redis/clients/jedis/JedisShardedPubSubBase.java

+1-1
Original file line numberDiff line numberDiff line change
@@ -99,7 +99,7 @@ private void process() {
9999
} else {
100100
throw new JedisException("Unknown message type: " + reply);
101101
}
102-
} while (isSubscribed());
102+
} while (!Thread.currentThread().isInterrupted() && isSubscribed());
103103

104104
// /* Invalidate instance since this thread is no longer listening */
105105
// this.client = null;

Diff for: src/main/java/redis/clients/jedis/MultiClusterClientConfig.java

+1-2
Original file line numberDiff line numberDiff line change
@@ -40,8 +40,7 @@ public final class MultiClusterClientConfig {
4040
private static final float CIRCUIT_BREAKER_SLOW_CALL_RATE_THRESHOLD_DEFAULT = 100.0f; // measured as percentage
4141
private static final List<Class> CIRCUIT_BREAKER_INCLUDED_EXCEPTIONS_DEFAULT = Arrays.asList(JedisConnectionException.class);
4242

43-
private static final List<Class<? extends Throwable>> FALLBACK_EXCEPTIONS_DEFAULT =
44-
Arrays.asList(CallNotPermittedException.class, JedisConnectionException.class);
43+
private static final List<Class<? extends Throwable>> FALLBACK_EXCEPTIONS_DEFAULT = Arrays.asList(CallNotPermittedException.class);
4544

4645
private final ClusterConfig[] clusterConfigs;
4746

Diff for: src/main/java/redis/clients/jedis/MultiNodePipelineBase.java

+3-3
Original file line numberDiff line numberDiff line change
@@ -63,16 +63,16 @@ protected final <T> Response<T> appendCommand(CommandObject<T> commandObject) {
6363
queue = pipelinedResponses.get(nodeKey);
6464
connection = connections.get(nodeKey);
6565
} else {
66-
pipelinedResponses.putIfAbsent(nodeKey, new LinkedList<>());
67-
queue = pipelinedResponses.get(nodeKey);
68-
6966
Connection newOne = getConnection(nodeKey);
7067
connections.putIfAbsent(nodeKey, newOne);
7168
connection = connections.get(nodeKey);
7269
if (connection != newOne) {
7370
log.debug("Duplicate connection to {}, closing it.", nodeKey);
7471
IOUtils.closeQuietly(newOne);
7572
}
73+
74+
pipelinedResponses.putIfAbsent(nodeKey, new LinkedList<>());
75+
queue = pipelinedResponses.get(nodeKey);
7676
}
7777

7878
connection.sendCommand(commandObject.getArguments());

Diff for: src/main/java/redis/clients/jedis/PipeliningBase.java

+10
Original file line numberDiff line numberDiff line change
@@ -706,6 +706,11 @@ public Response<ScanResult<Map.Entry<String, String>>> hscan(String key, String
706706
return appendCommand(commandObjects.hscan(key, cursor, params));
707707
}
708708

709+
@Override
710+
public Response<ScanResult<String>> hscanNoValues(String key, String cursor, ScanParams params) {
711+
return appendCommand(commandObjects.hscanNoValues(key, cursor, params));
712+
}
713+
709714
@Override
710715
public Response<Long> hstrlen(String key, String field) {
711716
return appendCommand(commandObjects.hstrlen(key, field));
@@ -1972,6 +1977,11 @@ public Response<ScanResult<Map.Entry<byte[], byte[]>>> hscan(byte[] key, byte[]
19721977
return appendCommand(commandObjects.hscan(key, cursor, params));
19731978
}
19741979

1980+
@Override
1981+
public Response<ScanResult<byte[]>> hscanNoValues(byte[] key, byte[] cursor, ScanParams params) {
1982+
return appendCommand(commandObjects.hscanNoValues(key, cursor, params));
1983+
}
1984+
19751985
@Override
19761986
public Response<Long> hstrlen(byte[] key, byte[] field) {
19771987
return appendCommand(commandObjects.hstrlen(key, field));

Diff for: src/main/java/redis/clients/jedis/Protocol.java

+2-2
Original file line numberDiff line numberDiff line change
@@ -330,9 +330,9 @@ public static enum Keyword implements Rawable {
330330
REV, WITHCOORD, WITHDIST, WITHHASH, ANY, FROMMEMBER, FROMLONLAT, BYRADIUS, BYBOX, BYLEX, BYSCORE,
331331
STOREDIST, TO, FORCE, TIMEOUT, DB, UNLOAD, ABORT, IDX, MINMATCHLEN, WITHMATCHLEN, FULL,
332332
DELETE, LIBRARYNAME, WITHCODE, DESCRIPTION, GETKEYS, GETKEYSANDFLAGS, DOCS, FILTERBY, DUMP,
333-
MODULE, ACLCAT, PATTERN, DOCTOR, USAGE, SAMPLES, PURGE, STATS, LOADEX, CONFIG, ARGS, RANK,
333+
MODULE, ACLCAT, PATTERN, DOCTOR, LATEST, HISTORY, USAGE, SAMPLES, PURGE, STATS, LOADEX, CONFIG, ARGS, RANK,
334334
NOW, VERSION, ADDR, SKIPME, USER, LADDR,
335-
CHANNELS, NUMPAT, NUMSUB, SHARDCHANNELS, SHARDNUMSUB;
335+
CHANNELS, NUMPAT, NUMSUB, SHARDCHANNELS, SHARDNUMSUB, NOVALUES;
336336

337337
private final byte[] raw;
338338

Diff for: src/main/java/redis/clients/jedis/TransactionBase.java

+4
Original file line numberDiff line numberDiff line change
@@ -9,4 +9,8 @@ public abstract class TransactionBase extends AbstractTransaction {
99
protected TransactionBase() {
1010
super();
1111
}
12+
13+
protected TransactionBase(CommandObjects commandObjects) {
14+
super(commandObjects);
15+
}
1216
}

Diff for: src/main/java/redis/clients/jedis/UnifiedJedis.java

+12-2
Original file line numberDiff line numberDiff line change
@@ -1584,6 +1584,11 @@ public ScanResult<Map.Entry<String, String>> hscan(String key, String cursor, Sc
15841584
return executeCommand(commandObjects.hscan(key, cursor, params));
15851585
}
15861586

1587+
@Override
1588+
public ScanResult<String> hscanNoValues(String key, String cursor, ScanParams params) {
1589+
return executeCommand(commandObjects.hscanNoValues(key, cursor, params));
1590+
}
1591+
15871592
@Override
15881593
public long hstrlen(String key, String field) {
15891594
return checkAndClientSideCacheCommand(commandObjects.hstrlen(key, field), key);
@@ -1609,6 +1614,11 @@ public ScanResult<Map.Entry<byte[], byte[]>> hscan(byte[] key, byte[] cursor, Sc
16091614
return executeCommand(commandObjects.hscan(key, cursor, params));
16101615
}
16111616

1617+
@Override
1618+
public ScanResult<byte[]> hscanNoValues(byte[] key, byte[] cursor, ScanParams params) {
1619+
return executeCommand(commandObjects.hscanNoValues(key, cursor, params));
1620+
}
1621+
16121622
@Override
16131623
public long hstrlen(byte[] key, byte[] field) {
16141624
return checkAndClientSideCacheCommand(commandObjects.hstrlen(key, field), key);
@@ -4874,7 +4884,7 @@ public PipelineBase pipelined() {
48744884
if (provider == null) {
48754885
throw new IllegalStateException("It is not allowed to create Pipeline from this " + getClass());
48764886
} else if (provider instanceof MultiClusterPooledConnectionProvider) {
4877-
return new MultiClusterPipeline((MultiClusterPooledConnectionProvider) provider);
4887+
return new MultiClusterPipeline((MultiClusterPooledConnectionProvider) provider, commandObjects);
48784888
} else {
48794889
return new Pipeline(provider.getConnection(), true);
48804890
}
@@ -4884,7 +4894,7 @@ public AbstractTransaction multi() {
48844894
if (provider == null) {
48854895
throw new IllegalStateException("It is not allowed to create Pipeline from this " + getClass());
48864896
} else if (provider instanceof MultiClusterPooledConnectionProvider) {
4887-
return new MultiClusterTransaction((MultiClusterPooledConnectionProvider) provider);
4897+
return new MultiClusterTransaction((MultiClusterPooledConnectionProvider) provider, true, commandObjects);
48884898
} else {
48894899
return new Transaction(provider.getConnection(), true, true);
48904900
}
+24
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,24 @@
1+
package redis.clients.jedis.args;
2+
3+
import redis.clients.jedis.util.SafeEncoder;
4+
5+
public enum LatencyEvent implements Rawable {
6+
7+
ACTIVE_DEFRAG_CYCLE("active-defrag-cycle"), AOF_FSYNC_ALWAYS("aof-fsync-always"), AOF_STAT("aof-stat"),
8+
AOF_REWRITE_DIFF_WRITE("aof-rewrite-diff-write"), AOF_RENAME("aof-rename"), AOF_WRITE("aof-write"),
9+
AOF_WRITE_ACTIVE_CHILD("aof-write-active-child"), AOF_WRITE_ALONE("aof-write-alone"),
10+
AOF_WRITE_PENDING_FSYNC("aof-write-pending-fsync"), COMMAND("command"), EXPIRE_CYCLE("expire-cycle"),
11+
EVICTION_CYCLE("eviction-cycle"), EVICTION_DEL("eviction-del"), FAST_COMMAND("fast-command"),
12+
FORK("fork"), RDB_UNLINK_TEMP_FILE("rdb-unlink-temp-file");
13+
14+
private final byte[] raw;
15+
16+
private LatencyEvent(String s) {
17+
raw = SafeEncoder.encode(s);
18+
}
19+
20+
@Override
21+
public byte[] getRaw() {
22+
return raw;
23+
}
24+
}

Diff for: src/main/java/redis/clients/jedis/commands/HashBinaryCommands.java

+6
Original file line numberDiff line numberDiff line change
@@ -49,6 +49,12 @@ default ScanResult<Map.Entry<byte[], byte[]>> hscan(byte[] key, byte[] cursor) {
4949

5050
ScanResult<Map.Entry<byte[], byte[]>> hscan(byte[] key, byte[] cursor, ScanParams params);
5151

52+
default ScanResult<byte[]> hscanNoValues(byte[] key, byte[] cursor) {
53+
return hscanNoValues(key, cursor, new ScanParams());
54+
}
55+
56+
ScanResult<byte[]> hscanNoValues(byte[] key, byte[] cursor, ScanParams params);
57+
5258
long hstrlen(byte[] key, byte[] field);
5359

5460
}

Diff for: src/main/java/redis/clients/jedis/commands/HashCommands.java

+6
Original file line numberDiff line numberDiff line change
@@ -49,5 +49,11 @@ default ScanResult<Map.Entry<String, String>> hscan(String key, String cursor) {
4949

5050
ScanResult<Map.Entry<String, String>> hscan(String key, String cursor, ScanParams params);
5151

52+
default ScanResult<String> hscanNoValues(String key, String cursor) {
53+
return hscanNoValues(key, cursor, new ScanParams());
54+
}
55+
56+
ScanResult<String> hscanNoValues(String key, String cursor, ScanParams params);
57+
5258
long hstrlen(String key, String field);
5359
}

0 commit comments

Comments
 (0)