Skip to content

Commit c3aaf33

Browse files
authored
Ignore matching data streams if include_data_streams is false (#57900)
1 parent 4579593 commit c3aaf33

File tree

6 files changed

+57
-94
lines changed

6 files changed

+57
-94
lines changed

build.gradle

+2-2
Original file line numberDiff line numberDiff line change
@@ -174,8 +174,8 @@ tasks.register("verifyVersions") {
174174
* after the backport of the backcompat code is complete.
175175
*/
176176

177-
boolean bwc_tests_enabled = true
178-
final String bwc_tests_disabled_issue = "" /* place a PR link here when committing bwc changes */
177+
boolean bwc_tests_enabled = false
178+
final String bwc_tests_disabled_issue = "https://github.com/elastic/elasticsearch/pull/57900" /* place a PR link here when committing bwc changes */
179179
if (bwc_tests_enabled == false) {
180180
if (bwc_tests_disabled_issue.isEmpty()) {
181181
throw new GradleException("bwc_tests_disabled_issue must be set when bwc_tests_enabled == false")

rest-api-spec/src/main/resources/rest-api-spec/test/indices.data_stream/20_unsupported_apis.yml

+1-1
Original file line numberDiff line numberDiff line change
@@ -43,7 +43,7 @@
4343
- match: { hits.hits.0._source.foo: 'bar' }
4444

4545
- do:
46-
catch: bad_request
46+
catch: missing
4747
indices.delete:
4848
index: logs-foobar
4949

server/src/internalClusterTest/java/org/elasticsearch/indices/DataStreamIT.java

+13-26
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,6 @@
3535
import org.elasticsearch.action.admin.indices.template.delete.DeleteComposableIndexTemplateAction;
3636
import org.elasticsearch.action.admin.indices.template.put.PutComposableIndexTemplateAction;
3737
import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryRequestBuilder;
38-
import org.elasticsearch.action.admin.indices.validate.query.ValidateQueryResponse;
3938
import org.elasticsearch.action.bulk.BulkItemResponse;
4039
import org.elasticsearch.action.bulk.BulkRequest;
4140
import org.elasticsearch.action.bulk.BulkResponse;
@@ -209,34 +208,22 @@ public void testOtherWriteOps() throws Exception {
209208
CreateDataStreamAction.Request createDataStreamRequest = new CreateDataStreamAction.Request(dataStreamName);
210209
client().admin().indices().createDataStream(createDataStreamRequest).get();
211210

212-
{
213-
BulkRequest bulkRequest = new BulkRequest()
214-
.add(new IndexRequest(dataStreamName).source("{\"@timestamp1\": \"2020-12-12\"}", XContentType.JSON));
215-
expectFailure(dataStreamName, () -> client().bulk(bulkRequest).actionGet());
216-
}
217-
{
218-
BulkRequest bulkRequest = new BulkRequest()
219-
.add(new DeleteRequest(dataStreamName, "_id"));
220-
expectFailure(dataStreamName, () -> client().bulk(bulkRequest).actionGet());
221-
}
222-
{
223-
BulkRequest bulkRequest = new BulkRequest()
224-
.add(new UpdateRequest(dataStreamName, "_id").doc("{\"@timestamp1\": \"2020-12-12\"}", XContentType.JSON));
225-
expectFailure(dataStreamName, () -> client().bulk(bulkRequest).actionGet());
226-
}
227211
{
228212
IndexRequest indexRequest = new IndexRequest(dataStreamName)
229213
.source("{\"@timestamp1\": \"2020-12-12\"}", XContentType.JSON);
230-
expectFailure(dataStreamName, () -> client().index(indexRequest).actionGet());
214+
Exception e = expectThrows(IndexNotFoundException.class, () -> client().index(indexRequest).actionGet());
215+
assertThat(e.getMessage(), equalTo("no such index [null]"));
231216
}
232217
{
233218
UpdateRequest updateRequest = new UpdateRequest(dataStreamName, "_id")
234219
.doc("{}", XContentType.JSON);
235-
expectFailure(dataStreamName, () -> client().update(updateRequest).actionGet());
220+
Exception e = expectThrows(IndexNotFoundException.class, () -> client().update(updateRequest).actionGet());
221+
assertThat(e.getMessage(), equalTo("no such index [null]"));
236222
}
237223
{
238224
DeleteRequest deleteRequest = new DeleteRequest(dataStreamName, "_id");
239-
expectFailure(dataStreamName, () -> client().delete(deleteRequest).actionGet());
225+
Exception e = expectThrows(IndexNotFoundException.class, () -> client().delete(deleteRequest).actionGet());
226+
assertThat(e.getMessage(), equalTo("no such index [null]"));
240227
}
241228
{
242229
IndexRequest indexRequest = new IndexRequest(dataStreamName)
@@ -428,7 +415,7 @@ public void testResolvabilityOfDataStreamsInAPIs() throws Exception {
428415
verifyResolvability(wildcardExpression, client().admin().indices().prepareUpgrade(wildcardExpression), false);
429416
verifyResolvability(wildcardExpression, client().admin().indices().prepareRecoveries(wildcardExpression), false);
430417
verifyResolvability(wildcardExpression, client().admin().indices().prepareUpgradeStatus(wildcardExpression), false);
431-
verifyResolvability(wildcardExpression, getAliases(wildcardExpression), true);
418+
verifyResolvability(wildcardExpression, getAliases(wildcardExpression), false);
432419
verifyResolvability(wildcardExpression, getFieldMapping(wildcardExpression), false);
433420
verifyResolvability(wildcardExpression,
434421
putMapping("{\"_doc\":{\"properties\": {\"my_field\":{\"type\":\"keyword\"}}}}", wildcardExpression), false);
@@ -477,7 +464,8 @@ public void testAliasActionsFailOnDataStreams() throws Exception {
477464
.index(dataStreamName).aliases("foo");
478465
IndicesAliasesRequest aliasesAddRequest = new IndicesAliasesRequest();
479466
aliasesAddRequest.addAliasAction(addAction);
480-
expectFailure(dataStreamName, () -> client().admin().indices().aliases(aliasesAddRequest).actionGet());
467+
Exception e = expectThrows(IndexNotFoundException.class, () -> client().admin().indices().aliases(aliasesAddRequest).actionGet());
468+
assertThat(e.getMessage(), equalTo("no such index [" + dataStreamName +"]"));
481469
}
482470

483471
public void testAliasActionsFailOnDataStreamBackingIndices() throws Exception {
@@ -789,19 +777,18 @@ private static void verifyResolvability(String dataStream, ActionRequestBuilder
789777

790778
private static void verifyResolvability(String dataStream, ActionRequestBuilder requestBuilder, boolean fail, long expectedCount) {
791779
if (fail) {
792-
String expectedErrorMessage = "The provided expression [" + dataStream +
793-
"] matches a data stream, specify the corresponding concrete indices instead.";
780+
String expectedErrorMessage = "no such index [" + dataStream + "]";
794781
if (requestBuilder instanceof MultiSearchRequestBuilder) {
795782
MultiSearchResponse multiSearchResponse = ((MultiSearchRequestBuilder) requestBuilder).get();
796783
assertThat(multiSearchResponse.getResponses().length, equalTo(1));
797784
assertThat(multiSearchResponse.getResponses()[0].isFailure(), is(true));
798785
assertThat(multiSearchResponse.getResponses()[0].getFailure(), instanceOf(IllegalArgumentException.class));
799786
assertThat(multiSearchResponse.getResponses()[0].getFailure().getMessage(), equalTo(expectedErrorMessage));
800787
} else if (requestBuilder instanceof ValidateQueryRequestBuilder) {
801-
ValidateQueryResponse response = (ValidateQueryResponse) requestBuilder.get();
802-
assertThat(response.getQueryExplanation().get(0).getError(), equalTo(expectedErrorMessage));
788+
Exception e = expectThrows(IndexNotFoundException.class, requestBuilder::get);
789+
assertThat(e.getMessage(), equalTo(expectedErrorMessage));
803790
} else {
804-
Exception e = expectThrows(IllegalArgumentException.class, requestBuilder::get);
791+
Exception e = expectThrows(IndexNotFoundException.class, requestBuilder::get);
805792
assertThat(e.getMessage(), equalTo(expectedErrorMessage));
806793
}
807794
} else {

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

+13-22
Original file line numberDiff line numberDiff line change
@@ -224,7 +224,7 @@ Index[] concreteIndices(Context context, String... indexExpressions) {
224224
}
225225
} else if (indexAbstraction.getType() == IndexAbstraction.Type.DATA_STREAM &&
226226
context.includeDataStreams() == false) {
227-
throw dataStreamsNotSupportedException(expression);
227+
continue;
228228
}
229229

230230
if (indexAbstraction.getType() == IndexAbstraction.Type.ALIAS && context.isResolveToWriteIndex()) {
@@ -298,11 +298,6 @@ private static IllegalArgumentException aliasesNotSupportedException(String expr
298298
"alias, specify the corresponding concrete indices instead.");
299299
}
300300

301-
private static IllegalArgumentException dataStreamsNotSupportedException(String expression) {
302-
return new IllegalArgumentException("The provided expression [" + expression + "] matches a " +
303-
"data stream, specify the corresponding concrete indices instead.");
304-
}
305-
306301
/**
307302
* Utility method that allows to resolve an index expression to its corresponding single concrete index.
308303
* Callers should make sure they provide proper {@link org.elasticsearch.action.support.IndicesOptions}
@@ -354,7 +349,12 @@ public Index concreteWriteIndex(ClusterState state, IndicesRequest request) {
354349
*/
355350
public Index concreteWriteIndex(ClusterState state, IndicesOptions options, String index, boolean allowNoIndices,
356351
boolean includeDataStreams) {
357-
Context context = new Context(state, options, false, true, includeDataStreams);
352+
IndicesOptions combinedOptions = IndicesOptions.fromOptions(options.ignoreUnavailable(), allowNoIndices,
353+
options.expandWildcardsOpen(), options.expandWildcardsClosed(), options.expandWildcardsHidden(),
354+
options.allowAliasesToMultipleIndices(), options.forbidClosedIndices(), options.ignoreAliases(),
355+
options.ignoreThrottled());
356+
357+
Context context = new Context(state, combinedOptions, false, true, includeDataStreams);
358358
Index[] indices = concreteIndices(context, index);
359359
if (allowNoIndices && indices.length == 0) {
360360
return null;
@@ -729,10 +729,6 @@ public List<String> resolve(Context context, List<String> expressions) {
729729
}
730730

731731
if (isEmptyOrTrivialWildcard(expressions)) {
732-
if (context.includeDataStreams() == false && metadata.dataStreams().isEmpty() == false) {
733-
throw dataStreamsNotSupportedException(expressions.toString());
734-
}
735-
736732
List<String> resolvedExpressions = resolveEmptyOrTrivialWildcard(options, metadata);
737733
if (context.includeDataStreams()) {
738734
final IndexMetadata.State excludeState = excludeState(options);
@@ -797,8 +793,8 @@ private Set<String> innerResolve(Context context, List<String> expressions, Indi
797793
} else if (indexAbstraction.getType() == IndexAbstraction.Type.ALIAS && options.ignoreAliases()) {
798794
throw aliasesNotSupportedException(expression);
799795
} else if (indexAbstraction.getType() == IndexAbstraction.Type.DATA_STREAM &&
800-
context.includeDataStreams() == false) {
801-
throw dataStreamsNotSupportedException(expression);
796+
context.includeDataStreams() == false) {
797+
throw indexNotFoundException(expression);
802798
}
803799
}
804800
if (add) {
@@ -878,7 +874,7 @@ private static IndexMetadata.State excludeState(IndicesOptions options) {
878874

879875
public static Map<String, IndexAbstraction> matches(Context context, Metadata metadata, String expression) {
880876
if (Regex.isMatchAllPattern(expression)) {
881-
return filterIndicesLookup(context, metadata.getIndicesLookup(), null, expression, context.getOptions());
877+
return filterIndicesLookup(context, metadata.getIndicesLookup(), null, context.getOptions());
882878
} else if (expression.indexOf("*") == expression.length() - 1) {
883879
return suffixWildcard(context, metadata, expression);
884880
} else {
@@ -893,18 +889,17 @@ private static Map<String, IndexAbstraction> suffixWildcard(Context context, Met
893889
toPrefixCharArr[toPrefixCharArr.length - 1]++;
894890
String toPrefix = new String(toPrefixCharArr);
895891
SortedMap<String, IndexAbstraction> subMap = metadata.getIndicesLookup().subMap(fromPrefix, toPrefix);
896-
return filterIndicesLookup(context, subMap, null, expression, context.getOptions());
892+
return filterIndicesLookup(context, subMap, null, context.getOptions());
897893
}
898894

899895
private static Map<String, IndexAbstraction> otherWildcard(Context context, Metadata metadata, String expression) {
900896
final String pattern = expression;
901897
return filterIndicesLookup(context, metadata.getIndicesLookup(), e -> Regex.simpleMatch(pattern, e.getKey()),
902-
expression, context.getOptions());
898+
context.getOptions());
903899
}
904900

905901
private static Map<String, IndexAbstraction> filterIndicesLookup(Context context, SortedMap<String, IndexAbstraction> indicesLookup,
906902
Predicate<? super Map.Entry<String, IndexAbstraction>> filter,
907-
String expression,
908903
IndicesOptions options) {
909904
boolean shouldConsumeStream = false;
910905
Stream<Map.Entry<String, IndexAbstraction>> stream = indicesLookup.entrySet().stream();
@@ -918,11 +913,7 @@ private static Map<String, IndexAbstraction> filterIndicesLookup(Context context
918913
}
919914
if (context.includeDataStreams() == false) {
920915
shouldConsumeStream = true;
921-
stream = stream.peek(e -> {
922-
if (e.getValue().getType() == IndexAbstraction.Type.DATA_STREAM) {
923-
throw dataStreamsNotSupportedException(expression);
924-
}
925-
});
916+
stream = stream.filter(e -> e.getValue().getType() != IndexAbstraction.Type.DATA_STREAM);
926917
}
927918
if (shouldConsumeStream) {
928919
return stream.collect(Collectors.toMap(Map.Entry::getKey, Map.Entry::getValue));

0 commit comments

Comments
 (0)