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 acea889be07b3..5cd45dba4551e 100644 --- a/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java +++ b/server/src/main/java/org/elasticsearch/snapshots/RestoreService.java @@ -539,9 +539,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 5fddadc9cdbe3..259fc6fea6935 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";