Skip to content

Commit 0e877a4

Browse files
authored
[7.16] Correct check for write index and increment generation on all DS backing index operations (elastic#80411)
1 parent 0e97db3 commit 0e877a4

File tree

4 files changed

+25
-10
lines changed

4 files changed

+25
-10
lines changed

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

Lines changed: 4 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -254,7 +254,7 @@ public DataStream removeBackingIndex(Index index) {
254254
List<Index> backingIndices = new ArrayList<>(indices);
255255
backingIndices.remove(index);
256256
assert backingIndices.size() == indices.size() - 1;
257-
return new DataStream(name, timeStampField, backingIndices, generation, metadata, hidden, replicated, system);
257+
return new DataStream(name, timeStampField, backingIndices, generation + 1, metadata, hidden, replicated, system);
258258
}
259259

260260
/**
@@ -275,18 +275,18 @@ public DataStream replaceBackingIndex(Index existingBackingIndex, Index newBacki
275275
String.format(Locale.ROOT, "index [%s] is not part of data stream [%s]", existingBackingIndex.getName(), name)
276276
);
277277
}
278-
if (generation == (backingIndexPosition + 1)) {
278+
if (indices.size() == (backingIndexPosition + 1)) {
279279
throw new IllegalArgumentException(
280280
String.format(
281281
Locale.ROOT,
282-
"cannot replace backing index [%s] of data stream [%s] because " + "it is the write index",
282+
"cannot replace backing index [%s] of data stream [%s] because it is the write index",
283283
existingBackingIndex.getName(),
284284
name
285285
)
286286
);
287287
}
288288
backingIndices.set(backingIndexPosition, newBackingIndex);
289-
return new DataStream(name, timeStampField, backingIndices, generation, metadata, hidden, replicated, system);
289+
return new DataStream(name, timeStampField, backingIndices, generation + 1, metadata, hidden, replicated, system);
290290
}
291291

292292
/**

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

Lines changed: 19 additions & 4 deletions
Original file line numberDiff line numberDiff line change
@@ -115,7 +115,7 @@ public void testRemoveBackingIndex() {
115115
DataStream original = new DataStream(dataStreamName, createTimestampField("@timestamp"), indices);
116116
DataStream updated = original.removeBackingIndex(indices.get(indexToRemove - 1));
117117
assertThat(updated.getName(), equalTo(original.getName()));
118-
assertThat(updated.getGeneration(), equalTo(original.getGeneration()));
118+
assertThat(updated.getGeneration(), equalTo(original.getGeneration() + 1));
119119
assertThat(updated.getTimeStampField(), equalTo(original.getTimeStampField()));
120120
assertThat(updated.getIndices().size(), equalTo(numBackingIndices - 1));
121121
for (int k = 0; k < (numBackingIndices - 1); k++) {
@@ -371,7 +371,7 @@ public void testReplaceBackingIndex() {
371371
Index newBackingIndex = new Index("replacement-index", UUIDs.randomBase64UUID(random()));
372372
DataStream updated = original.replaceBackingIndex(indices.get(indexToReplace), newBackingIndex);
373373
assertThat(updated.getName(), equalTo(original.getName()));
374-
assertThat(updated.getGeneration(), equalTo(original.getGeneration()));
374+
assertThat(updated.getGeneration(), equalTo(original.getGeneration() + 1));
375375
assertThat(updated.getTimeStampField(), equalTo(original.getTimeStampField()));
376376
assertThat(updated.getIndices().size(), equalTo(numBackingIndices));
377377
assertThat(updated.getIndices().get(indexToReplace), equalTo(newBackingIndex));
@@ -407,10 +407,25 @@ public void testReplaceBackingIndexThrowsExceptionIfReplacingWriteIndex() {
407407
for (int i = 1; i <= numBackingIndices; i++) {
408408
indices.add(new Index(DataStream.getDefaultBackingIndexName(dataStreamName, i), UUIDs.randomBase64UUID(random())));
409409
}
410-
DataStream original = new DataStream(dataStreamName, createTimestampField("@timestamp"), indices);
410+
int generation = randomBoolean() ? numBackingIndices : numBackingIndices + randomIntBetween(1, 5);
411+
DataStream original = new DataStream(dataStreamName, createTimestampField("@timestamp"), indices, generation, null);
411412

412413
Index newBackingIndex = new Index("replacement-index", UUIDs.randomBase64UUID(random()));
413-
expectThrows(IllegalArgumentException.class, () -> original.replaceBackingIndex(indices.get(writeIndexPosition), newBackingIndex));
414+
IllegalArgumentException e = expectThrows(
415+
IllegalArgumentException.class,
416+
() -> original.replaceBackingIndex(indices.get(writeIndexPosition), newBackingIndex)
417+
);
418+
assertThat(
419+
e.getMessage(),
420+
equalTo(
421+
String.format(
422+
Locale.ROOT,
423+
"cannot replace backing index [%s] of data stream [%s] because it is the write index",
424+
indices.get(writeIndexPosition).getName(),
425+
dataStreamName
426+
)
427+
)
428+
);
414429
}
415430

416431
public void testSnapshot() {

x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/data_stream/170_modify_data_stream.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -79,7 +79,7 @@
7979
name: "data-stream-for-modification"
8080
- match: { data_streams.0.name: data-stream-for-modification }
8181
- match: { data_streams.0.timestamp_field.name: '@timestamp' }
82-
- match: { data_streams.0.generation: 3 }
82+
- match: { data_streams.0.generation: 4 }
8383
- length: { data_streams.0.indices: 2 }
8484
- match: { data_streams.0.indices.0.index_name: $first_index }
8585
- match: { data_streams.0.indices.1.index_name: $write_index }

x-pack/plugin/src/yamlRestTest/resources/rest-api-spec/test/data_stream/50_delete_backing_indices.yml

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -62,7 +62,7 @@ setup:
6262
name: "*"
6363
- match: { data_streams.0.name: simple-data-stream }
6464
- match: { data_streams.0.timestamp_field.name: '@timestamp' }
65-
- match: { data_streams.0.generation: 2 }
65+
- match: { data_streams.0.generation: 3 }
6666
- length: { data_streams.0.indices: 1 }
6767
- match: { data_streams.0.indices.0.index_name: '/\.ds-simple-data-stream-(\d{4}\.\d{2}\.\d{2}-)?000002/' }
6868

0 commit comments

Comments
 (0)