Skip to content

Commit 4137a11

Browse files
committed
Allow to prepare the pool
1 parent c83f5ac commit 4137a11

File tree

5 files changed

+77
-3
lines changed

5 files changed

+77
-3
lines changed

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

Lines changed: 15 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -32,18 +32,33 @@
3232
* @author Christoph Strobl
3333
* @author Yanming Zhou
3434
* @author Zhian Chen
35+
* @author Asmir Mustafic
3536
* @since 2.0
3637
*/
3738
class DefaultLettucePoolingClientConfiguration implements LettucePoolingClientConfiguration {
3839

3940
private final LettuceClientConfiguration clientConfiguration;
4041
private final GenericObjectPoolConfig poolConfig;
42+
private final boolean preparePool;
4143

4244
DefaultLettucePoolingClientConfiguration(LettuceClientConfiguration clientConfiguration,
4345
GenericObjectPoolConfig poolConfig) {
4446

4547
this.clientConfiguration = clientConfiguration;
4648
this.poolConfig = poolConfig;
49+
this.preparePool = false;
50+
}
51+
52+
DefaultLettucePoolingClientConfiguration(LettuceClientConfiguration clientConfiguration,
53+
GenericObjectPoolConfig poolConfig, boolean preparePool) {
54+
this.clientConfiguration = clientConfiguration;
55+
this.poolConfig = poolConfig;
56+
this.preparePool = preparePool;
57+
}
58+
59+
@Override
60+
public boolean preparePool() {
61+
return preparePool;
4762
}
4863

4964
@Override

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

Lines changed: 11 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -32,10 +32,13 @@
3232
* @author Mark Paluch
3333
* @author Christoph Strobl
3434
* @author Yanming Zhou
35+
* @author Asmir Mustafic
3536
* @since 2.0
3637
*/
3738
public interface LettucePoolingClientConfiguration extends LettuceClientConfiguration {
3839

40+
boolean preparePool();
41+
3942
/**
4043
* @return the {@link GenericObjectPoolConfig}. Never {@literal null}.
4144
*/
@@ -92,6 +95,7 @@ static LettucePoolingClientConfiguration defaultConfiguration() {
9295
class LettucePoolingClientConfigurationBuilder extends LettuceClientConfigurationBuilder {
9396

9497
GenericObjectPoolConfig poolConfig = new GenericObjectPoolConfig();
98+
boolean preparePool = false;
9599

96100
LettucePoolingClientConfigurationBuilder() {
97101
super();
@@ -125,6 +129,12 @@ public LettucePoolingClientConfigurationBuilder commandTimeout(Duration timeout)
125129
return this;
126130
}
127131

132+
public LettucePoolingClientConfigurationBuilder preparePool(boolean preparePool) {
133+
134+
this.preparePool = preparePool;
135+
return this;
136+
}
137+
128138
@Override
129139
public LettucePoolingClientConfigurationBuilder shutdownTimeout(Duration shutdownTimeout) {
130140

@@ -173,7 +183,7 @@ public LettucePoolingClientConfigurationBuilder poolConfig(GenericObjectPoolConf
173183

174184
@Override
175185
public LettucePoolingClientConfiguration build() {
176-
return new DefaultLettucePoolingClientConfiguration(super.build(), poolConfig);
186+
return new DefaultLettucePoolingClientConfiguration(super.build(), poolConfig, preparePool);
177187
}
178188
}
179189

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

Lines changed: 18 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -55,6 +55,7 @@
5555
*
5656
* @author Mark Paluch
5757
* @author Christoph Strobl
58+
* @author Asmir Mustafic
5859
* @since 2.0
5960
* @see #getConnection(Class)
6061
*/
@@ -63,6 +64,7 @@ class LettucePoolingConnectionProvider implements LettuceConnectionProvider, Red
6364
private static final Log log = LogFactory.getLog(LettucePoolingConnectionProvider.class);
6465

6566
private final LettuceConnectionProvider connectionProvider;
67+
private final LettucePoolingClientConfiguration clientConfiguration;
6668
private final GenericObjectPoolConfig poolConfig;
6769
private final Map<StatefulConnection<?, ?>, GenericObjectPool<StatefulConnection<?, ?>>> poolRef = new ConcurrentHashMap<>(
6870
32);
@@ -81,6 +83,7 @@ class LettucePoolingConnectionProvider implements LettuceConnectionProvider, Red
8183
Assert.notNull(connectionProvider, "ConnectionProvider must not be null");
8284
Assert.notNull(clientConfiguration, "ClientConfiguration must not be null");
8385

86+
this.clientConfiguration = clientConfiguration;
8487
this.connectionProvider = connectionProvider;
8588
this.poolConfig = clientConfiguration.getPoolConfig();
8689
this.asyncPoolConfig = CommonsPool2ConfigConverter.bounded(this.poolConfig);
@@ -90,8 +93,21 @@ class LettucePoolingConnectionProvider implements LettuceConnectionProvider, Red
9093
public <T extends StatefulConnection<?, ?>> T getConnection(Class<T> connectionType) {
9194

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

97113
try {

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

Lines changed: 4 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -37,6 +37,7 @@
3737
* @author Christoph Strobl
3838
* @author Longlong Zhao
3939
* @author Zhian Chen
40+
* @author Asmir Mustafic
4041
*/
4142
class LettucePoolingClientConfigurationUnitTests {
4243

@@ -48,6 +49,7 @@ void shouldCreateEmptyConfiguration() {
4849
assertThat(configuration.getPoolConfig()).isNotNull();
4950
assertThat(configuration.isUseSsl()).isFalse();
5051
assertThat(configuration.isVerifyPeer()).isTrue();
52+
assertThat(configuration.preparePool()).isFalse();
5153
assertThat(configuration.getVerifyMode().equals(SslVerifyMode.FULL));
5254
assertThat(configuration.isStartTls()).isFalse();
5355
assertThat(configuration.getClientOptions()).hasValueSatisfying(actual -> {
@@ -73,6 +75,7 @@ void shouldConfigureAllProperties() {
7375
.disablePeerVerification() //
7476
.startTls().and() //
7577
.poolConfig(poolConfig) //
78+
.preparePool(true)
7679
.clientOptions(clientOptions) //
7780
.clientResources(sharedClientResources) //
7881
.commandTimeout(Duration.ofMinutes(5)) //
@@ -83,6 +86,7 @@ void shouldConfigureAllProperties() {
8386
assertThat(configuration.getPoolConfig()).isEqualTo(poolConfig);
8487
assertThat(configuration.isUseSsl()).isTrue();
8588
assertThat(configuration.isVerifyPeer()).isFalse();
89+
assertThat(configuration.preparePool()).isTrue();
8690
assertThat(configuration.getVerifyMode().equals(SslVerifyMode.NONE));
8791
assertThat(configuration.isStartTls()).isTrue();
8892
assertThat(configuration.getClientOptions()).contains(clientOptions);

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

Lines changed: 29 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,18 +20,21 @@
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}.
3335
*
3436
* @author Mark Paluch
37+
* @author Asmir Mustafic
3538
*/
3639
@ExtendWith(MockitoExtension.class)
3740
@MockitoSettings(strictness = Strictness.LENIENT)
@@ -70,4 +73,30 @@ void shouldDiscardTransactionOnReleaseOnActiveTransaction() {
7073

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

0 commit comments

Comments
 (0)