Skip to content

Commit 42d46a9

Browse files
authored
Allow index & cluster default refresh interval setting value to be -1 (opensearch-project#11411)
Signed-off-by: Ashish Singh <ssashish@amazon.com>
1 parent a8008e2 commit 42d46a9

File tree

3 files changed

+159
-24
lines changed

3 files changed

+159
-24
lines changed

server/src/internalClusterTest/java/org/opensearch/cluster/metadata/ClusterIndexRefreshIntervalIT.java

+148-21
Original file line numberDiff line numberDiff line change
@@ -235,33 +235,19 @@ public void testDefaultRefreshIntervalWithUpdateClusterAndIndexSettings() throws
235235
}
236236

237237
public void testRefreshIntervalDisabled() throws ExecutionException, InterruptedException {
238-
TimeValue clusterMinimumRefreshInterval = client().settings()
239-
.getAsTime(IndicesService.CLUSTER_MINIMUM_INDEX_REFRESH_INTERVAL_SETTING.getKey(), TimeValue.MINUS_ONE);
240-
boolean createIndexSuccess = clusterMinimumRefreshInterval.equals(TimeValue.MINUS_ONE);
241238
String clusterManagerName = internalCluster().getClusterManagerName();
242239
List<String> dataNodes = new ArrayList<>(internalCluster().getDataNodeNames());
243240
Settings settings = Settings.builder()
244241
.put(indexSettings())
245242
.put(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey(), IndexSettings.MINIMUM_REFRESH_INTERVAL)
246243
.build();
247-
if (createIndexSuccess) {
248-
createIndex(INDEX_NAME, settings);
249-
ensureYellowAndNoInitializingShards(INDEX_NAME);
250-
ensureGreen(INDEX_NAME);
251-
GetIndexResponse getIndexResponse = client(clusterManagerName).admin().indices().getIndex(new GetIndexRequest()).get();
252-
IndicesService indicesService = internalCluster().getInstance(IndicesService.class, randomFrom(dataNodes));
253-
String uuid = getIndexResponse.getSettings().get(INDEX_NAME).get(IndexMetadata.SETTING_INDEX_UUID);
254-
IndexService indexService = indicesService.indexService(new Index(INDEX_NAME, uuid));
255-
assertEquals(IndexSettings.MINIMUM_REFRESH_INTERVAL, indexService.getRefreshTaskInterval());
256-
} else {
257-
IllegalArgumentException exception = assertThrows(IllegalArgumentException.class, () -> createIndex(INDEX_NAME, settings));
258-
assertEquals(
259-
"invalid index.refresh_interval [-1]: cannot be smaller than cluster.minimum.index.refresh_interval ["
260-
+ getMinRefreshIntervalForRefreshDisabled()
261-
+ "]",
262-
exception.getMessage()
263-
);
264-
}
244+
createIndex(INDEX_NAME, settings);
245+
ensureGreen(INDEX_NAME);
246+
GetIndexResponse getIndexResponse = client(clusterManagerName).admin().indices().getIndex(new GetIndexRequest()).get();
247+
IndicesService indicesService = internalCluster().getInstance(IndicesService.class, randomFrom(dataNodes));
248+
String uuid = getIndexResponse.getSettings().get(INDEX_NAME).get(IndexMetadata.SETTING_INDEX_UUID);
249+
IndexService indexService = indicesService.indexService(new Index(INDEX_NAME, uuid));
250+
assertEquals(IndexSettings.MINIMUM_REFRESH_INTERVAL, indexService.getRefreshTaskInterval());
265251
}
266252

267253
protected TimeValue getMinRefreshIntervalForRefreshDisabled() {
@@ -366,6 +352,147 @@ public void testClusterMinimumChangeOnIndexWithCustomRefreshInterval() throws Ex
366352
assertEquals(customRefreshInterval, indexService.getRefreshTaskInterval());
367353
}
368354

355+
public void testClusterMinimumRefreshIntervalOfMinusOneFails() {
356+
// This test checks that we can not set cluster minimum refresh interval as -1 (or -1ms).
357+
String clusterManagerName = internalCluster().getClusterManagerName();
358+
String refreshInterval = randomFrom("-1", "-1ms");
359+
IllegalArgumentException ex = assertThrows(
360+
IllegalArgumentException.class,
361+
() -> client(clusterManagerName).admin()
362+
.cluster()
363+
.prepareUpdateSettings()
364+
.setTransientSettings(Settings.builder().put(CLUSTER_MINIMUM_INDEX_REFRESH_INTERVAL_SETTING.getKey(), refreshInterval))
365+
.get()
366+
);
367+
assertEquals(
368+
"failed to parse value [" + refreshInterval + "] for setting [cluster.minimum.index.refresh_interval], must be >= [0ms]",
369+
ex.getMessage()
370+
);
371+
}
372+
373+
public void testClusterMinimumRefreshIntervalOfZero() {
374+
// This test checks that we can set the cluster minimum refresh interval as 0.
375+
String clusterManagerName = internalCluster().getClusterManagerName();
376+
client(clusterManagerName).admin()
377+
.cluster()
378+
.prepareUpdateSettings()
379+
.setTransientSettings(Settings.builder().put(CLUSTER_MINIMUM_INDEX_REFRESH_INTERVAL_SETTING.getKey(), "0"))
380+
.get();
381+
}
382+
383+
public void testDefaultRefreshIntervalOfMinusOneIrrespectiveOfMinimum() {
384+
// This test checks that we are able to set the cluster default refresh interval to one regardless of what the
385+
// minimum is set to. -1 corresponds to no period background refreshes.
386+
String clusterManagerName = internalCluster().getClusterManagerName();
387+
client(clusterManagerName).admin()
388+
.cluster()
389+
.prepareUpdateSettings()
390+
.setTransientSettings(
391+
Settings.builder()
392+
.put(CLUSTER_MINIMUM_INDEX_REFRESH_INTERVAL_SETTING.getKey(), randomFrom("0", "1ms", "1s", "10s"))
393+
.put(CLUSTER_DEFAULT_INDEX_REFRESH_INTERVAL_SETTING.getKey(), randomFrom("-1", "-1ms"))
394+
)
395+
.get();
396+
}
397+
398+
public void testCreateIndexWithMinusOneRefreshInterval() throws ExecutionException, InterruptedException {
399+
// This test checks that we are able to create index with -1 refresh interval using index settings and default interval both.
400+
String clusterManagerName = internalCluster().getClusterManagerName();
401+
client(clusterManagerName).admin()
402+
.cluster()
403+
.prepareUpdateSettings()
404+
.setTransientSettings(
405+
Settings.builder()
406+
.put(CLUSTER_MINIMUM_INDEX_REFRESH_INTERVAL_SETTING.getKey(), "10s")
407+
.put(CLUSTER_DEFAULT_INDEX_REFRESH_INTERVAL_SETTING.getKey(), "10s")
408+
)
409+
.get();
410+
411+
Settings indexSettings = Settings.builder()
412+
.put(indexSettings())
413+
.put(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey(), randomFrom("-1", "-1ms"))
414+
.build();
415+
createIndex(INDEX_NAME, indexSettings);
416+
ensureGreen(INDEX_NAME);
417+
418+
IndexService indexService = getIndexServiceFromRandomDataNode(INDEX_NAME);
419+
assertEquals(-1, indexService.getRefreshTaskInterval().millis());
420+
421+
client(clusterManagerName).admin()
422+
.cluster()
423+
.prepareUpdateSettings()
424+
.setTransientSettings(Settings.builder().put(CLUSTER_DEFAULT_INDEX_REFRESH_INTERVAL_SETTING.getKey(), randomFrom("-1", "-1ms")))
425+
.get();
426+
createIndex(OTHER_INDEX_NAME);
427+
ensureGreen(OTHER_INDEX_NAME);
428+
indexService = getIndexServiceFromRandomDataNode(OTHER_INDEX_NAME);
429+
assertEquals(-1, indexService.getRefreshTaskInterval().millis());
430+
}
431+
432+
public void testUpdateIndexWithMinusOneRefreshInterval() throws ExecutionException, InterruptedException {
433+
// This test checks that we are able to update index with -1 refresh interval using index settings and default interval both.
434+
String clusterManagerName = internalCluster().getClusterManagerName();
435+
client(clusterManagerName).admin()
436+
.cluster()
437+
.prepareUpdateSettings()
438+
.setTransientSettings(
439+
Settings.builder()
440+
.put(CLUSTER_MINIMUM_INDEX_REFRESH_INTERVAL_SETTING.getKey(), "10s")
441+
.put(CLUSTER_DEFAULT_INDEX_REFRESH_INTERVAL_SETTING.getKey(), "10s")
442+
)
443+
.get();
444+
445+
createIndex(INDEX_NAME);
446+
ensureGreen(INDEX_NAME);
447+
IndexService indexService = getIndexServiceFromRandomDataNode(INDEX_NAME);
448+
assertEquals(10, indexService.getRefreshTaskInterval().seconds());
449+
450+
client(clusterManagerName).admin()
451+
.indices()
452+
.updateSettings(
453+
new UpdateSettingsRequest(INDEX_NAME).settings(
454+
Settings.builder().put(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey(), randomFrom("-1", "-1ms"))
455+
)
456+
)
457+
.actionGet();
458+
assertEquals(-1, indexService.getRefreshTaskInterval().millis());
459+
460+
client(clusterManagerName).admin()
461+
.indices()
462+
.updateSettings(
463+
new UpdateSettingsRequest(INDEX_NAME).settings(
464+
Settings.builder().put(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey(), "100s")
465+
)
466+
)
467+
.actionGet();
468+
assertEquals(100, indexService.getRefreshTaskInterval().seconds());
469+
470+
client(clusterManagerName).admin()
471+
.cluster()
472+
.prepareUpdateSettings()
473+
.setTransientSettings(Settings.builder().put(CLUSTER_DEFAULT_INDEX_REFRESH_INTERVAL_SETTING.getKey(), randomFrom("-1", "-1ms")))
474+
.get();
475+
476+
client(clusterManagerName).admin()
477+
.indices()
478+
.updateSettings(
479+
new UpdateSettingsRequest(INDEX_NAME).settings(
480+
Settings.builder().putNull(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey())
481+
)
482+
)
483+
.actionGet();
484+
assertEquals(-1, indexService.getRefreshTaskInterval().millis());
485+
}
486+
487+
private IndexService getIndexServiceFromRandomDataNode(String indexName) throws ExecutionException, InterruptedException {
488+
String clusterManagerName = internalCluster().getClusterManagerName();
489+
List<String> dataNodes = new ArrayList<>(internalCluster().getDataNodeNames());
490+
GetIndexResponse getIndexResponse = client(clusterManagerName).admin().indices().getIndex(new GetIndexRequest()).get();
491+
IndicesService indicesService = internalCluster().getInstance(IndicesService.class, randomFrom(dataNodes));
492+
String uuid = getIndexResponse.getSettings().get(indexName).get(IndexMetadata.SETTING_INDEX_UUID);
493+
return indicesService.indexService(new Index(indexName, uuid));
494+
}
495+
369496
protected TimeValue getDefaultRefreshInterval() {
370497
return IndexSettings.DEFAULT_REFRESH_INTERVAL;
371498
}

server/src/main/java/org/opensearch/cluster/metadata/MetadataCreateIndexService.java

+6-1
Original file line numberDiff line numberDiff line change
@@ -1636,10 +1636,15 @@ public static void validateTranslogRetentionSettings(Settings indexSettings) {
16361636
* @param clusterSettings cluster setting
16371637
*/
16381638
public static void validateRefreshIntervalSettings(Settings requestSettings, ClusterSettings clusterSettings) {
1639-
if (IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.exists(requestSettings) == false) {
1639+
if (IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.exists(requestSettings) == false
1640+
|| requestSettings.get(IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.getKey()) == null) {
16401641
return;
16411642
}
16421643
TimeValue requestRefreshInterval = IndexSettings.INDEX_REFRESH_INTERVAL_SETTING.get(requestSettings);
1644+
// If the refresh interval supplied is -1, we allow the index to be created because -1 means no periodic refresh.
1645+
if (requestRefreshInterval.millis() == -1) {
1646+
return;
1647+
}
16431648
TimeValue clusterMinimumRefreshInterval = clusterSettings.get(IndicesService.CLUSTER_MINIMUM_INDEX_REFRESH_INTERVAL_SETTING);
16441649
if (requestRefreshInterval.millis() < clusterMinimumRefreshInterval.millis()) {
16451650
throw new IllegalArgumentException(

server/src/main/java/org/opensearch/indices/IndicesService.java

+5-2
Original file line numberDiff line numberDiff line change
@@ -273,8 +273,8 @@ public class IndicesService extends AbstractLifecycleComponent
273273
*/
274274
public static final Setting<TimeValue> CLUSTER_MINIMUM_INDEX_REFRESH_INTERVAL_SETTING = Setting.timeSetting(
275275
"cluster.minimum.index.refresh_interval",
276-
IndexSettings.MINIMUM_REFRESH_INTERVAL,
277-
IndexSettings.MINIMUM_REFRESH_INTERVAL,
276+
TimeValue.ZERO,
277+
TimeValue.ZERO,
278278
new ClusterMinimumRefreshIntervalValidator(),
279279
Property.NodeScope,
280280
Property.Dynamic
@@ -2009,6 +2009,9 @@ public Iterator<Setting<?>> settings() {
20092009
* @param defaultRefreshInterval value of cluster default index refresh interval setting
20102010
*/
20112011
private static void validateRefreshIntervalSettings(TimeValue minimumRefreshInterval, TimeValue defaultRefreshInterval) {
2012+
if (defaultRefreshInterval.millis() < 0) {
2013+
return;
2014+
}
20122015
if (minimumRefreshInterval.compareTo(defaultRefreshInterval) > 0) {
20132016
throw new IllegalArgumentException(
20142017
"cluster minimum index refresh interval ["

0 commit comments

Comments
 (0)