Skip to content

Commit 6b4bdc8

Browse files
authored
System data streams incorrectly show up in the list of template validation problems (#128161) (#128210)
1 parent 42b9a41 commit 6b4bdc8

File tree

4 files changed

+96
-3
lines changed

4 files changed

+96
-3
lines changed

docs/changelog/128161.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 128161
2+
summary: Fix system data streams incorrectly showing up in the list of template validation
3+
problems
4+
area: Data streams
5+
type: bug
6+
issues: []

server/src/main/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateService.java

Lines changed: 7 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -865,7 +865,13 @@ static void validateDataStreamOptions(
865865
* addition/update time
866866
*/
867867
private static void validateDataStreamsStillReferenced(ClusterState state, String templateName, ComposableIndexTemplate newTemplate) {
868-
final Set<String> dataStreams = state.metadata().dataStreams().keySet();
868+
final Set<String> dataStreams = state.metadata()
869+
.dataStreams()
870+
.entrySet()
871+
.stream()
872+
.filter(entry -> entry.getValue().isSystem() == false)
873+
.map(Map.Entry::getKey)
874+
.collect(Collectors.toSet());
869875

870876
Function<Metadata, Set<String>> findUnreferencedDataStreams = meta -> {
871877
final Set<String> unreferenced = new HashSet<>();

server/src/test/java/org/elasticsearch/cluster/metadata/MetadataIndexTemplateServiceTests.java

Lines changed: 76 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -23,6 +23,7 @@
2323
import org.elasticsearch.common.settings.IndexScopedSettings;
2424
import org.elasticsearch.common.settings.Settings;
2525
import org.elasticsearch.common.util.concurrent.ThreadContext;
26+
import org.elasticsearch.core.Strings;
2627
import org.elasticsearch.core.TimeValue;
2728
import org.elasticsearch.env.Environment;
2829
import org.elasticsearch.health.node.selection.HealthNodeTaskExecutor;
@@ -1698,6 +1699,81 @@ public void testInvalidNonDataStreamTemplateWithDataStreamOptions() throws Excep
16981699
);
16991700
}
17001701

1702+
public void testSystemDataStreamsIgnoredByValidateIndexTemplateV2() throws Exception {
1703+
/*
1704+
* This test makes sure that system data streams (which do not have named templates) do not appear in the list of data streams
1705+
* without named templates when validateIndexTemplateV2 fails due to another non-system data stream not having a named template.
1706+
*/
1707+
MetadataIndexTemplateService metadataIndexTemplateService = getMetadataIndexTemplateService();
1708+
final String dataStreamTemplateName = "data_stream_template";
1709+
final String indexTemplateName = "index_template";
1710+
final String systemDataStreamName = "system_ds";
1711+
final String ordinaryDataStreamName = "my_ds";
1712+
final String ordinaryDataStreamIndexPattern = "my_ds*";
1713+
ComposableIndexTemplate highPriorityDataStreamTemplate = ComposableIndexTemplate.builder()
1714+
.indexPatterns(List.of(ordinaryDataStreamIndexPattern))
1715+
.priority(275L)
1716+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(randomBoolean(), randomBoolean()))
1717+
.build();
1718+
ComposableIndexTemplate highPriorityIndexTemplate = ComposableIndexTemplate.builder()
1719+
.indexPatterns(List.of(ordinaryDataStreamIndexPattern))
1720+
.priority(200L)
1721+
.build();
1722+
ClusterState clusterState = ClusterState.builder(ClusterState.EMPTY_STATE)
1723+
.metadata(
1724+
Metadata.builder()
1725+
.dataStreams(
1726+
Map.of(
1727+
systemDataStreamName,
1728+
DataStreamTestHelper.randomInstance(systemDataStreamName, System::currentTimeMillis, randomBoolean(), true),
1729+
ordinaryDataStreamName,
1730+
DataStreamTestHelper.randomInstance(ordinaryDataStreamName, System::currentTimeMillis, randomBoolean(), false)
1731+
),
1732+
Map.of()
1733+
)
1734+
.indexTemplates(
1735+
Map.of(dataStreamTemplateName, highPriorityDataStreamTemplate, indexTemplateName, highPriorityIndexTemplate)
1736+
)
1737+
)
1738+
.build();
1739+
ComposableIndexTemplate lowPriorityDataStreamTemplate = ComposableIndexTemplate.builder()
1740+
.indexPatterns(List.of(ordinaryDataStreamIndexPattern))
1741+
.priority(1L)
1742+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(randomBoolean(), randomBoolean()))
1743+
.build();
1744+
/*
1745+
* Here we attempt to change the priority of a template that matches an existing non-system data stream so that it is so low that
1746+
* the data stream matches the index (non data-stream) template instead. We expect an error, but that the error only mentions the
1747+
* non-system data stream.
1748+
*/
1749+
Exception exception = expectThrows(
1750+
Exception.class,
1751+
() -> metadataIndexTemplateService.validateIndexTemplateV2(dataStreamTemplateName, lowPriorityDataStreamTemplate, clusterState)
1752+
);
1753+
assertThat(
1754+
exception.getMessage(),
1755+
containsString(
1756+
Strings.format(
1757+
"composable template [%s] with index patterns [%s], priority [1] would cause data streams [%s] to no longer "
1758+
+ "match a data stream template",
1759+
dataStreamTemplateName,
1760+
ordinaryDataStreamIndexPattern,
1761+
ordinaryDataStreamName
1762+
)
1763+
)
1764+
);
1765+
ComposableIndexTemplate mediumPriorityDataStreamTemplate = ComposableIndexTemplate.builder()
1766+
.indexPatterns(List.of(ordinaryDataStreamIndexPattern))
1767+
.priority(201L)
1768+
.dataStreamTemplate(new ComposableIndexTemplate.DataStreamTemplate(randomBoolean(), randomBoolean()))
1769+
.build();
1770+
/*
1771+
* We have now corrected the problem -- the priority of the new template is lower than the old data stream template but still higher
1772+
* than the non-data-stream index template. So we expect no validation errors.
1773+
*/
1774+
metadataIndexTemplateService.validateIndexTemplateV2(dataStreamTemplateName, mediumPriorityDataStreamTemplate, clusterState);
1775+
}
1776+
17011777
private ClusterState addComponentTemplate(
17021778
MetadataIndexTemplateService service,
17031779
ClusterState state,

test/framework/src/main/java/org/elasticsearch/cluster/metadata/DataStreamTestHelper.java

Lines changed: 7 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -341,6 +341,11 @@ public static DataStream randomInstance(LongSupplier timeProvider, boolean failu
341341
}
342342

343343
public static DataStream randomInstance(String dataStreamName, LongSupplier timeProvider, boolean failureStore) {
344+
// Some tests don't work well with system data streams, since these data streams require special handling
345+
return randomInstance(dataStreamName, timeProvider, failureStore, false);
346+
}
347+
348+
public static DataStream randomInstance(String dataStreamName, LongSupplier timeProvider, boolean failureStore, boolean system) {
344349
List<Index> indices = randomIndexInstances();
345350
long generation = indices.size() + ESTestCase.randomLongBetween(1, 128);
346351
indices.add(new Index(getDefaultBackingIndexName(dataStreamName, generation), UUIDs.randomBase64UUID(LuceneTestCase.random())));
@@ -365,9 +370,9 @@ public static DataStream randomInstance(String dataStreamName, LongSupplier time
365370
dataStreamName,
366371
generation,
367372
metadata,
368-
randomBoolean(),
373+
system ? true : randomBoolean(),
369374
replicated,
370-
false, // Some tests don't work well with system data streams, since these data streams require special handling
375+
system,
371376
timeProvider,
372377
randomBoolean(),
373378
randomBoolean() ? IndexMode.STANDARD : null, // IndexMode.TIME_SERIES triggers validation that many unit tests doesn't pass

0 commit comments

Comments
 (0)