Skip to content

Commit 8317caa

Browse files
chore: remove deprecated default timeout from AbstractRedisClient (#3328) (#3344)
* chore: remove deprecated AbstractRedisClient#getDefaultTimeout - remove usages from RedisClient and replaced with timeout value from redisUri - fixed failing tests in RedisClientConnectIntegrationTests by asserting timeout to be equal to default timeout from RedisURI - refactored DefaultRedisClient test fixture to not set timeout Signed-off-by: The-East-Wind <[email protected]> * chore: remove deprecated default timeout from AbstractRedisClient - refactor AtLeastOnce and AtMostOnce IntegrationTests to remove setting timeout on the client level and instead set it in the URI level - removed default timeout and usages which set it from AbstractRedisClient, RedisClient and RedisClusterClient Signed-off-by: The-East-Wind <[email protected]> * docs: update relevant documentation to remove usage of RedisClient#setDefaultTimeout Signed-off-by: The-East-Wind <[email protected]> --------- Signed-off-by: The-East-Wind <[email protected]>
1 parent 923e698 commit 8317caa

File tree

10 files changed

+81
-116
lines changed

10 files changed

+81
-116
lines changed

docs/user-guide/connecting-redis.md

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -195,8 +195,8 @@ the error message. `RedisException` is a `RuntimeException`.
195195
### Examples
196196

197197
``` java
198-
RedisClient client = RedisClient.create(RedisURI.create("localhost", 6379));
199-
client.setDefaultTimeout(20, TimeUnit.SECONDS);
198+
RedisURI uri = new RedisURI("localhost", 6379, Duration.ofSeconds(20));
199+
RedisClient client = RedisClient.create(uri);
200200

201201
//
202202

src/main/java/io/lettuce/core/AbstractRedisClient.java

Lines changed: 0 additions & 43 deletions
Original file line numberDiff line numberDiff line change
@@ -109,8 +109,6 @@ public abstract class AbstractRedisClient implements AutoCloseable {
109109

110110
private volatile ClientOptions clientOptions = ClientOptions.create();
111111

112-
private volatile Duration defaultTimeout = RedisURI.DEFAULT_TIMEOUT_DURATION;
113-
114112
/**
115113
* Create a new instance with client resources.
116114
*
@@ -134,47 +132,6 @@ protected int getChannelCount() {
134132
return channels.size();
135133
}
136134

137-
/**
138-
* Returns the default {@link Duration timeout} for commands.
139-
*
140-
* @return the default {@link Duration timeout} for commands.
141-
* @deprecated since 6.2, use {@link RedisURI#getTimeout()} to control timeouts.
142-
*/
143-
@Deprecated
144-
public Duration getDefaultTimeout() {
145-
return defaultTimeout;
146-
}
147-
148-
/**
149-
* Set the default timeout for connections created by this client. The timeout applies to connection attempts and
150-
* non-blocking commands.
151-
*
152-
* @param timeout default connection timeout, must not be {@code null}.
153-
* @since 5.0
154-
* @deprecated since 6.2, use {@link RedisURI#getTimeout()} to control timeouts.
155-
*/
156-
@Deprecated
157-
public void setDefaultTimeout(Duration timeout) {
158-
159-
LettuceAssert.notNull(timeout, "Timeout duration must not be null");
160-
LettuceAssert.isTrue(!timeout.isNegative(), "Timeout duration must be greater or equal to zero");
161-
162-
this.defaultTimeout = timeout;
163-
}
164-
165-
/**
166-
* Set the default timeout for connections created by this client. The timeout applies to connection attempts and
167-
* non-blocking commands.
168-
*
169-
* @param timeout Default connection timeout.
170-
* @param unit Unit of time for the timeout.
171-
* @deprecated since 6.2, use {@link RedisURI#getTimeout()} to control timeouts.
172-
*/
173-
@Deprecated
174-
public void setDefaultTimeout(long timeout, TimeUnit unit) {
175-
setDefaultTimeout(Duration.ofNanos(unit.toNanos(timeout)));
176-
}
177-
178135
/**
179136
* Returns the {@link ClientOptions} which are valid for that client. Connections inherit the current options at the moment
180137
* the connection is created. Changes to options will not affect existing connections.

src/main/java/io/lettuce/core/RedisClient.java

Lines changed: 4 additions & 5 deletions
Original file line numberDiff line numberDiff line change
@@ -105,7 +105,6 @@ protected RedisClient(ClientResources clientResources, RedisURI redisURI) {
105105
assertNotNull(redisURI);
106106

107107
this.redisURI = redisURI;
108-
setDefaultTimeout(redisURI.getTimeout());
109108
}
110109

111110
/**
@@ -217,7 +216,7 @@ public <K, V> StatefulRedisConnection<K, V> connect(RedisCodec<K, V> codec) {
217216

218217
checkForRedisURI();
219218

220-
return getConnection(connectStandaloneAsync(codec, this.redisURI, getDefaultTimeout()));
219+
return getConnection(connectStandaloneAsync(codec, this.redisURI, this.redisURI.getTimeout()));
221220
}
222221

223222
/**
@@ -339,7 +338,7 @@ private <K, V, S> ConnectionFuture<S> connectStatefulAsync(StatefulRedisConnecti
339338
* @return A new stateful pub/sub connection
340339
*/
341340
public StatefulRedisPubSubConnection<String, String> connectPubSub() {
342-
return getConnection(connectPubSubAsync(newStringStringCodec(), this.redisURI, getDefaultTimeout()));
341+
return getConnection(connectPubSubAsync(newStringStringCodec(), this.redisURI, this.redisURI.getTimeout()));
343342
}
344343

345344
/**
@@ -366,7 +365,7 @@ public StatefulRedisPubSubConnection<String, String> connectPubSub(RedisURI redi
366365
*/
367366
public <K, V> StatefulRedisPubSubConnection<K, V> connectPubSub(RedisCodec<K, V> codec) {
368367
checkForRedisURI();
369-
return getConnection(connectPubSubAsync(codec, this.redisURI, getDefaultTimeout()));
368+
return getConnection(connectPubSubAsync(codec, this.redisURI, this.redisURI.getTimeout()));
370369
}
371370

372371
/**
@@ -453,7 +452,7 @@ public StatefulRedisSentinelConnection<String, String> connectSentinel() {
453452
*/
454453
public <K, V> StatefulRedisSentinelConnection<K, V> connectSentinel(RedisCodec<K, V> codec) {
455454
checkForRedisURI();
456-
return getConnection(connectSentinelAsync(codec, this.redisURI, getDefaultTimeout()));
455+
return getConnection(connectSentinelAsync(codec, this.redisURI, this.redisURI.getTimeout()));
457456
}
458457

459458
/**

src/main/java/io/lettuce/core/cluster/RedisClusterClient.java

Lines changed: 0 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -198,7 +198,6 @@ protected RedisClusterClient(ClientResources clientResources, Iterable<RedisURI>
198198
this.initialUris = Collections.unmodifiableList(LettuceLists.newList(redisURIs));
199199
this.refresh = createTopologyRefresh();
200200

201-
setDefaultTimeout(getFirstUri().getTimeout());
202201
setOptions(ClusterClientOptions.create());
203202
}
204203

src/main/javadoc/overview.html

Lines changed: 2 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -27,10 +27,10 @@
2727
</p>
2828

2929
<p>
30-
All connections inherit a default timeout from their {@link io.lettuce.core.RedisClient}
30+
All connections inherit a default timeout from their {@link io.lettuce.core.RedisURI}
3131
and will throw a {@link io.lettuce.core.RedisException} when non-blocking commands fail
3232
to return a result before the timeout expires. The timeout defaults to 60 seconds and
33-
may be changed via {@link io.lettuce.core.RedisClient#setDefaultTimeout} or for
33+
may be changed via {@link io.lettuce.core.RedisURI#setTimeout} or for
3434
each individual connection.
3535
</p>
3636
</body>

src/test/java/io/lettuce/core/RedisClientConnectIntegrationTests.java

Lines changed: 24 additions & 31 deletions
Original file line numberDiff line numberDiff line change
@@ -33,7 +33,6 @@
3333
import javax.inject.Inject;
3434

3535
import io.lettuce.core.protocol.ProtocolVersion;
36-
import org.junit.jupiter.api.BeforeEach;
3736
import org.junit.jupiter.api.Disabled;
3837
import org.junit.jupiter.api.Tag;
3938
import org.junit.jupiter.api.Test;
@@ -48,40 +47,34 @@
4847
/**
4948
* @author Mark Paluch
5049
* @author Jongyeol Choi
50+
* @author Hari Mani
5151
*/
5252
@ExtendWith(LettuceExtension.class)
5353
@Tag(INTEGRATION_TEST)
5454
class RedisClientConnectIntegrationTests extends TestSupport {
5555

56-
private static final Duration EXPECTED_TIMEOUT = Duration.ofMillis(500);
57-
5856
private final RedisClient client;
5957

6058
@Inject
6159
RedisClientConnectIntegrationTests(RedisClient client) {
6260
this.client = client;
6361
}
6462

65-
@BeforeEach
66-
void before() {
67-
client.setDefaultTimeout(EXPECTED_TIMEOUT);
68-
}
69-
7063
/*
7164
* Standalone/Stateful
7265
*/
7366
@Test
7467
void connectClientUri() {
7568

7669
StatefulRedisConnection<String, String> connection = client.connect();
77-
assertThat(connection.getTimeout()).isEqualTo(EXPECTED_TIMEOUT);
70+
assertThat(connection.getTimeout()).isEqualTo(RedisURI.DEFAULT_TIMEOUT_DURATION);
7871
connection.close();
7972
}
8073

8174
@Test
8275
void connectCodecClientUri() {
8376
StatefulRedisConnection<String, String> connection = client.connect(UTF8);
84-
assertThat(connection.getTimeout()).isEqualTo(EXPECTED_TIMEOUT);
77+
assertThat(connection.getTimeout()).isEqualTo(RedisURI.DEFAULT_TIMEOUT_DURATION);
8578
connection.close();
8679
}
8780

@@ -133,29 +126,29 @@ void connectcodecSentinelMissingHostAndSocketUri() {
133126
@Test
134127
@Disabled("Non-deterministic behavior. Can cause a deadlock")
135128
void shutdownSyncInRedisFutureTest() {
136-
137-
RedisClient redisClient = RedisClient.create();
138-
StatefulRedisConnection<String, String> connection = redisClient.connect(redis(host, port).build());
139-
140-
CompletableFuture<String> f = connection.async().get("key1").whenComplete((result, e) -> {
141-
connection.close();
142-
redisClient.shutdown(0, 0, SECONDS); // deadlock expected.
143-
}).toCompletableFuture();
144-
145-
assertThatThrownBy(() -> TestFutures.awaitOrTimeout(f)).isInstanceOf(TimeoutException.class);
129+
try (final RedisClient redisClient = RedisClient.create();
130+
final StatefulRedisConnection<String, String> connection = redisClient.connect(redis(host, port).build())) {
131+
CompletableFuture<String> f = connection.async().get("key1").whenComplete((result, e) -> {
132+
connection.close();
133+
redisClient.shutdown(0, 0, SECONDS); // deadlock expected.
134+
}).toCompletableFuture();
135+
136+
assertThatThrownBy(() -> TestFutures.awaitOrTimeout(f)).isInstanceOf(TimeoutException.class);
137+
}
146138
}
147139

148140
@Test
149141
void shutdownAsyncInRedisFutureTest() {
150142

151-
RedisClient redisClient = RedisClient.create();
152-
StatefulRedisConnection<String, String> connection = redisClient.connect(redis(host, port).build());
153-
CompletableFuture<Void> f = connection.async().get("key1").thenCompose(result -> {
154-
connection.close();
155-
return redisClient.shutdownAsync(0, 0, SECONDS);
156-
}).toCompletableFuture();
143+
try (final RedisClient redisClient = RedisClient.create();
144+
final StatefulRedisConnection<String, String> connection = redisClient.connect(redis(host, port).build())) {
145+
CompletableFuture<Void> f = connection.async().get("key1").thenCompose(result -> {
146+
connection.close();
147+
return redisClient.shutdownAsync(0, 0, SECONDS);
148+
}).toCompletableFuture();
157149

158-
TestFutures.awaitOrTimeout(f);
150+
TestFutures.awaitOrTimeout(f);
151+
}
159152
}
160153

161154
/*
@@ -164,14 +157,14 @@ void shutdownAsyncInRedisFutureTest() {
164157
@Test
165158
void connectPubSubClientUri() {
166159
StatefulRedisPubSubConnection<String, String> connection = client.connectPubSub();
167-
assertThat(connection.getTimeout()).isEqualTo(EXPECTED_TIMEOUT);
160+
assertThat(connection.getTimeout()).isEqualTo(RedisURI.DEFAULT_TIMEOUT_DURATION);
168161
connection.close();
169162
}
170163

171164
@Test
172165
void connectPubSubCodecClientUri() {
173166
StatefulRedisPubSubConnection<String, String> connection = client.connectPubSub(UTF8);
174-
assertThat(connection.getTimeout()).isEqualTo(EXPECTED_TIMEOUT);
167+
assertThat(connection.getTimeout()).isEqualTo(RedisURI.DEFAULT_TIMEOUT_DURATION);
175168
connection.close();
176169
}
177170

@@ -243,14 +236,14 @@ void connectPubSubAsyncReauthNotSupportedWithRESP2() {
243236
@Test
244237
void connectSentinelClientUri() {
245238
StatefulRedisSentinelConnection<String, String> connection = client.connectSentinel();
246-
assertThat(connection.getTimeout()).isEqualTo(EXPECTED_TIMEOUT);
239+
assertThat(connection.getTimeout()).isEqualTo(RedisURI.DEFAULT_TIMEOUT_DURATION);
247240
connection.close();
248241
}
249242

250243
@Test
251244
void connectSentinelCodecClientUri() {
252245
StatefulRedisSentinelConnection<String, String> connection = client.connectSentinel(UTF8);
253-
assertThat(connection.getTimeout()).isEqualTo(EXPECTED_TIMEOUT);
246+
assertThat(connection.getTimeout()).isEqualTo(RedisURI.DEFAULT_TIMEOUT_DURATION);
254247
connection.close();
255248
}
256249

src/test/java/io/lettuce/core/reliability/AtLeastOnceIntegrationTests.java

Lines changed: 23 additions & 11 deletions
Original file line numberDiff line numberDiff line change
@@ -10,13 +10,17 @@
1010
import java.util.concurrent.TimeUnit;
1111
import java.util.function.Predicate;
1212

13+
import io.lettuce.core.RedisClient;
14+
import io.lettuce.core.RedisURI;
1315
import io.lettuce.core.TimeoutOptions;
1416
import io.lettuce.core.protocol.RedisCommand;
17+
import io.lettuce.test.resource.FastShutdown;
18+
import io.lettuce.test.settings.TestSettings;
19+
import org.junit.jupiter.api.AfterEach;
1520
import org.junit.jupiter.api.BeforeEach;
1621
import org.junit.jupiter.api.Tag;
1722
import org.junit.jupiter.api.Test;
1823

19-
import io.lettuce.core.AbstractRedisClientTest;
2024
import io.lettuce.core.ClientOptions;
2125
import io.lettuce.core.RedisChannelWriter;
2226
import io.lettuce.core.RedisCommandTimeoutException;
@@ -42,26 +46,37 @@
4246

4347
/**
4448
* @author Mark Paluch
49+
* @author Hari Mani
4550
*/
4651
@Tag(INTEGRATION_TEST)
47-
class AtLeastOnceIntegrationTests extends AbstractRedisClientTest {
52+
class AtLeastOnceIntegrationTests {
4853

49-
private String key = "key";
54+
private static final String key = "key";
5055

51-
@BeforeEach
52-
void before() {
53-
client.setOptions(ClientOptions.builder().autoReconnect(true)
54-
.timeoutOptions(TimeoutOptions.builder().timeoutCommands(false).build()).build());
56+
private final RedisClient client;
5557

58+
public AtLeastOnceIntegrationTests() {
5659
// needs to be increased on slow systems...perhaps...
57-
client.setDefaultTimeout(3, TimeUnit.SECONDS);
60+
final RedisURI uri = RedisURI.Builder.redis(TestSettings.host(), TestSettings.port()).withTimeout(Duration.ofSeconds(3))
61+
.build();
62+
this.client = RedisClient.create(uri);
63+
this.client.setOptions(ClientOptions.builder().autoReconnect(true)
64+
.timeoutOptions(TimeoutOptions.builder().timeoutCommands(false).build()).build());
65+
}
5866

67+
@BeforeEach
68+
void before() {
5969
RedisCommands<String, String> connection = client.connect().sync();
6070
connection.flushall();
6171
connection.flushdb();
6272
connection.getStatefulConnection().close();
6373
}
6474

75+
@AfterEach
76+
void tearDown() {
77+
FastShutdown.shutdown(client);
78+
}
79+
6580
@Test
6681
void connectionIsConnectedAfterConnect() {
6782

@@ -382,9 +397,6 @@ void retryAfterConnectionIsDisconnectedButFiltered() throws Exception {
382397
client.setOptions(ClientOptions.builder().autoReconnect(true).replayFilter(filter)
383398
.timeoutOptions(TimeoutOptions.builder().timeoutCommands(false).build()).build());
384399

385-
// needs to be increased on slow systems...perhaps...
386-
client.setDefaultTimeout(3, TimeUnit.SECONDS);
387-
388400
StatefulRedisConnection<String, String> connection = client.connect();
389401
RedisCommands<String, String> verificationConnection = client.connect().sync();
390402

0 commit comments

Comments
 (0)