Skip to content

Commit 2dd8267

Browse files
committed
when using wildcard notation delete all indices might kick in even though its disabled
1 parent c33ca29 commit 2dd8267

File tree

2 files changed

+31
-4
lines changed

2 files changed

+31
-4
lines changed

src/main/java/org/elasticsearch/action/admin/indices/delete/TransportDeleteIndexAction.java

Lines changed: 21 additions & 3 deletions
Original file line numberDiff line numberDiff line change
@@ -33,6 +33,7 @@
3333
import org.elasticsearch.cluster.metadata.IndexMetaData;
3434
import org.elasticsearch.cluster.metadata.MetaDataDeleteIndexService;
3535
import org.elasticsearch.common.inject.Inject;
36+
import org.elasticsearch.common.regex.Regex;
3637
import org.elasticsearch.common.settings.Settings;
3738
import org.elasticsearch.index.percolator.PercolatorService;
3839
import org.elasticsearch.threadpool.ThreadPool;
@@ -84,10 +85,27 @@ protected DeleteIndexResponse newResponse() {
8485

8586
@Override
8687
protected void doExecute(DeleteIndexRequest request, ActionListener<DeleteIndexResponse> listener) {
87-
if (disableDeleteAllIndices && (request.indices() == null || request.indices().length == 0 || (request.indices().length == 1 && request.indices()[0].equals("_all")))) {
88-
throw new ElasticSearchIllegalArgumentException("deleting all indices is disabled");
88+
ClusterState state = clusterService.state();
89+
String[] indicesOrAliases = request.indices();
90+
request.indices(state.metaData().concreteIndices(request.indices()));
91+
if (disableDeleteAllIndices) {
92+
// simple check on the original indices with "all" default parameter
93+
if (indicesOrAliases == null || indicesOrAliases.length == 0 || (indicesOrAliases.length == 1 && indicesOrAliases[0].equals("_all"))) {
94+
throw new ElasticSearchIllegalArgumentException("deleting all indices is disabled");
95+
}
96+
// if we end up matching on all indices, check, if its a wildcard parameter, or a "-something" structure
97+
if (request.indices().length == state.metaData().concreteAllIndices().length && indicesOrAliases.length > 0) {
98+
boolean hasRegex = false;
99+
for (String indexOrAlias : indicesOrAliases) {
100+
if (Regex.isSimpleMatchPattern(indexOrAlias)) {
101+
hasRegex = true;
102+
}
103+
}
104+
if (indicesOrAliases.length > 0 && (hasRegex || indicesOrAliases[0].charAt(0) == '-')) {
105+
throw new ElasticSearchIllegalArgumentException("deleting all indices is disabled");
106+
}
107+
}
89108
}
90-
request.indices(clusterService.state().metaData().concreteIndices(request.indices()));
91109
super.doExecute(request, listener);
92110
}
93111

src/main/java/org/elasticsearch/cluster/metadata/MetaData.java

Lines changed: 10 additions & 1 deletion
Original file line numberDiff line numberDiff line change
@@ -135,6 +135,7 @@ public static synchronized void addDynamicSettings(String... settings) {
135135
private final transient int totalNumberOfShards;
136136

137137
private final String[] allIndices;
138+
private final ImmutableSet<String> allIndicesSet;
138139
private final String[] allOpenIndices;
139140

140141
private final ImmutableMap<String, ImmutableMap<String, AliasMetaData>> aliases;
@@ -166,6 +167,7 @@ public static synchronized void addDynamicSettings(String... settings) {
166167
allIndicesLst.add(indexMetaData.index());
167168
}
168169
allIndices = allIndicesLst.toArray(new String[allIndicesLst.size()]);
170+
allIndicesSet = ImmutableSet.copyOf(allIndices);
169171

170172
List<String> allOpenIndices = Lists.newArrayList();
171173
for (IndexMetaData indexMetaData : indices.values()) {
@@ -294,6 +296,10 @@ public String[] concreteAllIndices() {
294296
return allIndices;
295297
}
296298

299+
public ImmutableSet<String> concreteAllIndicesAsSet() {
300+
return allIndicesSet;
301+
}
302+
297303
public String[] getConcreteAllIndices() {
298304
return concreteAllIndices();
299305
}
@@ -508,7 +514,7 @@ public String[] concreteIndices(String[] aliasesOrIndices, boolean ignoreMissing
508514
if (aliasesOrIndices == null || aliasesOrIndices.length == 0) {
509515
return allOnlyOpen ? concreteAllOpenIndices() : concreteAllIndices();
510516
}
511-
aliasesOrIndices = convertFromWildcards(aliasesOrIndices, allOnlyOpen, false);
517+
aliasesOrIndices = convertFromWildcards(aliasesOrIndices, allOnlyOpen, ignoreMissing);
512518
// optimize for single element index (common case)
513519
if (aliasesOrIndices.length == 1) {
514520
String aliasOrIndex = aliasesOrIndices[0];
@@ -602,6 +608,9 @@ public String[] convertFromWildcards(String[] aliasesOrIndices, boolean wildcard
602608
aliasOrIndex = aliasOrIndex.substring(1);
603609
}
604610
if (!Regex.isSimpleMatchPattern(aliasOrIndex)) {
611+
if (!ignoreMissing && !aliasAndIndexToIndexMap.containsKey(aliasOrIndex)) {
612+
throw new IndexMissingException(new Index(aliasOrIndex));
613+
}
605614
if (result != null) {
606615
if (add) {
607616
result.add(aliasOrIndex);

0 commit comments

Comments
 (0)