Skip to content

Commit 0d6cb59

Browse files
committed
Allow to prepare the pool
1 parent c83f5ac commit 0d6cb59

File tree

5 files changed

+73
-3
lines changed

5 files changed

+73
-3
lines changed

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

+14
Original file line numberDiff line numberDiff line change
@@ -38,12 +38,26 @@ class DefaultLettucePoolingClientConfiguration implements LettucePoolingClientCo
3838

3939
private final LettuceClientConfiguration clientConfiguration;
4040
private final GenericObjectPoolConfig poolConfig;
41+
private final boolean preparePool;
4142

4243
DefaultLettucePoolingClientConfiguration(LettuceClientConfiguration clientConfiguration,
4344
GenericObjectPoolConfig poolConfig) {
4445

4546
this.clientConfiguration = clientConfiguration;
4647
this.poolConfig = poolConfig;
48+
this.preparePool = false;
49+
}
50+
51+
DefaultLettucePoolingClientConfiguration(LettuceClientConfiguration clientConfiguration,
52+
GenericObjectPoolConfig poolConfig, boolean preparePool) {
53+
this.clientConfiguration = clientConfiguration;
54+
this.poolConfig = poolConfig;
55+
this.preparePool = preparePool;
56+
}
57+
58+
@Override
59+
public boolean preparePool() {
60+
return preparePool;
4761
}
4862

4963
@Override

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

+9-1
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
*/
3737
public interface LettucePoolingClientConfiguration extends LettuceClientConfiguration {
3838

39+
boolean preparePool();
3940
/**
4041
* @return the {@link GenericObjectPoolConfig}. Never {@literal null}.
4142
*/
@@ -92,6 +93,7 @@ static LettucePoolingClientConfiguration defaultConfiguration() {
9293
class LettucePoolingClientConfigurationBuilder extends LettuceClientConfigurationBuilder {
9394

9495
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
96+
boolean preparePool = false;
9597

9698
LettucePoolingClientConfigurationBuilder() {
9799
super();
@@ -125,6 +127,12 @@ public LettucePoolingClientConfigurationBuilder commandTimeout(Duration timeout)
125127
return this;
126128
}
127129

130+
public LettucePoolingClientConfigurationBuilder preparePool(boolean preparePool) {
131+
132+
this.preparePool = preparePool;
133+
return this;
134+
}
135+
128136
@Override
129137
public LettucePoolingClientConfigurationBuilder shutdownTimeout(Duration shutdownTimeout) {
130138

@@ -173,7 +181,7 @@ public LettucePoolingClientConfigurationBuilder poolConfig(GenericObjectPoolConf
173181

174182
@Override
175183
public LettucePoolingClientConfiguration build() {
176-
return new DefaultLettucePoolingClientConfiguration(super.build(), poolConfig);
184+
return new DefaultLettucePoolingClientConfiguration(super.build(), poolConfig, preparePool);
177185
}
178186
}
179187

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

+17-2
Original file line numberDiff line numberDiff line change
@@ -63,6 +63,7 @@ class LettucePoolingConnectionProvider implements LettuceConnectionProvider, Red
6363
private static final Log log = LogFactory.getLog(LettucePoolingConnectionProvider.class);
6464

6565
private final LettuceConnectionProvider connectionProvider;
66+
private final LettucePoolingClientConfiguration clientConfiguration;
6667
private final GenericObjectPoolConfig poolConfig;
6768
private final Map<StatefulConnection<?, ?>, GenericObjectPool<StatefulConnection<?, ?>>> poolRef = new ConcurrentHashMap<>(
6869
32);
@@ -81,6 +82,7 @@ class LettucePoolingConnectionProvider implements LettuceConnectionProvider, Red
8182
Assert.notNull(connectionProvider, "ConnectionProvider must not be null");
8283
Assert.notNull(clientConfiguration, "ClientConfiguration must not be null");
8384

85+
this.clientConfiguration = clientConfiguration;
8486
this.connectionProvider = connectionProvider;
8587
this.poolConfig = clientConfiguration.getPoolConfig();
8688
this.asyncPoolConfig = CommonsPool2ConfigConverter.bounded(this.poolConfig);
@@ -90,8 +92,21 @@ class LettucePoolingConnectionProvider implements LettuceConnectionProvider, Red
9092
public <T extends StatefulConnection<?, ?>> T getConnection(Class<T> connectionType) {
9193

9294
GenericObjectPool<StatefulConnection<?, ?>> pool = pools.computeIfAbsent(connectionType, poolType -> {
93-
return ConnectionPoolSupport.createGenericObjectPool(() -> connectionProvider.getConnection(connectionType),
94-
poolConfig, false);
95+
96+
GenericObjectPool<StatefulConnection<?, ?>> newPool = ConnectionPoolSupport.createGenericObjectPool(() ->
97+
connectionProvider.getConnection(connectionType), poolConfig, false);
98+
99+
if (clientConfiguration.preparePool()) {
100+
101+
try {
102+
newPool.preparePool();
103+
104+
} catch (Exception ex) {
105+
throw new PoolException("Could not prepare the pool", ex);
106+
}
107+
}
108+
109+
return newPool;
95110
});
96111

97112
try {

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

+3
Original file line numberDiff line numberDiff line change
@@ -48,6 +48,7 @@ void shouldCreateEmptyConfiguration() {
4848
assertThat(configuration.getPoolConfig()).isNotNull();
4949
assertThat(configuration.isUseSsl()).isFalse();
5050
assertThat(configuration.isVerifyPeer()).isTrue();
51+
assertThat(configuration.preparePool()).isFalse();
5152
assertThat(configuration.getVerifyMode().equals(SslVerifyMode.FULL));
5253
assertThat(configuration.isStartTls()).isFalse();
5354
assertThat(configuration.getClientOptions()).hasValueSatisfying(actual -> {
@@ -73,6 +74,7 @@ void shouldConfigureAllProperties() {
7374
.disablePeerVerification() //
7475
.startTls().and() //
7576
.poolConfig(poolConfig) //
77+
.preparePool(true)
7678
.clientOptions(clientOptions) //
7779
.clientResources(sharedClientResources) //
7880
.commandTimeout(Duration.ofMinutes(5)) //
@@ -83,6 +85,7 @@ void shouldConfigureAllProperties() {
8385
assertThat(configuration.getPoolConfig()).isEqualTo(poolConfig);
8486
assertThat(configuration.isUseSsl()).isTrue();
8587
assertThat(configuration.isVerifyPeer()).isFalse();
88+
assertThat(configuration.preparePool()).isTrue();
8689
assertThat(configuration.getVerifyMode().equals(SslVerifyMode.NONE));
8790
assertThat(configuration.isStartTls()).isTrue();
8891
assertThat(configuration.getClientOptions()).contains(clientOptions);

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

+30
Original file line numberDiff line numberDiff line change
@@ -20,13 +20,15 @@
2020
import io.lettuce.core.api.StatefulRedisConnection;
2121
import io.lettuce.core.api.async.RedisAsyncCommands;
2222

23+
import org.apache.commons.pool2.impl.GenericObjectPoolConfig;
2324
import org.junit.jupiter.api.BeforeEach;
2425
import org.junit.jupiter.api.Test;
2526
import org.junit.jupiter.api.extension.ExtendWith;
2627
import org.mockito.Mock;
2728
import org.mockito.junit.jupiter.MockitoExtension;
2829
import org.mockito.junit.jupiter.MockitoSettings;
2930
import org.mockito.quality.Strictness;
31+
import org.springframework.data.redis.connection.lettuce.LettucePoolingClientConfiguration.LettucePoolingClientConfigurationBuilder;
3032

3133
/**
3234
* Unit tests for {@link LettucePoolingConnectionProvider}.
@@ -70,4 +72,32 @@ void shouldDiscardTransactionOnReleaseOnActiveTransaction() {
7072

7173
verify(commandsMock).discard();
7274
}
75+
76+
@Test
77+
void shouldPrepareThePool() {
78+
79+
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
80+
poolConfig.setMinIdle(5);
81+
poolConfig.setMaxIdle(8);
82+
poolConfig.setMaxTotal(10);
83+
84+
LettucePoolingClientConfiguration config = new LettucePoolingClientConfigurationBuilder()
85+
.poolConfig(poolConfig)
86+
.preparePool(true)
87+
.build();
88+
89+
LettucePoolingConnectionProvider provider = new LettucePoolingConnectionProvider(connectionProviderMock, config);
90+
91+
provider.getConnection(StatefulRedisConnection.class);
92+
verify(connectionProviderMock, times(5)).getConnection(any());
93+
}
94+
95+
@Test
96+
void shouldNotPrepareThePoolByDefault() {
97+
98+
LettucePoolingConnectionProvider provider = new LettucePoolingConnectionProvider(connectionProviderMock, config);
99+
100+
provider.getConnection(StatefulRedisConnection.class);
101+
verify(connectionProviderMock, times(1)).getConnection(any());
102+
}
73103
}

0 commit comments

Comments
 (0)