DATAREDIS-881 - Allow configuration of Lettuce's quiet shutdown period.

LettuceClientConfigurationBuilder now allows configuration of the quiet shutdown period to improve shutdown time of the Netty EventLoop when using non-shared ClientResources.

Original pull request: #363.
This commit is contained in:
Yanming Zhou
2018-10-16 16:16:09 +08:00
committed by Mark Paluch
parent 148b1ae582
commit 8e8861cbcd
7 changed files with 76 additions and 4 deletions

View File

@@ -42,11 +42,13 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
private final Optional<ReadFrom> readFrom;
private final Duration timeout;
private final Duration shutdownTimeout;
private final Duration shutdownQuietPeriod;
DefaultLettuceClientConfiguration(boolean useSsl, boolean verifyPeer, boolean startTls,
@Nullable ClientResources clientResources, @Nullable ClientOptions clientOptions, @Nullable String clientName,
@Nullable ReadFrom readFrom,
Duration timeout, Duration shutdownTimeout) {
Duration timeout, Duration shutdownTimeout,
@Nullable Duration shutdownQuietPeriod) {
this.useSsl = useSsl;
this.verifyPeer = verifyPeer;
@@ -57,6 +59,7 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
this.readFrom = Optional.ofNullable(readFrom);
this.timeout = timeout;
this.shutdownTimeout = shutdownTimeout;
this.shutdownQuietPeriod = shutdownQuietPeriod != null ? shutdownQuietPeriod : shutdownTimeout;
}
/*
@@ -139,4 +142,13 @@ class DefaultLettuceClientConfiguration implements LettuceClientConfiguration {
public Duration getShutdownTimeout() {
return shutdownTimeout;
}
/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getShutdownQuietPeriod()
*/
@Override
public Duration getShutdownQuietPeriod() {
return shutdownQuietPeriod;
}
}

View File

@@ -124,6 +124,15 @@ class DefaultLettucePoolingClientConfiguration implements LettucePoolingClientCo
return clientConfiguration.getShutdownTimeout();
}
/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getShutdownQuietPeriod()
*/
@Override
public Duration getShutdownQuietPeriod() {
return clientConfiguration.getShutdownQuietPeriod();
}
/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettucePoolingClientConfiguration#getPoolConfig()

View File

@@ -103,6 +103,13 @@ public interface LettuceClientConfiguration {
*/
Duration getShutdownTimeout();
/**
* @return the shutdown quiet period used to close the client.
* @since 2.2
* @see io.lettuce.core.AbstractRedisClient#shutdown(long, long, TimeUnit)
*/
Duration getShutdownQuietPeriod();
/**
* Creates a new {@link LettuceClientConfigurationBuilder} to build {@link LettuceClientConfiguration} to be used with
* the Lettuce client.
@@ -157,6 +164,7 @@ public interface LettuceClientConfiguration {
@Nullable ReadFrom readFrom;
Duration timeout = Duration.ofSeconds(RedisURI.DEFAULT_TIMEOUT);
Duration shutdownTimeout = Duration.ofMillis(100);
@Nullable Duration shutdownQuietPeriod;
LettuceClientConfigurationBuilder() {}
@@ -258,12 +266,28 @@ public interface LettuceClientConfiguration {
*/
public LettuceClientConfigurationBuilder shutdownTimeout(Duration shutdownTimeout) {
Assert.notNull(timeout, "Duration must not be null!");
Assert.notNull(shutdownTimeout, "Duration must not be null!");
this.shutdownTimeout = shutdownTimeout;
return this;
}
/**
* Configure a shutdown timeout.
*
* @param shutdownQuietPeriod must not be {@literal null}.
* @return {@literal this} builder.
* @throws IllegalArgumentException if shutdownQuietPeriod is {@literal null}.
* @since 2.2
*/
public LettuceClientConfigurationBuilder shutdownQuietPeriod(Duration shutdownQuietPeriod) {
Assert.notNull(shutdownQuietPeriod, "Duration must not be null!");
this.shutdownQuietPeriod = shutdownQuietPeriod;
return this;
}
/**
* Build the {@link LettuceClientConfiguration} with the configuration applied from this builder.
*
@@ -272,7 +296,7 @@ public interface LettuceClientConfiguration {
public LettuceClientConfiguration build() {
return new DefaultLettuceClientConfiguration(useSsl, verifyPeer, startTls, clientResources, clientOptions,
clientName, readFrom, timeout, shutdownTimeout);
clientName, readFrom, timeout, shutdownTimeout, shutdownQuietPeriod);
}
}

View File

@@ -302,8 +302,9 @@ public class LettuceConnectionFactory
}
try {
Duration quietPeriod = clientConfiguration.getShutdownQuietPeriod();
Duration timeout = clientConfiguration.getShutdownTimeout();
client.shutdown(timeout.toMillis(), timeout.toMillis(), TimeUnit.MILLISECONDS);
client.shutdown(quietPeriod.toMillis(), timeout.toMillis(), TimeUnit.MILLISECONDS);
} catch (Exception e) {
if (log.isWarnEnabled()) {
@@ -1276,5 +1277,14 @@ public class LettuceConnectionFactory
void setShutdownTimeout(Duration shutdownTimeout) {
this.shutdownTimeout = shutdownTimeout;
}
/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration#getShutdownQuietPeriod()
*/
@Override
public Duration getShutdownQuietPeriod() {
return shutdownTimeout;
}
}
}

View File

@@ -142,6 +142,17 @@ public interface LettucePoolingClientConfiguration extends LettuceClientConfigur
return this;
}
/*
* (non-Javadoc)
* @see org.springframework.data.redis.connection.lettuce.LettuceClientConfiguration.LettuceClientConfigurationBuilder#shutdownQuietPeriod(java.time.Duration)
*/
@Override
public LettucePoolingClientConfigurationBuilder shutdownQuietPeriod(Duration shutdownQuietPeriod) {
super.shutdownQuietPeriod(shutdownQuietPeriod);
return this;
}
/**
* Set the {@link GenericObjectPoolConfig} used by the driver.
*