Skip to content

Commit bfefe8d

Browse files
authored
Fields caps does not honour ignore_unavailable (#116021) (#116430)
The IndicesOption has been updated into the FieldCapabilitiesRequest to encapsulate the following logic. If we target a closed index and ignore_unavailable=false, we get an IndexClosedException, otherwise if the request contains ignore_unavailable=true, we safely skip the closed index. (cherry picked from commit 3ae7921)
1 parent c57f452 commit bfefe8d

File tree

4 files changed

+73
-1
lines changed

4 files changed

+73
-1
lines changed

docs/changelog/116021.yaml

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -0,0 +1,6 @@
1+
pr: 116021
2+
summary: Fields caps does not honour ignore_unavailable
3+
area: Search
4+
type: bug
5+
issues:
6+
- 107767

server/src/internalClusterTest/java/org/elasticsearch/search/fieldcaps/FieldCapabilitiesIT.java

Lines changed: 60 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -14,13 +14,15 @@
1414
import org.apache.logging.log4j.Level;
1515
import org.elasticsearch.ElasticsearchException;
1616
import org.elasticsearch.action.admin.cluster.reroute.ClusterRerouteUtils;
17+
import org.elasticsearch.action.admin.indices.close.CloseIndexRequest;
1718
import org.elasticsearch.action.fieldcaps.FieldCapabilities;
1819
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesFailure;
1920
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesRequest;
2021
import org.elasticsearch.action.fieldcaps.FieldCapabilitiesResponse;
2122
import org.elasticsearch.action.fieldcaps.TransportFieldCapabilitiesAction;
2223
import org.elasticsearch.action.index.IndexRequestBuilder;
2324
import org.elasticsearch.action.support.ActiveShardCount;
25+
import org.elasticsearch.action.support.IndicesOptions;
2426
import org.elasticsearch.action.support.PlainActionFuture;
2527
import org.elasticsearch.client.Cancellable;
2628
import org.elasticsearch.client.Request;
@@ -45,6 +47,7 @@
4547
import org.elasticsearch.index.query.SearchExecutionContext;
4648
import org.elasticsearch.index.shard.IndexShard;
4749
import org.elasticsearch.index.shard.ShardId;
50+
import org.elasticsearch.indices.IndexClosedException;
4851
import org.elasticsearch.indices.IndicesService;
4952
import org.elasticsearch.plugins.FieldPredicate;
5053
import org.elasticsearch.plugins.MapperPlugin;
@@ -319,6 +322,63 @@ public void testWithIndexAlias() {
319322
assertEquals(response1, response2);
320323
}
321324

325+
public void testNoIndices() {
326+
boolean ignoreUnavailable = false;
327+
IndicesOptions options = IndicesOptions.fromOptions(ignoreUnavailable, true, true, false, true, true, false, false);
328+
client().admin().indices().close(new CloseIndexRequest("old_index")).actionGet();
329+
FieldCapabilitiesResponse response = client().prepareFieldCaps().setFields("*").setIndicesOptions(options).get();
330+
assertIndices(response, "new_index");
331+
}
332+
333+
public void testNoIndicesIgnoreUnavailable() {
334+
boolean ignoreUnavailable = true;
335+
IndicesOptions options = IndicesOptions.fromOptions(ignoreUnavailable, true, true, false, true, true, false, false);
336+
client().admin().indices().close(new CloseIndexRequest("old_index")).actionGet();
337+
FieldCapabilitiesResponse response = client().prepareFieldCaps().setFields("*").setIndicesOptions(options).get();
338+
assertIndices(response, "new_index");
339+
}
340+
341+
public void testOneClosedIndex() {
342+
boolean ignoreUnavailable = false;
343+
IndicesOptions options = IndicesOptions.fromOptions(ignoreUnavailable, true, true, false, true, true, false, false);
344+
client().admin().indices().close(new CloseIndexRequest("old_index")).actionGet();
345+
IndexClosedException ex = expectThrows(
346+
IndexClosedException.class,
347+
client().prepareFieldCaps("old_index").setFields("*").setIndicesOptions(options)
348+
);
349+
assertEquals("closed", ex.getMessage());
350+
}
351+
352+
public void testOneClosedIndexIgnoreUnavailable() {
353+
boolean ignoreUnavailable = true;
354+
IndicesOptions options = IndicesOptions.fromOptions(ignoreUnavailable, true, true, false, true, true, false, false);
355+
client().admin().indices().close(new CloseIndexRequest("old_index")).actionGet();
356+
FieldCapabilitiesResponse response = client().prepareFieldCaps("old_index").setFields("*").setIndicesOptions(options).get();
357+
assertIndices(response);
358+
}
359+
360+
public void testTwoIndicesOneClosed() {
361+
boolean ignoreUnavailable = false;
362+
IndicesOptions options = IndicesOptions.fromOptions(ignoreUnavailable, true, true, false, true, true, false, false);
363+
client().admin().indices().close(new CloseIndexRequest("old_index")).actionGet();
364+
IndexClosedException ex = expectThrows(
365+
IndexClosedException.class,
366+
client().prepareFieldCaps("old_index", "new_index").setFields("*").setIndicesOptions(options)
367+
);
368+
assertEquals("closed", ex.getMessage());
369+
}
370+
371+
public void testTwoIndicesOneClosedIgnoreUnavailable() {
372+
boolean ignoreUnavailable = true;
373+
IndicesOptions options = IndicesOptions.fromOptions(ignoreUnavailable, true, true, false, true, true, false, false);
374+
client().admin().indices().close(new CloseIndexRequest("old_index")).actionGet();
375+
FieldCapabilitiesResponse response = client().prepareFieldCaps("old_index", "new_index")
376+
.setFields("*")
377+
.setIndicesOptions(options)
378+
.get();
379+
assertIndices(response, "new_index");
380+
}
381+
322382
public void testWithIndexFilter() throws InterruptedException {
323383
assertAcked(prepareCreate("index-1").setMapping("timestamp", "type=date", "field1", "type=keyword"));
324384
assertAcked(prepareCreate("index-2").setMapping("timestamp", "type=date", "field1", "type=long"));

server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -35,7 +35,7 @@
3535

3636
public final class FieldCapabilitiesRequest extends ActionRequest implements IndicesRequest.Replaceable, ToXContentObject {
3737
public static final String NAME = "field_caps_request";
38-
public static final IndicesOptions DEFAULT_INDICES_OPTIONS = IndicesOptions.strictExpandOpen();
38+
public static final IndicesOptions DEFAULT_INDICES_OPTIONS = IndicesOptions.strictExpandOpenAndForbidClosed();
3939

4040
private String[] indices = Strings.EMPTY_ARRAY;
4141
private IndicesOptions indicesOptions = DEFAULT_INDICES_OPTIONS;

server/src/main/java/org/elasticsearch/action/fieldcaps/FieldCapabilitiesRequestBuilder.java

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -10,6 +10,7 @@
1010
package org.elasticsearch.action.fieldcaps;
1111

1212
import org.elasticsearch.action.ActionRequestBuilder;
13+
import org.elasticsearch.action.support.IndicesOptions;
1314
import org.elasticsearch.client.internal.ElasticsearchClient;
1415
import org.elasticsearch.index.query.QueryBuilder;
1516

@@ -38,6 +39,11 @@ public FieldCapabilitiesRequestBuilder setincludeEmptyFields(boolean includeEmpt
3839
return this;
3940
}
4041

42+
public FieldCapabilitiesRequestBuilder setIndicesOptions(IndicesOptions indicesOptions) {
43+
request().indicesOptions(indicesOptions);
44+
return this;
45+
}
46+
4147
public FieldCapabilitiesRequestBuilder setIndexFilter(QueryBuilder indexFilter) {
4248
request().indexFilter(indexFilter);
4349
return this;

0 commit comments

Comments
 (0)