Skip to content

Commit 64005c4

Browse files
authored
System data streams incorrectly show up in the list of template validation problems (#128161) (#128214)
1 parent 0b82f55 commit 64005c4

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
@@ -838,7 +838,13 @@ static void validateDataStreamOptions(Metadata metadata, String indexTemplateNam
838838
* addition/update time
839839
*/
840840
private static void validateDataStreamsStillReferenced(ClusterState state, String templateName, ComposableIndexTemplate newTemplate) {
841-
final Set<String> dataStreams = state.metadata().dataStreams().keySet();
841+
final Set<String> dataStreams = state.metadata()
842+
.dataStreams()
843+
.entrySet()
844+
.stream()
845+
.filter(entry -> entry.getValue().isSystem() == false)
846+
.map(Map.Entry::getKey)
847+
.collect(Collectors.toSet());
842848

843849
Function<Metadata, Set<String>> findUnreferencedDataStreams = meta -> {
844850
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;
@@ -1693,6 +1694,81 @@ public void testInvalidNonDataStreamTemplateWithDataStreamOptions() throws Excep
16931694
);
16941695
}
16951696

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

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

0 commit comments

Comments
 (0)