From e6a689d7f95e6231025cec643153c0104df4d099 Mon Sep 17 00:00:00 2001 From: John Verwolf Date: Fri, 28 Mar 2025 12:14:57 -0700 Subject: [PATCH] Fix system data stream restore warning (#125881) This PR fixes a bug in the RestoreService whereby the validation logic for index templates didn't account for system datastreams. --- docs/changelog/125881.yaml | 5 +++ .../snapshots/RestoreService.java | 14 +++++- .../snapshots/RestoreServiceTests.java | 45 +++++++++++++++++++ 3 files changed, 62 insertions(+), 2 deletions(-) create mode 100644 docs/changelog/125881.yaml diff --git a/docs/changelog/125881.yaml b/docs/changelog/125881.yaml new file mode 100644 index 0000000000000..0228d937c423a --- /dev/null +++ b/docs/changelog/125881.yaml @@ -0,0 +1,5 @@ +pr: 125881 +summary: Fixes a invalid warning from being issued when restoring a system data stream from a snapshot. +area: "Data streams" +type: bug +issues: [] diff --git a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java index 3cfa1381e6132..e5f4ec70e4af4 100644 --- a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java +++ b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java @@ -537,9 +537,19 @@ private void validateDataStreamTemplatesExistAndWarnIfMissing( Set templatePatterns = streams.filter(cit -> cit.getDataStreamTemplate() != null) .flatMap(cit -> cit.indexPatterns().stream()) .collect(Collectors.toSet()); + warnIfIndexTemplateMissing(dataStreamsToRestore, templatePatterns, snapshotInfo); + } - for (String name : dataStreamsToRestore.keySet()) { - if (templatePatterns.stream().noneMatch(pattern -> Regex.simpleMatch(pattern, name))) { + // Visible for testing + static void warnIfIndexTemplateMissing( + Map dataStreamsToRestore, + Set templatePatterns, + SnapshotInfo snapshotInfo + ) { + for (var entry : dataStreamsToRestore.entrySet()) { + String name = entry.getKey(); + DataStream dataStream = entry.getValue(); + if (dataStream.isSystem() == false && templatePatterns.stream().noneMatch(pattern -> Regex.simpleMatch(pattern, name))) { String warningMessage = format( "Snapshot [%s] contains data stream [%s] but custer does not have a matching index template. This will cause" + " rollover to fail until a matching index template is created", diff --git a/server/src/test/java/org/elasticsearch/snapshots/RestoreServiceTests.java b/server/src/test/java/org/elasticsearch/snapshots/RestoreServiceTests.java index 0213ee9046462..cf18522758af1 100644 --- a/server/src/test/java/org/elasticsearch/snapshots/RestoreServiceTests.java +++ b/server/src/test/java/org/elasticsearch/snapshots/RestoreServiceTests.java @@ -36,6 +36,7 @@ import java.util.Set; import java.util.concurrent.atomic.AtomicBoolean; +import static org.elasticsearch.core.Strings.format; import static org.hamcrest.Matchers.empty; import static org.hamcrest.Matchers.equalTo; import static org.mockito.ArgumentMatchers.any; @@ -48,6 +49,50 @@ public class RestoreServiceTests extends ESTestCase { + /** + * Test that {@link RestoreService#warnIfIndexTemplateMissing(Map, Set, SnapshotInfo)} does not warn for system + * datastreams. + */ + public void testWarnIfIndexTemplateMissingSkipsSystemDataStreams() throws Exception { + String dataStreamName = ".test-system-data-stream"; + String backingIndexName = DataStream.getDefaultBackingIndexName(dataStreamName, 1); + List indices = List.of(new Index(backingIndexName, randomUUID())); + + var dataStream = DataStream.builder(dataStreamName, indices).setSystem(true).setHidden(true).build(); + var dataStreamsToRestore = Map.of(dataStreamName, dataStream); + var templatePatterns = Set.of("matches_none"); + var snapshotInfo = createSnapshotInfo(new Snapshot("repository", new SnapshotId("name", "uuid")), Boolean.FALSE); + + RestoreService.warnIfIndexTemplateMissing(dataStreamsToRestore, templatePatterns, snapshotInfo); + + ensureNoWarnings(); + } + + /** + * Test that {@link RestoreService#warnIfIndexTemplateMissing(Map, Set, SnapshotInfo)} warns for non-system datastreams. + */ + public void testWarnIfIndexTemplateMissing() throws Exception { + String dataStreamName = ".test-system-data-stream"; + String backingIndexName = DataStream.getDefaultBackingIndexName(dataStreamName, 1); + List indices = List.of(new Index(backingIndexName, randomUUID())); + + var dataStream = DataStream.builder(dataStreamName, indices).build(); + var dataStreamsToRestore = Map.of(dataStreamName, dataStream); + var templatePatterns = Set.of("matches_none"); + var snapshotInfo = createSnapshotInfo(new Snapshot("repository", new SnapshotId("name", "uuid")), Boolean.FALSE); + + RestoreService.warnIfIndexTemplateMissing(dataStreamsToRestore, templatePatterns, snapshotInfo); + + assertWarnings( + format( + "Snapshot [%s] contains data stream [%s] but custer does not have a matching index template. This will cause" + + " rollover to fail until a matching index template is created", + snapshotInfo.snapshotId(), + dataStreamName + ) + ); + } + public void testUpdateDataStream() { long now = System.currentTimeMillis(); String dataStreamName = "data-stream-1";