Skip to content

Commit 6d4bcfc

Browse files
authored
Enable adaptive refresh by default #3249 (#3316)
* Enable adaptive refresh by default #3249 * Added @SInCE * Fix integration test [incomplete] * Add also fix to issue 3250 * Change default to 5 seconds * Remove unnecessary new line
1 parent 49eddf4 commit 6d4bcfc

File tree

4 files changed

+79
-8
lines changed

4 files changed

+79
-8
lines changed

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

Lines changed: 8 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -53,7 +53,8 @@ public class ClusterClientOptions extends ClientOptions {
5353

5454
public static final Duration DEFAULT_REFRESH_PERIOD_DURATION = Duration.ofSeconds(DEFAULT_REFRESH_PERIOD);
5555

56-
public static final boolean DEFAULT_VALIDATE_CLUSTER_MEMBERSHIP = true;
56+
/** Since Lettuce 7.0 validation is by default disabled. */
57+
public static final boolean DEFAULT_VALIDATE_CLUSTER_MEMBERSHIP = false;
5758

5859
public static final Predicate<RedisClusterNode> DEFAULT_NODE_FILTER = node -> true;
5960

@@ -281,8 +282,12 @@ public Builder topologyRefreshOptions(ClusterTopologyRefreshOptions topologyRefr
281282
}
282283

283284
/**
284-
* Validate the cluster node membership before allowing connections to a cluster node. Defaults to {@code true}. See
285+
* Validate the cluster node membership before allowing connections to a cluster node. Defaults to {@code false}. See
285286
* {@link ClusterClientOptions#DEFAULT_VALIDATE_CLUSTER_MEMBERSHIP}.
287+
* <p/>
288+
* Since 7.0, validation is disabled by default, as it is causing problems in some upgrade scenarios. In scenarios where
289+
* upgraded nodes are added to the cluster the ASK / MOVED replies usually come before the topology is refreshed and -
290+
* respectively - this validation would fail.
286291
*
287292
* @param validateClusterNodeMembership {@code true} if validation is enabled.
288293
* @return {@code this}
@@ -396,7 +401,7 @@ public ClusterTopologyRefreshOptions getTopologyRefreshOptions() {
396401
}
397402

398403
/**
399-
* Validate the cluster node membership before allowing connections to a cluster node. Defaults to {@code true}.
404+
* Validate the cluster node membership before allowing connections to a cluster node. Defaults to {@code false}.
400405
*
401406
* @return {@code true} if validation is enabled.
402407
*/

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

Lines changed: 53 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -33,14 +33,18 @@
3333
* Options to control the Cluster topology refreshing of {@link RedisClusterClient}.
3434
*
3535
* @author Mark Paluch
36+
* @author Tihomir Mateev
3637
* @since 4.2
3738
*/
3839
public class ClusterTopologyRefreshOptions {
3940

40-
public static final Set<RefreshTrigger> DEFAULT_ADAPTIVE_REFRESH_TRIGGERS = Collections.emptySet();
41+
/** Since Lettuce 7.0 all adaptive triggers are enabled by default */
42+
public static final Set<RefreshTrigger> DEFAULT_ADAPTIVE_REFRESH_TRIGGERS = EnumSet.allOf(RefreshTrigger.class);
4143

42-
public static final long DEFAULT_ADAPTIVE_REFRESH_TIMEOUT = 30;
44+
/** Since Lettuce 7.0 the default adaptive refresh timeout is 5 seconds */
45+
public static final long DEFAULT_ADAPTIVE_REFRESH_TIMEOUT = 5;
4346

47+
@Deprecated
4448
public static final TimeUnit DEFAULT_ADAPTIVE_REFRESH_TIMEOUT_UNIT = TimeUnit.SECONDS;
4549

4650
public static final Duration DEFAULT_ADAPTIVE_REFRESH_TIMEOUT_DURATION = Duration
@@ -54,6 +58,7 @@ public class ClusterTopologyRefreshOptions {
5458

5559
public static final long DEFAULT_REFRESH_PERIOD = 60;
5660

61+
@Deprecated
5762
public static final TimeUnit DEFAULT_REFRESH_PERIOD_UNIT = TimeUnit.SECONDS;
5863

5964
public static final Duration DEFAULT_REFRESH_PERIOD_DURATION = Duration.ofSeconds(DEFAULT_REFRESH_PERIOD);
@@ -159,12 +164,16 @@ private Builder() {
159164
* Enables adaptive topology refreshing using one or more {@link RefreshTrigger triggers}. Adaptive refresh triggers
160165
* initiate topology view updates based on events happened during Redis Cluster operations. Adaptive triggers lead to an
161166
* immediate topology refresh. Adaptive triggered refreshes are rate-limited using a timeout since events can happen on
162-
* a large scale. Adaptive refresh triggers are disabled by default. See also
167+
* a large scale. Adaptive refresh triggers are all enabled by default. See also
163168
* {@link #adaptiveRefreshTriggersTimeout(long, TimeUnit)} and {@link RefreshTrigger}.
164169
*
165170
* @param refreshTrigger one or more {@link RefreshTrigger} to enabled
166171
* @return {@code this}
172+
* @deprecated Starting from 7.0, this method has no effect as all adaptive triggers are enabled by default.
173+
* @see #disableAllAdaptiveRefreshTriggers()
174+
* @see #disableAdaptiveRefreshTrigger(RefreshTrigger...)
167175
*/
176+
@Deprecated
168177
public Builder enableAdaptiveRefreshTrigger(RefreshTrigger... refreshTrigger) {
169178

170179
LettuceAssert.notNull(refreshTrigger, "RefreshTriggers must not be null");
@@ -179,16 +188,56 @@ public Builder enableAdaptiveRefreshTrigger(RefreshTrigger... refreshTrigger) {
179188
* Enables adaptive topology refreshing using all {@link RefreshTrigger triggers}. Adaptive refresh triggers initiate
180189
* topology view updates based on events happened during Redis Cluster operations. Adaptive triggers lead to an
181190
* immediate topology refresh. Adaptive triggered refreshes are rate-limited using a timeout since events can happen on
182-
* a large scale. Adaptive refresh triggers are disabled by default. See also
191+
* a large scale. Adaptive refresh triggers are all enabled by default. See also
183192
* {@link #adaptiveRefreshTriggersTimeout(long, TimeUnit)} and {@link RefreshTrigger}.
184193
*
185194
* @return {@code this}
195+
* @deprecated Starting from 7.0, this method has no effect as all adaptive triggers are enabled by default.
196+
* @see #disableAllAdaptiveRefreshTriggers()
197+
* @see #disableAdaptiveRefreshTrigger(RefreshTrigger...)
186198
*/
199+
@Deprecated
187200
public Builder enableAllAdaptiveRefreshTriggers() {
188201
adaptiveRefreshTriggers.addAll(EnumSet.allOf(RefreshTrigger.class));
189202
return this;
190203
}
191204

205+
/**
206+
* Disables adaptive topology refreshing using one or more {@link RefreshTrigger triggers}. Adaptive refresh triggers
207+
* initiate topology view updates based on events happened during Redis Cluster operations. Adaptive triggers lead to an
208+
* immediate topology refresh. Adaptive triggered refreshes are rate-limited using a timeout since events can happen on
209+
* a large scale. Adaptive refresh triggers are all enabled by default. See also
210+
* {@link #adaptiveRefreshTriggersTimeout(long, TimeUnit)} and {@link RefreshTrigger}.
211+
*
212+
* @param refreshTrigger one or more {@link RefreshTrigger} to enabled
213+
* @return {@code this}
214+
* @since 7.0
215+
*/
216+
public Builder disableAdaptiveRefreshTrigger(RefreshTrigger... refreshTrigger) {
217+
218+
LettuceAssert.notNull(refreshTrigger, "RefreshTriggers must not be null");
219+
LettuceAssert.noNullElements(refreshTrigger, "RefreshTriggers must not contain null elements");
220+
LettuceAssert.notEmpty(refreshTrigger, "RefreshTriggers must contain at least one element");
221+
222+
Arrays.asList(refreshTrigger).forEach(adaptiveRefreshTriggers::remove);
223+
return this;
224+
}
225+
226+
/**
227+
* Disables adaptive topology refreshing using all {@link RefreshTrigger triggers}. Adaptive refresh triggers initiate
228+
* topology view updates based on events happened during Redis Cluster operations. Adaptive triggers lead to an
229+
* immediate topology refresh. Adaptive triggered refreshes are rate-limited using a timeout since events can happen on
230+
* a large scale. Adaptive refresh triggers are all enabled by default. See also
231+
* {@link #adaptiveRefreshTriggersTimeout(long, TimeUnit)} and {@link RefreshTrigger}.
232+
*
233+
* @return {@code this}
234+
* @since 7.0
235+
*/
236+
public Builder disableAllAdaptiveRefreshTriggers() {
237+
adaptiveRefreshTriggers.clear();
238+
return this;
239+
}
240+
192241
/**
193242
* Set the timeout for adaptive topology updates. This timeout is to rate-limit topology updates initiated by refresh
194243
* triggers to one topology refresh per timeout. Defaults to {@literal 30 SECONDS}. See {@link #DEFAULT_REFRESH_PERIOD}

src/test/java/io/lettuce/core/cluster/ClusterTopologyRefreshOptionsUnitTests.java

Lines changed: 2 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -25,6 +25,7 @@ void testBuilder() {
2525
ClusterTopologyRefreshOptions options = ClusterTopologyRefreshOptions.builder()//
2626
.enablePeriodicRefresh(true).refreshPeriod(10, TimeUnit.MINUTES)//
2727
.dynamicRefreshSources(false) //
28+
.disableAllAdaptiveRefreshTriggers()//
2829
.enableAdaptiveRefreshTrigger(RefreshTrigger.MOVED_REDIRECT)//
2930
.adaptiveRefreshTriggersTimeout(15, TimeUnit.MILLISECONDS)//
3031
.closeStaleConnections(false)//
@@ -46,6 +47,7 @@ void testCopy() {
4647
ClusterTopologyRefreshOptions master = ClusterTopologyRefreshOptions.builder()//
4748
.enablePeriodicRefresh(true).refreshPeriod(10, TimeUnit.MINUTES)//
4849
.dynamicRefreshSources(false) //
50+
.disableAllAdaptiveRefreshTriggers()//
4951
.enableAdaptiveRefreshTrigger(RefreshTrigger.MOVED_REDIRECT)//
5052
.adaptiveRefreshTriggersTimeout(15, TimeUnit.MILLISECONDS)//
5153
.closeStaleConnections(false)//

src/test/java/io/lettuce/core/cluster/ClusterTopologyRefreshSchedulerUnitTests.java

Lines changed: 16 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -132,7 +132,7 @@ void shouldTriggerRefreshOnAskRedirection() {
132132
}
133133

134134
@Test
135-
void shouldNotTriggerAdaptiveRefreshUsingDefaults() {
135+
void shouldTriggerAdaptiveRefreshUsingDefaults() {
136136

137137
ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.create();
138138

@@ -141,6 +141,21 @@ void shouldNotTriggerAdaptiveRefreshUsingDefaults() {
141141

142142
when(clusterClient.getClusterClientOptions()).thenReturn(clusterClientOptions);
143143

144+
sut.onAskRedirection();
145+
verify(eventExecutors).submit(any(Runnable.class));
146+
}
147+
148+
@Test
149+
void shouldNotTriggerAdaptiveRefreshWhenDisabled() {
150+
151+
ClusterTopologyRefreshOptions clusterTopologyRefreshOptions = ClusterTopologyRefreshOptions.builder()
152+
.disableAllAdaptiveRefreshTriggers().build();
153+
154+
ClusterClientOptions clusterClientOptions = ClusterClientOptions.builder()
155+
.topologyRefreshOptions(clusterTopologyRefreshOptions).build();
156+
157+
when(clusterClient.getClusterClientOptions()).thenReturn(clusterClientOptions);
158+
144159
sut.onAskRedirection();
145160
verify(eventExecutors, never()).submit(any(Runnable.class));
146161
}

0 commit comments

Comments
 (0)