Skip to content

Commit b5cea69

Browse files
authored
Delete index API to work only against concrete indices (#25268)
With #23997 we have introduced a new internal index option that allows to resolve index expressions only against concrete indices while ignoring aliases. Such index option was applied to IndicesAliasesRequest, so that the index part of alias actions would only be resolved against concrete indices. Same is done in this commit with delete index request. Deleting aliases has always been confusing as some users expect it to only remove the alias from the index (which has its own specific API). Even worse, in case of filtered aliases, deleting an alias may leave users with the expectation that only the documents that match the filter are deleted, which was never the case. To address all this confusion, delete index api works now only against concrete indices. WIldcard expressions will be only resolved against concrete index, as if aliases didn't exist. If one tries to delete against an alias, an IndexNotFoundException will be thrown regardless of whether the alias exists or not, as a concrete index with such a name doesn't exist. Closes #2318
1 parent 9c65073 commit b5cea69

File tree

4 files changed

+116
-7
lines changed

4 files changed

+116
-7
lines changed

core/src/main/java/org/elasticsearch/action/admin/indices/delete/DeleteIndexRequest.java

Lines changed: 1 addition & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -38,7 +38,7 @@ public class DeleteIndexRequest extends AcknowledgedRequest<DeleteIndexRequest>
3838

3939
private String[] indices;
4040
// Delete index should work by default on both open and closed indices.
41-
private IndicesOptions indicesOptions = IndicesOptions.fromOptions(false, true, true, true);
41+
private IndicesOptions indicesOptions = IndicesOptions.fromOptions(false, true, true, true, false, false, true);
4242

4343
public DeleteIndexRequest() {
4444
}

core/src/test/java/org/elasticsearch/action/IndicesRequestIT.java

Lines changed: 11 additions & 6 deletions
Original file line numberDiff line numberDiff line change
@@ -644,19 +644,24 @@ private String[] randomIndicesOrAliases() {
644644
}
645645

646646
private String[] randomUniqueIndicesOrAliases() {
647-
Set<String> uniqueIndices = new HashSet<>();
648-
int count = randomIntBetween(1, this.indices.size());
649-
while (uniqueIndices.size() < count) {
650-
uniqueIndices.add(randomFrom(this.indices));
651-
}
652-
String[] indices = new String[count];
647+
String[] uniqueIndices = randomUniqueIndices();
648+
String[] indices = new String[uniqueIndices.length];
653649
int i = 0;
654650
for (String index : uniqueIndices) {
655651
indices[i++] = randomBoolean() ? index + "-alias" : index;
656652
}
657653
return indices;
658654
}
659655

656+
private String[] randomUniqueIndices() {
657+
Set<String> uniqueIndices = new HashSet<>();
658+
int count = randomIntBetween(1, this.indices.size());
659+
while (uniqueIndices.size() < count) {
660+
uniqueIndices.add(randomFrom(this.indices));
661+
}
662+
return uniqueIndices.toArray(new String[uniqueIndices.size()]);
663+
}
664+
660665
private static void assertAllRequestsHaveBeenConsumed() {
661666
Iterable<PluginsService> pluginsServices = internalCluster().getInstances(PluginsService.class);
662667
for (PluginsService pluginsService : pluginsServices) {

core/src/test/java/org/elasticsearch/cluster/metadata/IndexNameExpressionResolverTests.java

Lines changed: 98 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -20,6 +20,8 @@
2020
package org.elasticsearch.cluster.metadata;
2121

2222
import org.elasticsearch.Version;
23+
import org.elasticsearch.action.admin.indices.alias.IndicesAliasesRequest;
24+
import org.elasticsearch.action.admin.indices.delete.DeleteIndexRequest;
2325
import org.elasticsearch.action.support.IndicesOptions;
2426
import org.elasticsearch.cluster.ClusterName;
2527
import org.elasticsearch.cluster.ClusterState;
@@ -1042,4 +1044,100 @@ public void testConcreteIndicesForDeprecatedPattern() {
10421044
equalTo(newHashSet("testXXX", "testXXY", "testYYY")));
10431045
assertWarnings("support for '+' as part of index expressions is deprecated");
10441046
}
1047+
1048+
public void testDeleteIndexIgnoresAliases() {
1049+
MetaData.Builder mdBuilder = MetaData.builder()
1050+
.put(indexBuilder("test-index").state(State.OPEN)
1051+
.putAlias(AliasMetaData.builder("test-alias")))
1052+
.put(indexBuilder("index").state(State.OPEN)
1053+
.putAlias(AliasMetaData.builder("test-alias2")));
1054+
ClusterState state = ClusterState.builder(new ClusterName("_name")).metaData(mdBuilder).build();
1055+
{
1056+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, new DeleteIndexRequest("test-alias"));
1057+
assertEquals(0, indices.length);
1058+
}
1059+
{
1060+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, new DeleteIndexRequest("test-a*"));
1061+
assertEquals(0, indices.length);
1062+
}
1063+
{
1064+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, new DeleteIndexRequest("test-index"));
1065+
assertEquals(1, indices.length);
1066+
assertEquals("test-index", indices[0]);
1067+
}
1068+
{
1069+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, new DeleteIndexRequest("test-*"));
1070+
assertEquals(1, indices.length);
1071+
assertEquals("test-index", indices[0]);
1072+
}
1073+
}
1074+
1075+
public void testIndicesAliasesRequestIgnoresAliases() {
1076+
MetaData.Builder mdBuilder = MetaData.builder()
1077+
.put(indexBuilder("test-index").state(State.OPEN)
1078+
.putAlias(AliasMetaData.builder("test-alias")))
1079+
.put(indexBuilder("index").state(State.OPEN)
1080+
.putAlias(AliasMetaData.builder("test-alias2")));
1081+
ClusterState state = ClusterState.builder(new ClusterName("_name")).metaData(mdBuilder).build();
1082+
{
1083+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.add().index("test-alias");
1084+
expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(state, aliasActions));
1085+
}
1086+
{
1087+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.add().index("test-a*");
1088+
expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(state, aliasActions));
1089+
}
1090+
{
1091+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.add().index("test-index");
1092+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, aliasActions);
1093+
assertEquals(1, indices.length);
1094+
assertEquals("test-index", indices[0]);
1095+
}
1096+
{
1097+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.add().index("test-*");
1098+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, aliasActions);
1099+
assertEquals(1, indices.length);
1100+
assertEquals("test-index", indices[0]);
1101+
}
1102+
{
1103+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.remove().index("test-alias");
1104+
expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(state, aliasActions));
1105+
}
1106+
{
1107+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.remove().index("test-a*");
1108+
expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(state, aliasActions));
1109+
}
1110+
{
1111+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.remove().index("test-index");
1112+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, aliasActions);
1113+
assertEquals(1, indices.length);
1114+
assertEquals("test-index", indices[0]);
1115+
}
1116+
{
1117+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.remove().index("test-*");
1118+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, aliasActions);
1119+
assertEquals(1, indices.length);
1120+
assertEquals("test-index", indices[0]);
1121+
}
1122+
{
1123+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.removeIndex().index("test-alias");
1124+
expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(state, aliasActions));
1125+
}
1126+
{
1127+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.removeIndex().index("test-a*");
1128+
expectThrows(IndexNotFoundException.class, () -> indexNameExpressionResolver.concreteIndexNames(state, aliasActions));
1129+
}
1130+
{
1131+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.removeIndex().index("test-index");
1132+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, aliasActions);
1133+
assertEquals(1, indices.length);
1134+
assertEquals("test-index", indices[0]);
1135+
}
1136+
{
1137+
IndicesAliasesRequest.AliasActions aliasActions = IndicesAliasesRequest.AliasActions.removeIndex().index("test-*");
1138+
String[] indices = indexNameExpressionResolver.concreteIndexNames(state, aliasActions);
1139+
assertEquals(1, indices.length);
1140+
assertEquals("test-index", indices[0]);
1141+
}
1142+
}
10451143
}

docs/reference/migration/migrate_6_0/indices.asciidoc

Lines changed: 6 additions & 0 deletions
Original file line numberDiff line numberDiff line change
@@ -56,3 +56,9 @@ will be marked for deletion.
5656
The index parameter in the update-aliases, put-alias, and delete-alias APIs no
5757
longer accepts alias names. Instead, it accepts only index names (or wildcards
5858
which will expand to matching indices).
59+
60+
==== Delete index api resolves indices expressions only against indices
61+
62+
The index parameter in the delete index API no longer accepts alias names.
63+
Instead, it accepts only index names (or wildcards which will expand to
64+
matching indices).

0 commit comments

Comments
 (0)