Skip to content

Commit e6a689d

Browse files
committed
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.
1 parent 1141602 commit e6a689d

File tree

3 files changed

+62
-2
lines changed

3 files changed

+62
-2
lines changed

docs/changelog/125881.yaml

Lines changed: 5 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,5 @@
1+
pr: 125881
2+
summary: Fixes a invalid warning from being issued when restoring a system data stream from a snapshot.
3+
area: "Data streams"
4+
type: bug
5+
issues: []

server/src/main/java/org/elasticsearch/snapshots/RestoreService.java

Lines changed: 12 additions & 2 deletions
Original file line numberDiff line numberDiff line change
@@ -537,9 +537,19 @@ private void validateDataStreamTemplatesExistAndWarnIfMissing(
537537
Set<String> templatePatterns = streams.filter(cit -> cit.getDataStreamTemplate() != null)
538538
.flatMap(cit -> cit.indexPatterns().stream())
539539
.collect(Collectors.toSet());
540+
warnIfIndexTemplateMissing(dataStreamsToRestore, templatePatterns, snapshotInfo);
541+
}
540542

541-
for (String name : dataStreamsToRestore.keySet()) {
542-
if (templatePatterns.stream().noneMatch(pattern -> Regex.simpleMatch(pattern, name))) {
543+
// Visible for testing
544+
static void warnIfIndexTemplateMissing(
545+
Map<String, DataStream> dataStreamsToRestore,
546+
Set<String> templatePatterns,
547+
SnapshotInfo snapshotInfo
548+
) {
549+
for (var entry : dataStreamsToRestore.entrySet()) {
550+
String name = entry.getKey();
551+
DataStream dataStream = entry.getValue();
552+
if (dataStream.isSystem() == false && templatePatterns.stream().noneMatch(pattern -> Regex.simpleMatch(pattern, name))) {
543553
String warningMessage = format(
544554
"Snapshot [%s] contains data stream [%s] but custer does not have a matching index template. This will cause"
545555
+ " rollover to fail until a matching index template is created",

server/src/test/java/org/elasticsearch/snapshots/RestoreServiceTests.java

Lines changed: 45 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -36,6 +36,7 @@
3636
import java.util.Set;
3737
import java.util.concurrent.atomic.AtomicBoolean;
3838

39+
import static org.elasticsearch.core.Strings.format;
3940
import static org.hamcrest.Matchers.empty;
4041
import static org.hamcrest.Matchers.equalTo;
4142
import static org.mockito.ArgumentMatchers.any;
@@ -48,6 +49,50 @@
4849

4950
public class RestoreServiceTests extends ESTestCase {
5051

52+
/**
53+
* Test that {@link RestoreService#warnIfIndexTemplateMissing(Map, Set, SnapshotInfo)} does not warn for system
54+
* datastreams.
55+
*/
56+
public void testWarnIfIndexTemplateMissingSkipsSystemDataStreams() throws Exception {
57+
String dataStreamName = ".test-system-data-stream";
58+
String backingIndexName = DataStream.getDefaultBackingIndexName(dataStreamName, 1);
59+
List<Index> indices = List.of(new Index(backingIndexName, randomUUID()));
60+
61+
var dataStream = DataStream.builder(dataStreamName, indices).setSystem(true).setHidden(true).build();
62+
var dataStreamsToRestore = Map.of(dataStreamName, dataStream);
63+
var templatePatterns = Set.of("matches_none");
64+
var snapshotInfo = createSnapshotInfo(new Snapshot("repository", new SnapshotId("name", "uuid")), Boolean.FALSE);
65+
66+
RestoreService.warnIfIndexTemplateMissing(dataStreamsToRestore, templatePatterns, snapshotInfo);
67+
68+
ensureNoWarnings();
69+
}
70+
71+
/**
72+
* Test that {@link RestoreService#warnIfIndexTemplateMissing(Map, Set, SnapshotInfo)} warns for non-system datastreams.
73+
*/
74+
public void testWarnIfIndexTemplateMissing() throws Exception {
75+
String dataStreamName = ".test-system-data-stream";
76+
String backingIndexName = DataStream.getDefaultBackingIndexName(dataStreamName, 1);
77+
List<Index> indices = List.of(new Index(backingIndexName, randomUUID()));
78+
79+
var dataStream = DataStream.builder(dataStreamName, indices).build();
80+
var dataStreamsToRestore = Map.of(dataStreamName, dataStream);
81+
var templatePatterns = Set.of("matches_none");
82+
var snapshotInfo = createSnapshotInfo(new Snapshot("repository", new SnapshotId("name", "uuid")), Boolean.FALSE);
83+
84+
RestoreService.warnIfIndexTemplateMissing(dataStreamsToRestore, templatePatterns, snapshotInfo);
85+
86+
assertWarnings(
87+
format(
88+
"Snapshot [%s] contains data stream [%s] but custer does not have a matching index template. This will cause"
89+
+ " rollover to fail until a matching index template is created",
90+
snapshotInfo.snapshotId(),
91+
dataStreamName
92+
)
93+
);
94+
}
95+
5196
public void testUpdateDataStream() {
5297
long now = System.currentTimeMillis();
5398
String dataStreamName = "data-stream-1";

0 commit comments

Comments
 (0)