mirror of
https://github.com/honeymoose/OpenSearch.git
synced 2025-02-09 06:25:07 +00:00
Better error when can't auto create index (#22488)
Changes the error message when `action.auto_create_index` or `index.mapper.dynamic` forbids automatic creation of an index from `no such index` to one of: * `no such index and [action.auto_create_index] is [false]` * `no such index and [index.mapper.dynamic] is [false]` * `no such index and [action.auto_create_index] contains [-<pattern>] which forbids automatic creation of the index` * `no such index and [action.auto_create_index] ([all patterns]) doesn't match` This should make it more clear *why* there is `no such index`. Closes #22435
This commit is contained in:
parent
cd52065871
commit
1fe74a6b4b
@ -168,7 +168,6 @@
|
|||||||
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]search[/\\]TransportMultiSearchAction.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]search[/\\]TransportMultiSearchAction.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]suggest[/\\]SuggestResponse.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]suggest[/\\]SuggestResponse.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]ActionFilter.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]ActionFilter.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]AutoCreateIndex.java" checks="LineLength" />
|
|
||||||
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]DelegatingActionListener.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]DelegatingActionListener.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]IndicesOptions.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]IndicesOptions.java" checks="LineLength" />
|
||||||
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]ToXContentToBytes.java" checks="LineLength" />
|
<suppress files="core[/\\]src[/\\]main[/\\]java[/\\]org[/\\]elasticsearch[/\\]action[/\\]support[/\\]ToXContentToBytes.java" checks="LineLength" />
|
||||||
|
@ -29,6 +29,7 @@ import org.elasticsearch.common.settings.ClusterSettings;
|
|||||||
import org.elasticsearch.common.settings.Setting;
|
import org.elasticsearch.common.settings.Setting;
|
||||||
import org.elasticsearch.common.settings.Setting.Property;
|
import org.elasticsearch.common.settings.Setting.Property;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.index.IndexNotFoundException;
|
||||||
import org.elasticsearch.index.mapper.MapperService;
|
import org.elasticsearch.index.mapper.MapperService;
|
||||||
|
|
||||||
import java.util.ArrayList;
|
import java.util.ArrayList;
|
||||||
@ -63,18 +64,20 @@ public final class AutoCreateIndex {
|
|||||||
|
|
||||||
/**
|
/**
|
||||||
* Should the index be auto created?
|
* Should the index be auto created?
|
||||||
|
* @throws IndexNotFoundException if the the index doesn't exist and shouldn't be auto created
|
||||||
*/
|
*/
|
||||||
public boolean shouldAutoCreate(String index, ClusterState state) {
|
public boolean shouldAutoCreate(String index, ClusterState state) {
|
||||||
|
if (resolver.hasIndexOrAlias(index, state)) {
|
||||||
|
return false;
|
||||||
|
}
|
||||||
// One volatile read, so that all checks are done against the same instance:
|
// One volatile read, so that all checks are done against the same instance:
|
||||||
final AutoCreate autoCreate = this.autoCreate;
|
final AutoCreate autoCreate = this.autoCreate;
|
||||||
if (autoCreate.autoCreateIndex == false) {
|
if (autoCreate.autoCreateIndex == false) {
|
||||||
return false;
|
throw new IndexNotFoundException("no such index and [" + AUTO_CREATE_INDEX_SETTING.getKey() + "] is [false]", index);
|
||||||
}
|
}
|
||||||
if (dynamicMappingDisabled) {
|
if (dynamicMappingDisabled) {
|
||||||
return false;
|
throw new IndexNotFoundException("no such index and [" + MapperService.INDEX_MAPPER_DYNAMIC_SETTING.getKey() + "] is [false]",
|
||||||
}
|
index);
|
||||||
if (resolver.hasIndexOrAlias(index, state)) {
|
|
||||||
return false;
|
|
||||||
}
|
}
|
||||||
// matches not set, default value of "true"
|
// matches not set, default value of "true"
|
||||||
if (autoCreate.expressions.isEmpty()) {
|
if (autoCreate.expressions.isEmpty()) {
|
||||||
@ -84,10 +87,15 @@ public final class AutoCreateIndex {
|
|||||||
String indexExpression = expression.v1();
|
String indexExpression = expression.v1();
|
||||||
boolean include = expression.v2();
|
boolean include = expression.v2();
|
||||||
if (Regex.simpleMatch(indexExpression, index)) {
|
if (Regex.simpleMatch(indexExpression, index)) {
|
||||||
return include;
|
if (include) {
|
||||||
|
return true;
|
||||||
|
}
|
||||||
|
throw new IndexNotFoundException("no such index and [" + AUTO_CREATE_INDEX_SETTING.getKey() + "] contains [-"
|
||||||
|
+ indexExpression + "] which forbids automatic creation of the index", index);
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
return false;
|
throw new IndexNotFoundException("no such index and [" + AUTO_CREATE_INDEX_SETTING.getKey() + "] ([" + autoCreate
|
||||||
|
+ "]) doesn't match", index);
|
||||||
}
|
}
|
||||||
|
|
||||||
AutoCreate getAutoCreate() {
|
AutoCreate getAutoCreate() {
|
||||||
@ -101,6 +109,7 @@ public final class AutoCreateIndex {
|
|||||||
static class AutoCreate {
|
static class AutoCreate {
|
||||||
private final boolean autoCreateIndex;
|
private final boolean autoCreateIndex;
|
||||||
private final List<Tuple<String, Boolean>> expressions;
|
private final List<Tuple<String, Boolean>> expressions;
|
||||||
|
private final String string;
|
||||||
|
|
||||||
private AutoCreate(String value) {
|
private AutoCreate(String value) {
|
||||||
boolean autoCreateIndex;
|
boolean autoCreateIndex;
|
||||||
@ -112,18 +121,21 @@ public final class AutoCreateIndex {
|
|||||||
String[] patterns = Strings.commaDelimitedListToStringArray(value);
|
String[] patterns = Strings.commaDelimitedListToStringArray(value);
|
||||||
for (String pattern : patterns) {
|
for (String pattern : patterns) {
|
||||||
if (pattern == null || pattern.trim().length() == 0) {
|
if (pattern == null || pattern.trim().length() == 0) {
|
||||||
throw new IllegalArgumentException("Can't parse [" + value + "] for setting [action.auto_create_index] must be either [true, false, or a comma separated list of index patterns]");
|
throw new IllegalArgumentException("Can't parse [" + value + "] for setting [action.auto_create_index] must "
|
||||||
|
+ "be either [true, false, or a comma separated list of index patterns]");
|
||||||
}
|
}
|
||||||
pattern = pattern.trim();
|
pattern = pattern.trim();
|
||||||
Tuple<String, Boolean> expression;
|
Tuple<String, Boolean> expression;
|
||||||
if (pattern.startsWith("-")) {
|
if (pattern.startsWith("-")) {
|
||||||
if (pattern.length() == 1) {
|
if (pattern.length() == 1) {
|
||||||
throw new IllegalArgumentException("Can't parse [" + value + "] for setting [action.auto_create_index] must contain an index name after [-]");
|
throw new IllegalArgumentException("Can't parse [" + value + "] for setting [action.auto_create_index] "
|
||||||
|
+ "must contain an index name after [-]");
|
||||||
}
|
}
|
||||||
expression = new Tuple<>(pattern.substring(1), false);
|
expression = new Tuple<>(pattern.substring(1), false);
|
||||||
} else if(pattern.startsWith("+")) {
|
} else if(pattern.startsWith("+")) {
|
||||||
if (pattern.length() == 1) {
|
if (pattern.length() == 1) {
|
||||||
throw new IllegalArgumentException("Can't parse [" + value + "] for setting [action.auto_create_index] must contain an index name after [+]");
|
throw new IllegalArgumentException("Can't parse [" + value + "] for setting [action.auto_create_index] "
|
||||||
|
+ "must contain an index name after [+]");
|
||||||
}
|
}
|
||||||
expression = new Tuple<>(pattern.substring(1), true);
|
expression = new Tuple<>(pattern.substring(1), true);
|
||||||
} else {
|
} else {
|
||||||
@ -139,6 +151,7 @@ public final class AutoCreateIndex {
|
|||||||
}
|
}
|
||||||
this.expressions = expressions;
|
this.expressions = expressions;
|
||||||
this.autoCreateIndex = autoCreateIndex;
|
this.autoCreateIndex = autoCreateIndex;
|
||||||
|
this.string = value;
|
||||||
}
|
}
|
||||||
|
|
||||||
boolean isAutoCreateIndex() {
|
boolean isAutoCreateIndex() {
|
||||||
@ -148,5 +161,10 @@ public final class AutoCreateIndex {
|
|||||||
List<Tuple<String, Boolean>> getExpressions() {
|
List<Tuple<String, Boolean>> getExpressions() {
|
||||||
return expressions;
|
return expressions;
|
||||||
}
|
}
|
||||||
|
|
||||||
|
@Override
|
||||||
|
public String toString() {
|
||||||
|
return string;
|
||||||
|
}
|
||||||
}
|
}
|
||||||
}
|
}
|
||||||
|
@ -24,9 +24,16 @@ import org.elasticsearch.common.io.stream.StreamInput;
|
|||||||
import java.io.IOException;
|
import java.io.IOException;
|
||||||
|
|
||||||
public final class IndexNotFoundException extends ResourceNotFoundException {
|
public final class IndexNotFoundException extends ResourceNotFoundException {
|
||||||
|
/**
|
||||||
|
* Construct with a custom message.
|
||||||
|
*/
|
||||||
|
public IndexNotFoundException(String message, String index) {
|
||||||
|
super(message);
|
||||||
|
setIndex(index);
|
||||||
|
}
|
||||||
|
|
||||||
public IndexNotFoundException(String index) {
|
public IndexNotFoundException(String index) {
|
||||||
this(index, null);
|
this(index, (Throwable) null);
|
||||||
}
|
}
|
||||||
|
|
||||||
public IndexNotFoundException(String index, Throwable cause) {
|
public IndexNotFoundException(String index, Throwable cause) {
|
||||||
|
@ -28,6 +28,7 @@ import org.elasticsearch.cluster.metadata.MetaData;
|
|||||||
import org.elasticsearch.common.collect.Tuple;
|
import org.elasticsearch.common.collect.Tuple;
|
||||||
import org.elasticsearch.common.settings.ClusterSettings;
|
import org.elasticsearch.common.settings.ClusterSettings;
|
||||||
import org.elasticsearch.common.settings.Settings;
|
import org.elasticsearch.common.settings.Settings;
|
||||||
|
import org.elasticsearch.index.IndexNotFoundException;
|
||||||
import org.elasticsearch.index.mapper.MapperService;
|
import org.elasticsearch.index.mapper.MapperService;
|
||||||
import org.elasticsearch.test.ESTestCase;
|
import org.elasticsearch.test.ESTestCase;
|
||||||
|
|
||||||
@ -83,7 +84,9 @@ public class AutoCreateIndexTests extends ESTestCase {
|
|||||||
public void testAutoCreationDisabled() {
|
public void testAutoCreationDisabled() {
|
||||||
Settings settings = Settings.builder().put(AutoCreateIndex.AUTO_CREATE_INDEX_SETTING.getKey(), false).build();
|
Settings settings = Settings.builder().put(AutoCreateIndex.AUTO_CREATE_INDEX_SETTING.getKey(), false).build();
|
||||||
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate(randomAsciiOfLengthBetween(1, 10), buildClusterState()), equalTo(false));
|
IndexNotFoundException e = expectThrows(IndexNotFoundException.class, () ->
|
||||||
|
autoCreateIndex.shouldAutoCreate(randomAsciiOfLengthBetween(1, 10), buildClusterState()));
|
||||||
|
assertEquals("no such index and [action.auto_create_index] is [false]", e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAutoCreationEnabled() {
|
public void testAutoCreationEnabled() {
|
||||||
@ -110,7 +113,9 @@ public class AutoCreateIndexTests extends ESTestCase {
|
|||||||
randomAsciiOfLengthBetween(1, 10)))
|
randomAsciiOfLengthBetween(1, 10)))
|
||||||
.put(MapperService.INDEX_MAPPER_DYNAMIC_SETTING.getKey(), false).build();
|
.put(MapperService.INDEX_MAPPER_DYNAMIC_SETTING.getKey(), false).build();
|
||||||
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate(randomAsciiOfLengthBetween(1, 10), buildClusterState()), equalTo(false));
|
IndexNotFoundException e = expectThrows(IndexNotFoundException.class, () ->
|
||||||
|
autoCreateIndex.shouldAutoCreate(randomAsciiOfLengthBetween(1, 10), buildClusterState()));
|
||||||
|
assertEquals("no such index and [index.mapper.dynamic] is [false]", e.getMessage());
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAutoCreationPatternEnabled() {
|
public void testAutoCreationPatternEnabled() {
|
||||||
@ -119,16 +124,17 @@ public class AutoCreateIndexTests extends ESTestCase {
|
|||||||
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
||||||
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("index" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(true));
|
assertThat(autoCreateIndex.shouldAutoCreate("index" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(true));
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("does_not_match" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(false));
|
expectNotMatch(clusterState, autoCreateIndex, "does_not_match" + randomAsciiOfLengthBetween(1, 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAutoCreationPatternDisabled() {
|
public void testAutoCreationPatternDisabled() {
|
||||||
Settings settings = Settings.builder().put(AutoCreateIndex.AUTO_CREATE_INDEX_SETTING.getKey(), "-index*").build();
|
Settings settings = Settings.builder().put(AutoCreateIndex.AUTO_CREATE_INDEX_SETTING.getKey(), "-index*").build();
|
||||||
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
||||||
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("index" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(false));
|
expectForbidden(clusterState, autoCreateIndex, "index" + randomAsciiOfLengthBetween(1, 5), "-index*");
|
||||||
//default is false when patterns are specified
|
/* When patterns are specified, even if the are all negative, the default is can't create. So a pure negative pattern is the same
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("does_not_match" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(false));
|
* as false, really. */
|
||||||
|
expectNotMatch(clusterState, autoCreateIndex, "does_not_match" + randomAsciiOfLengthBetween(1, 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAutoCreationMultiplePatternsWithWildcards() {
|
public void testAutoCreationMultiplePatternsWithWildcards() {
|
||||||
@ -136,9 +142,9 @@ public class AutoCreateIndexTests extends ESTestCase {
|
|||||||
randomFrom("+test*,-index*", "test*,-index*")).build();
|
randomFrom("+test*,-index*", "test*,-index*")).build();
|
||||||
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
||||||
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("index" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(false));
|
expectForbidden(clusterState, autoCreateIndex, "index" + randomAsciiOfLengthBetween(1, 5), "-index*");
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("test" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(true));
|
assertThat(autoCreateIndex.shouldAutoCreate("test" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(true));
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("does_not_match" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(false));
|
expectNotMatch(clusterState, autoCreateIndex, "does_not_match" + randomAsciiOfLengthBetween(1, 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAutoCreationMultiplePatternsNoWildcards() {
|
public void testAutoCreationMultiplePatternsNoWildcards() {
|
||||||
@ -146,9 +152,9 @@ public class AutoCreateIndexTests extends ESTestCase {
|
|||||||
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
||||||
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("test1", clusterState), equalTo(true));
|
assertThat(autoCreateIndex.shouldAutoCreate("test1", clusterState), equalTo(true));
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("index" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(false));
|
expectNotMatch(clusterState, autoCreateIndex, "index" + randomAsciiOfLengthBetween(1, 5));
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("test" + randomAsciiOfLengthBetween(2, 5), clusterState), equalTo(false));
|
expectNotMatch(clusterState, autoCreateIndex, "test" + randomAsciiOfLengthBetween(2, 5));
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("does_not_match" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(false));
|
expectNotMatch(clusterState, autoCreateIndex, "does_not_match" + randomAsciiOfLengthBetween(1, 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAutoCreationMultipleIndexNames() {
|
public void testAutoCreationMultipleIndexNames() {
|
||||||
@ -157,7 +163,7 @@ public class AutoCreateIndexTests extends ESTestCase {
|
|||||||
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("test1", clusterState), equalTo(true));
|
assertThat(autoCreateIndex.shouldAutoCreate("test1", clusterState), equalTo(true));
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("test2", clusterState), equalTo(true));
|
assertThat(autoCreateIndex.shouldAutoCreate("test2", clusterState), equalTo(true));
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("does_not_match" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(false));
|
expectNotMatch(clusterState, autoCreateIndex, "does_not_match" + randomAsciiOfLengthBetween(1, 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testAutoCreationConflictingPatternsFirstWins() {
|
public void testAutoCreationConflictingPatternsFirstWins() {
|
||||||
@ -166,8 +172,8 @@ public class AutoCreateIndexTests extends ESTestCase {
|
|||||||
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
AutoCreateIndex autoCreateIndex = newAutoCreateIndex(settings);
|
||||||
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
ClusterState clusterState = ClusterState.builder(new ClusterName("test")).metaData(MetaData.builder()).build();
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("test1", clusterState), equalTo(true));
|
assertThat(autoCreateIndex.shouldAutoCreate("test1", clusterState), equalTo(true));
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("test2", clusterState), equalTo(false));
|
expectForbidden(clusterState, autoCreateIndex, "test2", "-test2");
|
||||||
assertThat(autoCreateIndex.shouldAutoCreate("does_not_match" + randomAsciiOfLengthBetween(1, 5), clusterState), equalTo(false));
|
expectNotMatch(clusterState, autoCreateIndex, "does_not_match" + randomAsciiOfLengthBetween(1, 5));
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testUpdate() {
|
public void testUpdate() {
|
||||||
@ -208,4 +214,18 @@ public class AutoCreateIndexTests extends ESTestCase {
|
|||||||
return new AutoCreateIndex(settings, new ClusterSettings(settings,
|
return new AutoCreateIndex(settings, new ClusterSettings(settings,
|
||||||
ClusterSettings.BUILT_IN_CLUSTER_SETTINGS), new IndexNameExpressionResolver(settings));
|
ClusterSettings.BUILT_IN_CLUSTER_SETTINGS), new IndexNameExpressionResolver(settings));
|
||||||
}
|
}
|
||||||
|
|
||||||
|
private void expectNotMatch(ClusterState clusterState, AutoCreateIndex autoCreateIndex, String index) {
|
||||||
|
IndexNotFoundException e = expectThrows(IndexNotFoundException.class, () ->
|
||||||
|
autoCreateIndex.shouldAutoCreate(index, clusterState));
|
||||||
|
assertEquals("no such index and [action.auto_create_index] ([" + autoCreateIndex.getAutoCreate() + "]) doesn't match",
|
||||||
|
e.getMessage());
|
||||||
|
}
|
||||||
|
|
||||||
|
private void expectForbidden(ClusterState clusterState, AutoCreateIndex autoCreateIndex, String index, String forbiddingPattern) {
|
||||||
|
IndexNotFoundException e = expectThrows(IndexNotFoundException.class, () ->
|
||||||
|
autoCreateIndex.shouldAutoCreate(index, clusterState));
|
||||||
|
assertEquals("no such index and [action.auto_create_index] contains [" + forbiddingPattern
|
||||||
|
+ "] which forbids automatic creation of the index", e.getMessage());
|
||||||
|
}
|
||||||
}
|
}
|
||||||
|
@ -42,6 +42,7 @@ import org.elasticsearch.test.ESIntegTestCase.Scope;
|
|||||||
|
|
||||||
import java.util.Collections;
|
import java.util.Collections;
|
||||||
|
|
||||||
|
import static org.elasticsearch.common.unit.TimeValue.timeValueSeconds;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertExists;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertExists;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertHitCount;
|
||||||
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows;
|
import static org.elasticsearch.test.hamcrest.ElasticsearchAssertions.assertThrows;
|
||||||
@ -59,13 +60,9 @@ public class NoMasterNodeIT extends ESIntegTestCase {
|
|||||||
}
|
}
|
||||||
|
|
||||||
public void testNoMasterActions() throws Exception {
|
public void testNoMasterActions() throws Exception {
|
||||||
// note, sometimes, we want to check with the fact that an index gets created, sometimes not...
|
|
||||||
boolean autoCreateIndex = randomBoolean();
|
|
||||||
logger.info("auto_create_index set to {}", autoCreateIndex);
|
|
||||||
|
|
||||||
Settings settings = Settings.builder()
|
Settings settings = Settings.builder()
|
||||||
.put("discovery.type", "zen")
|
.put("discovery.type", "zen")
|
||||||
.put("action.auto_create_index", autoCreateIndex)
|
.put("action.auto_create_index", true)
|
||||||
.put("discovery.zen.minimum_master_nodes", 2)
|
.put("discovery.zen.minimum_master_nodes", 2)
|
||||||
.put(ZenDiscovery.PING_TIMEOUT_SETTING.getKey(), "200ms")
|
.put(ZenDiscovery.PING_TIMEOUT_SETTING.getKey(), "200ms")
|
||||||
.put("discovery.initial_state_timeout", "500ms")
|
.put("discovery.initial_state_timeout", "500ms")
|
||||||
@ -126,7 +123,7 @@ public class NoMasterNodeIT extends ESIntegTestCase {
|
|||||||
.setScript(new Script(
|
.setScript(new Script(
|
||||||
ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, "test script", Collections.emptyMap())).setTimeout(timeout));
|
ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, "test script", Collections.emptyMap())).setTimeout(timeout));
|
||||||
|
|
||||||
checkUpdateAction(autoCreateIndex, timeout,
|
checkUpdateAction(true, timeout,
|
||||||
client().prepareUpdate("no_index", "type1", "1")
|
client().prepareUpdate("no_index", "type1", "1")
|
||||||
.setScript(new Script(
|
.setScript(new Script(
|
||||||
ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, "test script", Collections.emptyMap())).setTimeout(timeout));
|
ScriptType.INLINE, Script.DEFAULT_SCRIPT_LANG, "test script", Collections.emptyMap())).setTimeout(timeout));
|
||||||
@ -135,7 +132,7 @@ public class NoMasterNodeIT extends ESIntegTestCase {
|
|||||||
checkWriteAction(false, timeout,
|
checkWriteAction(false, timeout,
|
||||||
client().prepareIndex("test", "type1", "1").setSource(XContentFactory.jsonBuilder().startObject().endObject()).setTimeout(timeout));
|
client().prepareIndex("test", "type1", "1").setSource(XContentFactory.jsonBuilder().startObject().endObject()).setTimeout(timeout));
|
||||||
|
|
||||||
checkWriteAction(autoCreateIndex, timeout,
|
checkWriteAction(true, timeout,
|
||||||
client().prepareIndex("no_index", "type1", "1").setSource(XContentFactory.jsonBuilder().startObject().endObject()).setTimeout(timeout));
|
client().prepareIndex("no_index", "type1", "1").setSource(XContentFactory.jsonBuilder().startObject().endObject()).setTimeout(timeout));
|
||||||
|
|
||||||
BulkRequestBuilder bulkRequestBuilder = client().prepareBulk();
|
BulkRequestBuilder bulkRequestBuilder = client().prepareBulk();
|
||||||
@ -149,15 +146,8 @@ public class NoMasterNodeIT extends ESIntegTestCase {
|
|||||||
bulkRequestBuilder = client().prepareBulk();
|
bulkRequestBuilder = client().prepareBulk();
|
||||||
bulkRequestBuilder.add(client().prepareIndex("no_index", "type1", "1").setSource(XContentFactory.jsonBuilder().startObject().endObject()));
|
bulkRequestBuilder.add(client().prepareIndex("no_index", "type1", "1").setSource(XContentFactory.jsonBuilder().startObject().endObject()));
|
||||||
bulkRequestBuilder.add(client().prepareIndex("no_index", "type1", "2").setSource(XContentFactory.jsonBuilder().startObject().endObject()));
|
bulkRequestBuilder.add(client().prepareIndex("no_index", "type1", "2").setSource(XContentFactory.jsonBuilder().startObject().endObject()));
|
||||||
if (autoCreateIndex) {
|
|
||||||
// we expect the bulk to fail because it will try to go to the master. Use small timeout and detect it has passed
|
|
||||||
timeout = new TimeValue(200);
|
|
||||||
} else {
|
|
||||||
// the request should fail very quickly - use a large timeout and make sure it didn't pass...
|
|
||||||
timeout = new TimeValue(5000);
|
|
||||||
}
|
|
||||||
bulkRequestBuilder.setTimeout(timeout);
|
bulkRequestBuilder.setTimeout(timeout);
|
||||||
checkWriteAction(autoCreateIndex, timeout, bulkRequestBuilder);
|
checkWriteAction(true, timeValueSeconds(5), bulkRequestBuilder);
|
||||||
|
|
||||||
internalCluster().startNode(settings);
|
internalCluster().startNode(settings);
|
||||||
client().admin().cluster().prepareHealth().setWaitForGreenStatus().setWaitForNodes("2").execute().actionGet();
|
client().admin().cluster().prepareHealth().setWaitForGreenStatus().setWaitForNodes("2").execute().actionGet();
|
||||||
|
@ -20,7 +20,6 @@
|
|||||||
package org.elasticsearch.index.mapper;
|
package org.elasticsearch.index.mapper;
|
||||||
|
|
||||||
import org.elasticsearch.action.ActionListener;
|
import org.elasticsearch.action.ActionListener;
|
||||||
import org.elasticsearch.action.bulk.BulkItemResponse;
|
|
||||||
import org.elasticsearch.action.bulk.BulkRequest;
|
import org.elasticsearch.action.bulk.BulkRequest;
|
||||||
import org.elasticsearch.action.bulk.BulkResponse;
|
import org.elasticsearch.action.bulk.BulkResponse;
|
||||||
import org.elasticsearch.action.bulk.TransportBulkAction;
|
import org.elasticsearch.action.bulk.TransportBulkAction;
|
||||||
@ -59,14 +58,14 @@ import static org.hamcrest.CoreMatchers.instanceOf;
|
|||||||
|
|
||||||
public class DynamicMappingDisabledTests extends ESSingleNodeTestCase {
|
public class DynamicMappingDisabledTests extends ESSingleNodeTestCase {
|
||||||
|
|
||||||
private static ThreadPool THREAD_POOL;
|
private static ThreadPool threadPool;
|
||||||
private ClusterService clusterService;
|
private ClusterService clusterService;
|
||||||
private TransportService transportService;
|
private TransportService transportService;
|
||||||
private TransportBulkAction transportBulkAction;
|
private TransportBulkAction transportBulkAction;
|
||||||
|
|
||||||
@BeforeClass
|
@BeforeClass
|
||||||
public static void createThreadPool() {
|
public static void createThreadPool() {
|
||||||
THREAD_POOL = new TestThreadPool("DynamicMappingDisabledTests");
|
threadPool = new TestThreadPool("DynamicMappingDisabledTests");
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
@ -75,22 +74,22 @@ public class DynamicMappingDisabledTests extends ESSingleNodeTestCase {
|
|||||||
Settings settings = Settings.builder()
|
Settings settings = Settings.builder()
|
||||||
.put(MapperService.INDEX_MAPPER_DYNAMIC_SETTING.getKey(), false)
|
.put(MapperService.INDEX_MAPPER_DYNAMIC_SETTING.getKey(), false)
|
||||||
.build();
|
.build();
|
||||||
clusterService = createClusterService(THREAD_POOL);
|
clusterService = createClusterService(threadPool);
|
||||||
Transport transport = new MockTcpTransport(settings, THREAD_POOL, BigArrays.NON_RECYCLING_INSTANCE,
|
Transport transport = new MockTcpTransport(settings, threadPool, BigArrays.NON_RECYCLING_INSTANCE,
|
||||||
new NoneCircuitBreakerService(), new NamedWriteableRegistry(Collections.emptyList()),
|
new NoneCircuitBreakerService(), new NamedWriteableRegistry(Collections.emptyList()),
|
||||||
new NetworkService(settings, Collections.emptyList()));
|
new NetworkService(settings, Collections.emptyList()));
|
||||||
transportService = new TransportService(clusterService.getSettings(), transport, THREAD_POOL,
|
transportService = new TransportService(clusterService.getSettings(), transport, threadPool,
|
||||||
TransportService.NOOP_TRANSPORT_INTERCEPTOR, x -> clusterService.localNode(), null);
|
TransportService.NOOP_TRANSPORT_INTERCEPTOR, x -> clusterService.localNode(), null);
|
||||||
IndicesService indicesService = getInstanceFromNode(IndicesService.class);
|
IndicesService indicesService = getInstanceFromNode(IndicesService.class);
|
||||||
ShardStateAction shardStateAction = new ShardStateAction(settings, clusterService, transportService, null, null, THREAD_POOL);
|
ShardStateAction shardStateAction = new ShardStateAction(settings, clusterService, transportService, null, null, threadPool);
|
||||||
ActionFilters actionFilters = new ActionFilters(Collections.emptySet());
|
ActionFilters actionFilters = new ActionFilters(Collections.emptySet());
|
||||||
IndexNameExpressionResolver indexNameExpressionResolver = new IndexNameExpressionResolver(settings);
|
IndexNameExpressionResolver indexNameExpressionResolver = new IndexNameExpressionResolver(settings);
|
||||||
AutoCreateIndex autoCreateIndex = new AutoCreateIndex(settings, new ClusterSettings(settings,
|
AutoCreateIndex autoCreateIndex = new AutoCreateIndex(settings, new ClusterSettings(settings,
|
||||||
ClusterSettings.BUILT_IN_CLUSTER_SETTINGS), indexNameExpressionResolver);
|
ClusterSettings.BUILT_IN_CLUSTER_SETTINGS), indexNameExpressionResolver);
|
||||||
UpdateHelper updateHelper = new UpdateHelper(settings, null);
|
UpdateHelper updateHelper = new UpdateHelper(settings, null);
|
||||||
TransportShardBulkAction shardBulkAction = new TransportShardBulkAction(settings, transportService, clusterService,
|
TransportShardBulkAction shardBulkAction = new TransportShardBulkAction(settings, transportService, clusterService,
|
||||||
indicesService, THREAD_POOL, shardStateAction, null, updateHelper, actionFilters, indexNameExpressionResolver);
|
indicesService, threadPool, shardStateAction, null, updateHelper, actionFilters, indexNameExpressionResolver);
|
||||||
transportBulkAction = new TransportBulkAction(settings, THREAD_POOL, transportService, clusterService,
|
transportBulkAction = new TransportBulkAction(settings, threadPool, transportService, clusterService,
|
||||||
null, shardBulkAction, null, actionFilters, indexNameExpressionResolver, autoCreateIndex, System::currentTimeMillis);
|
null, shardBulkAction, null, actionFilters, indexNameExpressionResolver, autoCreateIndex, System::currentTimeMillis);
|
||||||
}
|
}
|
||||||
|
|
||||||
@ -104,13 +103,12 @@ public class DynamicMappingDisabledTests extends ESSingleNodeTestCase {
|
|||||||
|
|
||||||
@AfterClass
|
@AfterClass
|
||||||
public static void destroyThreadPool() {
|
public static void destroyThreadPool() {
|
||||||
ThreadPool.terminate(THREAD_POOL, 30, TimeUnit.SECONDS);
|
ThreadPool.terminate(threadPool, 30, TimeUnit.SECONDS);
|
||||||
// since static must set to null to be eligible for collection
|
// since static must set to null to be eligible for collection
|
||||||
THREAD_POOL = null;
|
threadPool = null;
|
||||||
}
|
}
|
||||||
|
|
||||||
public void testDynamicDisabled() {
|
public void testDynamicDisabled() {
|
||||||
|
|
||||||
IndexRequest request = new IndexRequest("index", "type", "1");
|
IndexRequest request = new IndexRequest("index", "type", "1");
|
||||||
request.source("foo", 3);
|
request.source("foo", 3);
|
||||||
BulkRequest bulkRequest = new BulkRequest();
|
BulkRequest bulkRequest = new BulkRequest();
|
||||||
@ -120,16 +118,14 @@ public class DynamicMappingDisabledTests extends ESSingleNodeTestCase {
|
|||||||
transportBulkAction.execute(bulkRequest, new ActionListener<BulkResponse>() {
|
transportBulkAction.execute(bulkRequest, new ActionListener<BulkResponse>() {
|
||||||
@Override
|
@Override
|
||||||
public void onResponse(BulkResponse bulkResponse) {
|
public void onResponse(BulkResponse bulkResponse) {
|
||||||
BulkItemResponse itemResponse = bulkResponse.getItems()[0];
|
fail("onResponse shouldn't be called");
|
||||||
assertTrue(itemResponse.isFailed());
|
|
||||||
assertThat(itemResponse.getFailure().getCause(), instanceOf(IndexNotFoundException.class));
|
|
||||||
assertEquals(itemResponse.getFailure().getCause().getMessage(), "no such index");
|
|
||||||
onFailureCalled.set(true);
|
|
||||||
}
|
}
|
||||||
|
|
||||||
@Override
|
@Override
|
||||||
public void onFailure(Exception e) {
|
public void onFailure(Exception e) {
|
||||||
fail("unexpected failure in bulk action, expected failed bulk item");
|
onFailureCalled.set(true);
|
||||||
|
assertThat(e, instanceOf(IndexNotFoundException.class));
|
||||||
|
assertEquals("no such index and [index.mapper.dynamic] is [false]", e.getMessage());
|
||||||
}
|
}
|
||||||
});
|
});
|
||||||
|
|
||||||
|
@ -0,0 +1,72 @@
|
|||||||
|
teardown:
|
||||||
|
- do:
|
||||||
|
cluster.put_settings:
|
||||||
|
body:
|
||||||
|
transient:
|
||||||
|
action.auto_create_index: null
|
||||||
|
|
||||||
|
---
|
||||||
|
"auto_create_index is false":
|
||||||
|
- do:
|
||||||
|
index:
|
||||||
|
index: test
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body: { "text": "test" }
|
||||||
|
- do:
|
||||||
|
cluster.put_settings:
|
||||||
|
body:
|
||||||
|
transient:
|
||||||
|
action.auto_create_index: false
|
||||||
|
- do:
|
||||||
|
catch: /no such index and \[action.auto_create_index\] is \[false\]/
|
||||||
|
reindex:
|
||||||
|
body:
|
||||||
|
source:
|
||||||
|
index: test
|
||||||
|
dest:
|
||||||
|
index: dest
|
||||||
|
|
||||||
|
---
|
||||||
|
"auto_create_index doesn't include new index":
|
||||||
|
- do:
|
||||||
|
cluster.put_settings:
|
||||||
|
body:
|
||||||
|
transient:
|
||||||
|
action.auto_create_index: test
|
||||||
|
- do:
|
||||||
|
index:
|
||||||
|
index: test
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body: { "text": "test" }
|
||||||
|
- do:
|
||||||
|
catch: /no such index and \[action.auto_create_index\] \(\[test\]\) doesn't match/
|
||||||
|
reindex:
|
||||||
|
body:
|
||||||
|
source:
|
||||||
|
index: test
|
||||||
|
dest:
|
||||||
|
index: dest
|
||||||
|
|
||||||
|
---
|
||||||
|
"auto_create_index forbids new index":
|
||||||
|
- do:
|
||||||
|
cluster.put_settings:
|
||||||
|
body:
|
||||||
|
transient:
|
||||||
|
action.auto_create_index: test,-dest
|
||||||
|
- do:
|
||||||
|
index:
|
||||||
|
index: test
|
||||||
|
type: test
|
||||||
|
id: 1
|
||||||
|
body: { "text": "test" }
|
||||||
|
- do:
|
||||||
|
catch: /no such index and \[action.auto_create_index\] contains \[-dest\] which forbids automatic creation of the index/
|
||||||
|
reindex:
|
||||||
|
body:
|
||||||
|
source:
|
||||||
|
index: test
|
||||||
|
dest:
|
||||||
|
index: dest
|
Loading…
x
Reference in New Issue
Block a user