diff --git a/core/src/main/java/org/elasticsearch/action/support/replication/TransportWriteAction.java b/core/src/main/java/org/elasticsearch/action/support/replication/TransportWriteAction.java
index 39b49a4a409..bf2b3235b11 100644
--- a/core/src/main/java/org/elasticsearch/action/support/replication/TransportWriteAction.java
+++ b/core/src/main/java/org/elasticsearch/action/support/replication/TransportWriteAction.java
@@ -213,7 +213,7 @@ public abstract class TransportWriteAction<
* callback used by {@link AsyncAfterWriteAction} to notify that all post
* process actions have been executed
*/
- private interface RespondingWriteResult {
+ interface RespondingWriteResult {
/**
* Called on successful processing of all post write actions
* @param forcedRefresh true
iff this write has caused a refresh
diff --git a/core/src/main/java/org/elasticsearch/bootstrap/BootstrapCheck.java b/core/src/main/java/org/elasticsearch/bootstrap/BootstrapCheck.java
index 28f82308cbb..de80b487c7e 100644
--- a/core/src/main/java/org/elasticsearch/bootstrap/BootstrapCheck.java
+++ b/core/src/main/java/org/elasticsearch/bootstrap/BootstrapCheck.java
@@ -66,7 +66,6 @@ final class BootstrapCheck {
static void check(final Settings settings, final BoundTransportAddress boundTransportAddress) throws NodeValidationException {
check(
enforceLimits(boundTransportAddress),
- BootstrapSettings.IGNORE_SYSTEM_BOOTSTRAP_CHECKS.get(settings),
checks(settings),
Node.NODE_NAME_SETTING.get(settings));
}
@@ -77,18 +76,15 @@ final class BootstrapCheck {
*
* @param enforceLimits true if the checks should be enforced or
* otherwise warned
- * @param ignoreSystemChecks true if system checks should be enforced
- * or otherwise warned
* @param checks the checks to execute
* @param nodeName the node name to be used as a logging prefix
*/
// visible for testing
static void check(
final boolean enforceLimits,
- final boolean ignoreSystemChecks,
final List checks,
final String nodeName) throws NodeValidationException {
- check(enforceLimits, ignoreSystemChecks, checks, Loggers.getLogger(BootstrapCheck.class, nodeName));
+ check(enforceLimits, checks, Loggers.getLogger(BootstrapCheck.class, nodeName));
}
/**
@@ -97,14 +93,11 @@ final class BootstrapCheck {
*
* @param enforceLimits true if the checks should be enforced or
* otherwise warned
- * @param ignoreSystemChecks true if system checks should be enforced
- * or otherwise warned
* @param checks the checks to execute
* @param logger the logger to
*/
static void check(
final boolean enforceLimits,
- final boolean ignoreSystemChecks,
final List checks,
final Logger logger) throws NodeValidationException {
final List errors = new ArrayList<>();
@@ -113,13 +106,10 @@ final class BootstrapCheck {
if (enforceLimits) {
logger.info("bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks");
}
- if (enforceLimits && ignoreSystemChecks) {
- logger.warn("enforcing bootstrap checks but ignoring system bootstrap checks, consider not ignoring system checks");
- }
for (final Check check : checks) {
if (check.check()) {
- if ((!enforceLimits || (check.isSystemCheck() && ignoreSystemChecks)) && !check.alwaysEnforce()) {
+ if (!enforceLimits && !check.alwaysEnforce()) {
ignoredErrors.add(check.errorMessage());
} else {
errors.add(check.errorMessage());
@@ -201,14 +191,6 @@ final class BootstrapCheck {
*/
String errorMessage();
- /**
- * test if the check is a system-level check
- *
- * @return true if the check is a system-level check as opposed
- * to an Elasticsearch-level check
- */
- boolean isSystemCheck();
-
default boolean alwaysEnforce() {
return false;
}
@@ -245,11 +227,6 @@ final class BootstrapCheck {
return JvmInfo.jvmInfo().getConfiguredMaxHeapSize();
}
- @Override
- public final boolean isSystemCheck() {
- return false;
- }
-
}
static class OsXFileDescriptorCheck extends FileDescriptorCheck {
@@ -299,11 +276,6 @@ final class BootstrapCheck {
return ProcessProbe.getInstance().getMaxFileDescriptorCount();
}
- @Override
- public final boolean isSystemCheck() {
- return true;
- }
-
}
static class MlockallCheck implements Check {
@@ -329,11 +301,6 @@ final class BootstrapCheck {
return Natives.isMemoryLocked();
}
- @Override
- public final boolean isSystemCheck() {
- return true;
- }
-
}
static class MaxNumberOfThreadsCheck implements Check {
@@ -360,11 +327,6 @@ final class BootstrapCheck {
return JNANatives.MAX_NUMBER_OF_THREADS;
}
- @Override
- public final boolean isSystemCheck() {
- return true;
- }
-
}
static class MaxSizeVirtualMemoryCheck implements Check {
@@ -393,11 +355,6 @@ final class BootstrapCheck {
return JNANatives.MAX_SIZE_VIRTUAL_MEMORY;
}
- @Override
- public final boolean isSystemCheck() {
- return true;
- }
-
}
static class MaxMapCountCheck implements Check {
@@ -465,11 +422,6 @@ final class BootstrapCheck {
return Long.parseLong(procSysVmMaxMapCount);
}
- @Override
- public final boolean isSystemCheck() {
- return true;
- }
-
}
static class ClientJvmCheck implements BootstrapCheck.Check {
@@ -492,11 +444,6 @@ final class BootstrapCheck {
getVmName());
}
- @Override
- public final boolean isSystemCheck() {
- return false;
- }
-
}
/**
@@ -524,11 +471,6 @@ final class BootstrapCheck {
JvmInfo.jvmInfo().getVmName());
}
- @Override
- public boolean isSystemCheck() {
- return false;
- }
-
}
abstract static class MightForkCheck implements BootstrapCheck.Check {
@@ -546,11 +488,6 @@ final class BootstrapCheck {
// visible for testing
abstract boolean mightFork();
- @Override
- public final boolean isSystemCheck() {
- return false;
- }
-
@Override
public final boolean alwaysEnforce() {
return true;
diff --git a/core/src/main/java/org/elasticsearch/bootstrap/BootstrapSettings.java b/core/src/main/java/org/elasticsearch/bootstrap/BootstrapSettings.java
index ad37916881b..e8015d83af3 100644
--- a/core/src/main/java/org/elasticsearch/bootstrap/BootstrapSettings.java
+++ b/core/src/main/java/org/elasticsearch/bootstrap/BootstrapSettings.java
@@ -37,7 +37,5 @@ public final class BootstrapSettings {
Setting.boolSetting("bootstrap.seccomp", true, Property.NodeScope);
public static final Setting CTRLHANDLER_SETTING =
Setting.boolSetting("bootstrap.ctrlhandler", true, Property.NodeScope);
- public static final Setting IGNORE_SYSTEM_BOOTSTRAP_CHECKS =
- Setting.boolSetting("bootstrap.ignore_system_bootstrap_checks", false, Property.NodeScope);
}
diff --git a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java
index 4ab3b85e46a..c5ccd3bc6ff 100644
--- a/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java
+++ b/core/src/main/java/org/elasticsearch/cluster/metadata/IndexMetaData.java
@@ -157,10 +157,23 @@ public class IndexMetaData implements Diffable, FromXContentBuild
}
}
+ static Setting buildNumberOfShardsSetting() {
+ /* This is a safety limit that should only be exceeded in very rare and special cases. The assumption is that
+ * 99% of the users have less than 1024 shards per index. We also make it a hard check that requires restart of nodes
+ * if a cluster should allow to create more than 1024 shards per index. NOTE: this does not limit the number of shards per cluster.
+ * this also prevents creating stuff like a new index with millions of shards by accident which essentially kills the entire cluster
+ * with OOM on the spot.*/
+ final int maxNumShards = Integer.parseInt(System.getProperty("es.index.max_number_of_shards", "1024"));
+ if (maxNumShards < 1) {
+ throw new IllegalArgumentException("es.index.max_number_of_shards must be > 0");
+ }
+ return Setting.intSetting(SETTING_NUMBER_OF_SHARDS, Math.min(5, maxNumShards), 1, maxNumShards,
+ Property.IndexScope);
+ }
+
public static final String INDEX_SETTING_PREFIX = "index.";
public static final String SETTING_NUMBER_OF_SHARDS = "index.number_of_shards";
- public static final Setting INDEX_NUMBER_OF_SHARDS_SETTING =
- Setting.intSetting(SETTING_NUMBER_OF_SHARDS, 5, 1, Property.IndexScope);
+ public static final Setting INDEX_NUMBER_OF_SHARDS_SETTING = buildNumberOfShardsSetting();
public static final String SETTING_NUMBER_OF_REPLICAS = "index.number_of_replicas";
public static final Setting INDEX_NUMBER_OF_REPLICAS_SETTING =
Setting.intSetting(SETTING_NUMBER_OF_REPLICAS, 1, 0, Property.Dynamic, Property.IndexScope);
diff --git a/core/src/main/java/org/elasticsearch/common/settings/ClusterSettings.java b/core/src/main/java/org/elasticsearch/common/settings/ClusterSettings.java
index c1841d11fbf..b5a0564174a 100644
--- a/core/src/main/java/org/elasticsearch/common/settings/ClusterSettings.java
+++ b/core/src/main/java/org/elasticsearch/common/settings/ClusterSettings.java
@@ -397,7 +397,6 @@ public final class ClusterSettings extends AbstractScopedSettings {
BootstrapSettings.MEMORY_LOCK_SETTING,
BootstrapSettings.SECCOMP_SETTING,
BootstrapSettings.CTRLHANDLER_SETTING,
- BootstrapSettings.IGNORE_SYSTEM_BOOTSTRAP_CHECKS,
IndexingMemoryController.INDEX_BUFFER_SIZE_SETTING,
IndexingMemoryController.MIN_INDEX_BUFFER_SIZE_SETTING,
IndexingMemoryController.MAX_INDEX_BUFFER_SIZE_SETTING,
diff --git a/core/src/main/java/org/elasticsearch/common/settings/Setting.java b/core/src/main/java/org/elasticsearch/common/settings/Setting.java
index bf1ac69c5c9..a96b47762d5 100644
--- a/core/src/main/java/org/elasticsearch/common/settings/Setting.java
+++ b/core/src/main/java/org/elasticsearch/common/settings/Setting.java
@@ -636,10 +636,6 @@ public class Setting extends ToXContentToBytes {
return new Setting<>(key, (s) -> defaultPercentage, (s) -> MemorySizeValue.parseBytesSizeValueOrHeapRatio(s, key), properties);
}
- public static Setting positiveTimeSetting(String key, TimeValue defaultValue, Property... properties) {
- return timeSetting(key, defaultValue, TimeValue.timeValueMillis(0), properties);
- }
-
public static Setting> listSetting(String key, List defaultStringValue, Function singleValueParser,
Property... properties) {
return listSetting(key, (s) -> defaultStringValue, singleValueParser, properties);
@@ -795,9 +791,9 @@ public class Setting extends ToXContentToBytes {
};
}
- public static Setting timeSetting(String key, Function defaultValue, TimeValue minValue,
+ public static Setting timeSetting(String key, Function defaultValue, TimeValue minValue,
Property... properties) {
- return new Setting<>(key, defaultValue, (s) -> {
+ return new Setting<>(key, (s) -> defaultValue.apply(s).getStringRep(), (s) -> {
TimeValue timeValue = TimeValue.parseTimeValue(s, null, key);
if (timeValue.millis() < minValue.millis()) {
throw new IllegalArgumentException("Failed to parse value [" + s + "] for setting [" + key + "] must be >= " + minValue);
@@ -807,17 +803,21 @@ public class Setting extends ToXContentToBytes {
}
public static Setting timeSetting(String key, TimeValue defaultValue, TimeValue minValue, Property... properties) {
- return timeSetting(key, (s) -> defaultValue.getStringRep(), minValue, properties);
+ return timeSetting(key, (s) -> defaultValue, minValue, properties);
}
public static Setting timeSetting(String key, TimeValue defaultValue, Property... properties) {
- return new Setting<>(key, (s) -> defaultValue.toString(), (s) -> TimeValue.parseTimeValue(s, key), properties);
+ return new Setting<>(key, (s) -> defaultValue.getStringRep(), (s) -> TimeValue.parseTimeValue(s, key), properties);
}
public static Setting timeSetting(String key, Setting fallbackSetting, Property... properties) {
return new Setting<>(key, fallbackSetting, (s) -> TimeValue.parseTimeValue(s, key), properties);
}
+ public static Setting positiveTimeSetting(String key, TimeValue defaultValue, Property... properties) {
+ return timeSetting(key, defaultValue, TimeValue.timeValueMillis(0), properties);
+ }
+
public static Setting doubleSetting(String key, double defaultValue, double minValue, Property... properties) {
return new Setting<>(key, (s) -> Double.toString(defaultValue), (s) -> {
final double d = Double.parseDouble(s);
diff --git a/core/src/main/java/org/elasticsearch/common/unit/TimeValue.java b/core/src/main/java/org/elasticsearch/common/unit/TimeValue.java
index ed67019c103..8f81efb6498 100644
--- a/core/src/main/java/org/elasticsearch/common/unit/TimeValue.java
+++ b/core/src/main/java/org/elasticsearch/common/unit/TimeValue.java
@@ -249,6 +249,12 @@ public class TimeValue implements Writeable {
return PeriodFormat.getDefault().withParseType(type).print(period);
}
+ /**
+ * Returns a {@link String} representation of the current {@link TimeValue}.
+ *
+ * Note that this method might produce fractional time values (ex 1.6m) which cannot be
+ * parsed by method like {@link TimeValue#parse(String, String, int)}.
+ */
@Override
public String toString() {
if (duration < 0) {
diff --git a/core/src/main/java/org/elasticsearch/discovery/zen/ZenDiscovery.java b/core/src/main/java/org/elasticsearch/discovery/zen/ZenDiscovery.java
index 7f47f29175b..833349e9d9a 100644
--- a/core/src/main/java/org/elasticsearch/discovery/zen/ZenDiscovery.java
+++ b/core/src/main/java/org/elasticsearch/discovery/zen/ZenDiscovery.java
@@ -89,7 +89,7 @@ public class ZenDiscovery extends AbstractLifecycleComponent implements Discover
Setting.positiveTimeSetting("discovery.zen.ping_timeout", timeValueSeconds(3), Property.NodeScope);
public static final Setting JOIN_TIMEOUT_SETTING =
Setting.timeSetting("discovery.zen.join_timeout",
- settings -> TimeValue.timeValueMillis(PING_TIMEOUT_SETTING.get(settings).millis() * 20).toString(),
+ settings -> TimeValue.timeValueMillis(PING_TIMEOUT_SETTING.get(settings).millis() * 20),
TimeValue.timeValueMillis(0), Property.NodeScope);
public static final Setting JOIN_RETRY_ATTEMPTS_SETTING =
Setting.intSetting("discovery.zen.join_retry_attempts", 3, 1, Property.NodeScope);
@@ -101,7 +101,7 @@ public class ZenDiscovery extends AbstractLifecycleComponent implements Discover
Setting.boolSetting("discovery.zen.send_leave_request", true, Property.NodeScope);
public static final Setting MASTER_ELECTION_WAIT_FOR_JOINS_TIMEOUT_SETTING =
Setting.timeSetting("discovery.zen.master_election.wait_for_joins_timeout",
- settings -> TimeValue.timeValueMillis(JOIN_TIMEOUT_SETTING.get(settings).millis() / 2).toString(), TimeValue.timeValueMillis(0),
+ settings -> TimeValue.timeValueMillis(JOIN_TIMEOUT_SETTING.get(settings).millis() / 2), TimeValue.timeValueMillis(0),
Property.NodeScope);
public static final Setting MASTER_ELECTION_IGNORE_NON_MASTER_PINGS_SETTING =
Setting.boolSetting("discovery.zen.master_election.ignore_non_master_pings", false, Property.NodeScope);
diff --git a/core/src/main/java/org/elasticsearch/indices/recovery/RecoverySettings.java b/core/src/main/java/org/elasticsearch/indices/recovery/RecoverySettings.java
index d4c89d0c179..6c4e484a2d5 100644
--- a/core/src/main/java/org/elasticsearch/indices/recovery/RecoverySettings.java
+++ b/core/src/main/java/org/elasticsearch/indices/recovery/RecoverySettings.java
@@ -61,7 +61,7 @@ public class RecoverySettings extends AbstractComponent {
*/
public static final Setting INDICES_RECOVERY_INTERNAL_LONG_ACTION_TIMEOUT_SETTING =
Setting.timeSetting("indices.recovery.internal_action_long_timeout",
- (s) -> TimeValue.timeValueMillis(INDICES_RECOVERY_INTERNAL_ACTION_TIMEOUT_SETTING.get(s).millis() * 2).toString(),
+ (s) -> TimeValue.timeValueMillis(INDICES_RECOVERY_INTERNAL_ACTION_TIMEOUT_SETTING.get(s).millis() * 2),
TimeValue.timeValueSeconds(0), Property.Dynamic, Property.NodeScope);
/**
@@ -70,7 +70,7 @@ public class RecoverySettings extends AbstractComponent {
*/
public static final Setting INDICES_RECOVERY_ACTIVITY_TIMEOUT_SETTING =
Setting.timeSetting("indices.recovery.recovery_activity_timeout",
- (s) -> INDICES_RECOVERY_INTERNAL_LONG_ACTION_TIMEOUT_SETTING.getRaw(s) , TimeValue.timeValueSeconds(0),
+ INDICES_RECOVERY_INTERNAL_LONG_ACTION_TIMEOUT_SETTING::get, TimeValue.timeValueSeconds(0),
Property.Dynamic, Property.NodeScope);
public static final ByteSizeValue DEFAULT_CHUNK_SIZE = new ByteSizeValue(512, ByteSizeUnit.KB);
diff --git a/core/src/main/java/org/elasticsearch/ingest/ConfigurationUtils.java b/core/src/main/java/org/elasticsearch/ingest/ConfigurationUtils.java
index 908e3446980..88105420e14 100644
--- a/core/src/main/java/org/elasticsearch/ingest/ConfigurationUtils.java
+++ b/core/src/main/java/org/elasticsearch/ingest/ConfigurationUtils.java
@@ -224,7 +224,13 @@ public final class ConfigurationUtils {
public static ElasticsearchException newConfigurationException(String processorType, String processorTag,
String propertyName, String reason) {
- ElasticsearchParseException exception = new ElasticsearchParseException("[" + propertyName + "] " + reason);
+ String msg;
+ if (propertyName == null) {
+ msg = reason;
+ } else {
+ msg = "[" + propertyName + "] " + reason;
+ }
+ ElasticsearchParseException exception = new ElasticsearchParseException(msg);
addHeadersToException(exception, processorType, processorTag, propertyName);
return exception;
}
diff --git a/core/src/test/java/org/elasticsearch/action/support/replication/TransportWriteActionTestHelper.java b/core/src/test/java/org/elasticsearch/action/support/replication/TransportWriteActionTestHelper.java
new file mode 100644
index 00000000000..7e02d824600
--- /dev/null
+++ b/core/src/test/java/org/elasticsearch/action/support/replication/TransportWriteActionTestHelper.java
@@ -0,0 +1,55 @@
+/*
+ * Licensed to Elasticsearch under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.elasticsearch.action.support.replication;
+
+import org.apache.logging.log4j.Logger;
+import org.elasticsearch.action.support.WriteRequest;
+import org.elasticsearch.common.Nullable;
+import org.elasticsearch.index.shard.IndexShard;
+import org.elasticsearch.index.translog.Translog;
+
+import java.util.concurrent.CountDownLatch;
+
+public abstract class TransportWriteActionTestHelper {
+
+
+ public static void performPostWriteActions(final IndexShard indexShard,
+ final WriteRequest> request,
+ @Nullable final Translog.Location location,
+ final Logger logger) {
+ final CountDownLatch latch = new CountDownLatch(1);
+ TransportWriteAction.RespondingWriteResult writerResult = new TransportWriteAction.RespondingWriteResult() {
+ @Override
+ public void onSuccess(boolean forcedRefresh) {
+ latch.countDown();
+ }
+
+ @Override
+ public void onFailure(Exception ex) {
+ throw new AssertionError(ex);
+ }
+ };
+ new TransportWriteAction.AsyncAfterWriteAction(indexShard, request, location, writerResult, logger).run();
+ try {
+ latch.await();
+ } catch (InterruptedException e) {
+ throw new AssertionError(e);
+ }
+ }
+}
diff --git a/core/src/test/java/org/elasticsearch/bootstrap/BootstrapCheckTests.java b/core/src/test/java/org/elasticsearch/bootstrap/BootstrapCheckTests.java
index c038525fb0e..9813731017d 100644
--- a/core/src/test/java/org/elasticsearch/bootstrap/BootstrapCheckTests.java
+++ b/core/src/test/java/org/elasticsearch/bootstrap/BootstrapCheckTests.java
@@ -70,18 +70,14 @@ public class BootstrapCheckTests extends ESTestCase {
public void testNoLogMessageInNonProductionMode() throws NodeValidationException {
final Logger logger = mock(Logger.class);
- BootstrapCheck.check(false, randomBoolean(), Collections.emptyList(), logger);
+ BootstrapCheck.check(false, Collections.emptyList(), logger);
verifyNoMoreInteractions(logger);
}
public void testLogMessageInProductionMode() throws NodeValidationException {
final Logger logger = mock(Logger.class);
- final boolean ignoreSystemChecks = randomBoolean();
- BootstrapCheck.check(true, ignoreSystemChecks, Collections.emptyList(), logger);
+ BootstrapCheck.check(true, Collections.emptyList(), logger);
verify(logger).info("bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks");
- if (ignoreSystemChecks) {
- verify(logger).warn("enforcing bootstrap checks but ignoring system bootstrap checks, consider not ignoring system checks");
- }
verifyNoMoreInteractions(logger);
}
@@ -139,11 +135,6 @@ public class BootstrapCheckTests extends ESTestCase {
public String errorMessage() {
return "first";
}
-
- @Override
- public boolean isSystemCheck() {
- return false;
- }
},
new BootstrapCheck.Check() {
@Override
@@ -155,16 +146,11 @@ public class BootstrapCheckTests extends ESTestCase {
public String errorMessage() {
return "second";
}
-
- @Override
- public boolean isSystemCheck() {
- return false;
- }
}
);
final NodeValidationException e =
- expectThrows(NodeValidationException.class, () -> BootstrapCheck.check(true, false, checks, "testExceptionAggregation"));
+ expectThrows(NodeValidationException.class, () -> BootstrapCheck.check(true, checks, "testExceptionAggregation"));
assertThat(e, hasToString(allOf(containsString("bootstrap checks failed"), containsString("first"), containsString("second"))));
final Throwable[] suppressed = e.getSuppressed();
assertThat(suppressed.length, equalTo(2));
@@ -195,7 +181,7 @@ public class BootstrapCheckTests extends ESTestCase {
final NodeValidationException e =
expectThrows(
NodeValidationException.class,
- () -> BootstrapCheck.check(true, false, Collections.singletonList(check), "testHeapSizeCheck"));
+ () -> BootstrapCheck.check(true, Collections.singletonList(check), "testHeapSizeCheck"));
assertThat(
e.getMessage(),
containsString("initial heap size [" + initialHeapSize.get() + "] " +
@@ -203,7 +189,7 @@ public class BootstrapCheckTests extends ESTestCase {
initialHeapSize.set(maxHeapSize.get());
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testHeapSizeCheck");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testHeapSizeCheck");
// nothing should happen if the initial heap size or the max
// heap size is not available
@@ -212,7 +198,7 @@ public class BootstrapCheckTests extends ESTestCase {
} else {
maxHeapSize.set(0);
}
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testHeapSizeCheck");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testHeapSizeCheck");
}
public void testFileDescriptorLimits() throws NodeValidationException {
@@ -238,17 +224,17 @@ public class BootstrapCheckTests extends ESTestCase {
final NodeValidationException e =
expectThrows(NodeValidationException.class,
- () -> BootstrapCheck.check(true, false, Collections.singletonList(check), "testFileDescriptorLimits"));
+ () -> BootstrapCheck.check(true, Collections.singletonList(check), "testFileDescriptorLimits"));
assertThat(e.getMessage(), containsString("max file descriptors"));
maxFileDescriptorCount.set(randomIntBetween(limit + 1, Integer.MAX_VALUE));
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testFileDescriptorLimits");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testFileDescriptorLimits");
// nothing should happen if current file descriptor count is
// not available
maxFileDescriptorCount.set(-1);
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testFileDescriptorLimits");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testFileDescriptorLimits");
}
public void testFileDescriptorLimitsThrowsOnInvalidLimit() {
@@ -293,7 +279,6 @@ public class BootstrapCheckTests extends ESTestCase {
NodeValidationException.class,
() -> BootstrapCheck.check(
true,
- false,
Collections.singletonList(check),
"testFileDescriptorLimitsThrowsOnInvalidLimit"));
assertThat(
@@ -301,7 +286,7 @@ public class BootstrapCheckTests extends ESTestCase {
containsString("memory locking requested for elasticsearch process but memory is not locked"));
} else {
// nothing should happen
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testFileDescriptorLimitsThrowsOnInvalidLimit");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testFileDescriptorLimitsThrowsOnInvalidLimit");
}
}
}
@@ -318,17 +303,17 @@ public class BootstrapCheckTests extends ESTestCase {
final NodeValidationException e = expectThrows(
NodeValidationException.class,
- () -> BootstrapCheck.check(true, false, Collections.singletonList(check), "testMaxNumberOfThreadsCheck"));
+ () -> BootstrapCheck.check(true, Collections.singletonList(check), "testMaxNumberOfThreadsCheck"));
assertThat(e.getMessage(), containsString("max number of threads"));
maxNumberOfThreads.set(randomIntBetween(limit + 1, Integer.MAX_VALUE));
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testMaxNumberOfThreadsCheck");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testMaxNumberOfThreadsCheck");
// nothing should happen if current max number of threads is
// not available
maxNumberOfThreads.set(-1);
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testMaxNumberOfThreadsCheck");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testMaxNumberOfThreadsCheck");
}
public void testMaxSizeVirtualMemory() throws NodeValidationException {
@@ -349,17 +334,17 @@ public class BootstrapCheckTests extends ESTestCase {
final NodeValidationException e = expectThrows(
NodeValidationException.class,
- () -> BootstrapCheck.check(true, false, Collections.singletonList(check), "testMaxSizeVirtualMemory"));
+ () -> BootstrapCheck.check(true, Collections.singletonList(check), "testMaxSizeVirtualMemory"));
assertThat(e.getMessage(), containsString("max size virtual memory"));
maxSizeVirtualMemory.set(rlimInfinity);
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testMaxSizeVirtualMemory");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testMaxSizeVirtualMemory");
// nothing should happen if max size virtual memory is not
// available
maxSizeVirtualMemory.set(Long.MIN_VALUE);
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testMaxSizeVirtualMemory");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testMaxSizeVirtualMemory");
}
public void testMaxMapCountCheck() throws NodeValidationException {
@@ -374,17 +359,17 @@ public class BootstrapCheckTests extends ESTestCase {
final NodeValidationException e = expectThrows(
NodeValidationException.class,
- () -> BootstrapCheck.check(true, false, Collections.singletonList(check), "testMaxMapCountCheck"));
+ () -> BootstrapCheck.check(true, Collections.singletonList(check), "testMaxMapCountCheck"));
assertThat(e.getMessage(), containsString("max virtual memory areas vm.max_map_count"));
maxMapCount.set(randomIntBetween(limit + 1, Integer.MAX_VALUE));
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testMaxMapCountCheck");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testMaxMapCountCheck");
// nothing should happen if current vm.max_map_count is not
// available
maxMapCount.set(-1);
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testMaxMapCountCheck");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testMaxMapCountCheck");
}
public void testClientJvmCheck() throws NodeValidationException {
@@ -398,14 +383,14 @@ public class BootstrapCheckTests extends ESTestCase {
final NodeValidationException e = expectThrows(
NodeValidationException.class,
- () -> BootstrapCheck.check(true, false, Collections.singletonList(check), "testClientJvmCheck"));
+ () -> BootstrapCheck.check(true, Collections.singletonList(check), "testClientJvmCheck"));
assertThat(
e.getMessage(),
containsString("JVM is using the client VM [Java HotSpot(TM) 32-Bit Client VM] " +
"but should be using a server VM for the best performance"));
vmName.set("Java HotSpot(TM) 32-Bit Server VM");
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testClientJvmCheck");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testClientJvmCheck");
}
public void testUseSerialGCCheck() throws NodeValidationException {
@@ -419,14 +404,14 @@ public class BootstrapCheckTests extends ESTestCase {
final NodeValidationException e = expectThrows(
NodeValidationException.class,
- () -> BootstrapCheck.check(true, false, Collections.singletonList(check), "testUseSerialGCCheck"));
+ () -> BootstrapCheck.check(true, Collections.singletonList(check), "testUseSerialGCCheck"));
assertThat(
e.getMessage(),
containsString("JVM is using the serial collector but should not be for the best performance; " + "" +
"either it's the default for the VM [" + JvmInfo.jvmInfo().getVmName() +"] or -XX:+UseSerialGC was explicitly specified"));
useSerialGC.set("false");
- BootstrapCheck.check(true, false, Collections.singletonList(check), "testUseSerialGCCheck");
+ BootstrapCheck.check(true, Collections.singletonList(check), "testUseSerialGCCheck");
}
public void testMightForkCheck() throws NodeValidationException {
@@ -530,13 +515,13 @@ public class BootstrapCheckTests extends ESTestCase {
} else {
enableMightFork.run();
}
- BootstrapCheck.check(true, randomBoolean(), Collections.singletonList(check), methodName);
+ BootstrapCheck.check(true, Collections.singletonList(check), methodName);
// if seccomp is enabled, but we will not fork, nothing should
// happen
isSeccompInstalled.set(true);
disableMightFork.run();
- BootstrapCheck.check(true, randomBoolean(), Collections.singletonList(check), methodName);
+ BootstrapCheck.check(true, Collections.singletonList(check), methodName);
// if seccomp is enabled, and we might fork, the check should
// be enforced, regardless of bootstrap checks being enabled or
@@ -546,49 +531,10 @@ public class BootstrapCheckTests extends ESTestCase {
final NodeValidationException e = expectThrows(
NodeValidationException.class,
- () -> BootstrapCheck.check(randomBoolean(), randomBoolean(), Collections.singletonList(check), methodName));
+ () -> BootstrapCheck.check(randomBoolean(), Collections.singletonList(check), methodName));
consumer.accept(e);
}
- public void testIgnoringSystemChecks() throws NodeValidationException {
- final BootstrapCheck.Check check = new BootstrapCheck.Check() {
- @Override
- public boolean check() {
- return true;
- }
-
- @Override
- public String errorMessage() {
- return "error";
- }
-
- @Override
- public boolean isSystemCheck() {
- return true;
- }
- };
-
- final NodeValidationException notIgnored = expectThrows(
- NodeValidationException.class,
- () -> BootstrapCheck.check(true, false, Collections.singletonList(check), "testIgnoringSystemChecks"));
- assertThat(notIgnored, hasToString(containsString("error")));
-
- final Logger logger = mock(Logger.class);
-
- // nothing should happen if we ignore system checks
- BootstrapCheck.check(true, true, Collections.singletonList(check), logger);
- verify(logger).info("bound or publishing to a non-loopback or non-link-local address, enforcing bootstrap checks");
- verify(logger).warn("enforcing bootstrap checks but ignoring system bootstrap checks, consider not ignoring system checks");
- verify(logger).warn("error");
- verifyNoMoreInteractions(logger);
- reset(logger);
-
- // nothing should happen if we ignore all checks
- BootstrapCheck.check(false, randomBoolean(), Collections.singletonList(check), logger);
- verify(logger).warn("error");
- verifyNoMoreInteractions(logger);
- }
-
public void testAlwaysEnforcedChecks() {
final BootstrapCheck.Check check = new BootstrapCheck.Check() {
@Override
@@ -601,11 +547,6 @@ public class BootstrapCheckTests extends ESTestCase {
return "error";
}
- @Override
- public boolean isSystemCheck() {
- return randomBoolean();
- }
-
@Override
public boolean alwaysEnforce() {
return true;
@@ -614,7 +555,7 @@ public class BootstrapCheckTests extends ESTestCase {
final NodeValidationException alwaysEnforced = expectThrows(
NodeValidationException.class,
- () -> BootstrapCheck.check(randomBoolean(), randomBoolean(), Collections.singletonList(check), "testAlwaysEnforcedChecks"));
+ () -> BootstrapCheck.check(randomBoolean(), Collections.singletonList(check), "testAlwaysEnforcedChecks"));
assertThat(alwaysEnforced, hasToString(containsString("error")));
}
diff --git a/core/src/test/java/org/elasticsearch/cluster/settings/ClusterSettingsIT.java b/core/src/test/java/org/elasticsearch/cluster/settings/ClusterSettingsIT.java
index 26bb97fcc04..a1962ceefb7 100644
--- a/core/src/test/java/org/elasticsearch/cluster/settings/ClusterSettingsIT.java
+++ b/core/src/test/java/org/elasticsearch/cluster/settings/ClusterSettingsIT.java
@@ -330,9 +330,11 @@ public class ClusterSettingsIT extends ESIntegTestCase {
}
}
- @AwaitsFix(bugUrl = "https://github.com/elastic/elasticsearch/issues/20318")
public void testLoggerLevelUpdate() {
assertAcked(prepareCreate("test"));
+
+ final Level level = ESLoggerFactory.getRootLogger().getLevel();
+
final IllegalArgumentException e =
expectThrows(
IllegalArgumentException.class,
@@ -352,8 +354,8 @@ public class ClusterSettingsIT extends ESIntegTestCase {
final Settings.Builder defaultSettings = Settings.builder().putNull("logger.*");
client().admin().cluster().prepareUpdateSettings().setTransientSettings(defaultSettings).execute().actionGet();
}
- assertEquals(ESLoggerFactory.LOG_DEFAULT_LEVEL_SETTING.get(Settings.EMPTY), ESLoggerFactory.getLogger("test").getLevel());
- assertEquals(ESLoggerFactory.LOG_DEFAULT_LEVEL_SETTING.get(Settings.EMPTY), ESLoggerFactory.getRootLogger().getLevel());
+ assertEquals(level, ESLoggerFactory.getLogger("test").getLevel());
+ assertEquals(level, ESLoggerFactory.getRootLogger().getLevel());
}
}
diff --git a/core/src/test/java/org/elasticsearch/common/settings/SettingTests.java b/core/src/test/java/org/elasticsearch/common/settings/SettingTests.java
index 3c60a67f51b..6ec9093536e 100644
--- a/core/src/test/java/org/elasticsearch/common/settings/SettingTests.java
+++ b/core/src/test/java/org/elasticsearch/common/settings/SettingTests.java
@@ -33,6 +33,7 @@ import java.util.concurrent.atomic.AtomicReference;
import java.util.function.Function;
import static org.hamcrest.Matchers.containsString;
+import static org.hamcrest.Matchers.equalTo;
import static org.hamcrest.Matchers.is;
public class SettingTests extends ESTestCase {
@@ -517,4 +518,16 @@ public class SettingTests extends ESTestCase {
assertThat(ex.getMessage(), containsString("properties cannot be null for setting"));
}
}
+
+ public void testTimeValue() {
+ final TimeValue random = TimeValue.parseTimeValue(randomTimeValue(), "test");
+
+ Setting setting = Setting.timeSetting("foo", random);
+ assertThat(setting.get(Settings.EMPTY), equalTo(random));
+
+ final int factor = randomIntBetween(1, 10);
+ setting = Setting.timeSetting("foo", (s) -> TimeValue.timeValueMillis(random.getMillis() * factor), TimeValue.ZERO);
+ assertThat(setting.get(Settings.builder().put("foo", "12h").build()), equalTo(TimeValue.timeValueHours(12)));
+ assertThat(setting.get(Settings.EMPTY).getMillis(), equalTo(random.getMillis() * factor));
+ }
}
diff --git a/core/src/test/java/org/elasticsearch/index/replication/ESIndexLevelReplicationTestCase.java b/core/src/test/java/org/elasticsearch/index/replication/ESIndexLevelReplicationTestCase.java
index 16ad560c9fe..b800b9280ae 100644
--- a/core/src/test/java/org/elasticsearch/index/replication/ESIndexLevelReplicationTestCase.java
+++ b/core/src/test/java/org/elasticsearch/index/replication/ESIndexLevelReplicationTestCase.java
@@ -29,9 +29,11 @@ import org.elasticsearch.action.index.IndexResponse;
import org.elasticsearch.action.index.TransportIndexAction;
import org.elasticsearch.action.support.PlainActionFuture;
import org.elasticsearch.action.support.replication.ReplicationOperation;
+import org.elasticsearch.action.support.replication.ReplicationRequest;
import org.elasticsearch.action.support.replication.ReplicationResponse;
-import org.elasticsearch.action.support.replication.TransportReplicationAction;
+import org.elasticsearch.action.support.replication.TransportReplicationAction.ReplicaResponse;
import org.elasticsearch.action.support.replication.TransportWriteAction;
+import org.elasticsearch.action.support.replication.TransportWriteActionTestHelper;
import org.elasticsearch.cluster.ClusterState;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.cluster.node.DiscoveryNode;
@@ -41,13 +43,13 @@ import org.elasticsearch.common.collect.Iterators;
import org.elasticsearch.common.settings.Settings;
import org.elasticsearch.common.transport.LocalTransportAddress;
import org.elasticsearch.index.Index;
+import org.elasticsearch.index.engine.Engine;
import org.elasticsearch.index.mapper.Uid;
import org.elasticsearch.index.shard.IndexShard;
import org.elasticsearch.index.shard.IndexShardTestCase;
import org.elasticsearch.index.shard.ShardId;
import org.elasticsearch.indices.recovery.RecoveryState;
import org.elasticsearch.indices.recovery.RecoveryTarget;
-import org.elasticsearch.transport.TransportResponse;
import java.io.IOException;
import java.util.ArrayList;
@@ -82,7 +84,7 @@ public abstract class ESIndexLevelReplicationTestCase extends IndexShardTestCase
IndexMetaData.Builder metaData = IndexMetaData.builder(index.getName())
.settings(settings)
.primaryTerm(0, 1);
- for (Map.Entry typeMapping: indexMapping.entrySet()) {
+ for (Map.Entry typeMapping : indexMapping.entrySet()) {
metaData.putMapping(typeMapping.getKey(), typeMapping.getValue());
}
return new ReplicationGroup(metaData.build());
@@ -130,10 +132,9 @@ public abstract class ESIndexLevelReplicationTestCase extends IndexShardTestCase
}
public IndexResponse index(IndexRequest indexRequest) throws Exception {
- PlainActionFuture listener = new PlainActionFuture<>();
- IndexingOp op = new IndexingOp(indexRequest, listener, this);
- op.execute();
- return listener.get().finalResponse;
+ PlainActionFuture listener = new PlainActionFuture<>();
+ new IndexingAction(indexRequest, listener, this).execute();
+ return listener.get();
}
public synchronized void startAll() throws IOException {
@@ -147,7 +148,7 @@ public abstract class ESIndexLevelReplicationTestCase extends IndexShardTestCase
}
public synchronized IndexShard addReplica() throws IOException {
- final IndexShard replica = newShard(shardId, false,"s" + replicaId.incrementAndGet(), indexMetaData, null);
+ final IndexShard replica = newShard(shardId, false, "s" + replicaId.incrementAndGet(), indexMetaData, null);
replicas.add(replica);
return replica;
}
@@ -223,7 +224,7 @@ public abstract class ESIndexLevelReplicationTestCase extends IndexShardTestCase
@Override
public Iterator iterator() {
- return Iterators.concat(replicas.iterator(), Collections.singleton(primary).iterator());
+ return Iterators.concat(replicas.iterator(), Collections.singleton(primary).iterator());
}
public IndexShard getPrimary() {
@@ -231,135 +232,162 @@ public abstract class ESIndexLevelReplicationTestCase extends IndexShardTestCase
}
}
- class IndexingOp extends ReplicationOperation {
-
+ abstract class ReplicationAction, ReplicaRequest extends ReplicationRequest,
+ Response extends ReplicationResponse> {
+ private final Request request;
+ private ActionListener listener;
private final ReplicationGroup replicationGroup;
+ private final String opType;
- public IndexingOp(IndexRequest request, ActionListener listener, ReplicationGroup replicationGroup) {
- super(request, new PrimaryRef(replicationGroup), listener, true, new ReplicasRef(replicationGroup),
- () -> null, logger, "indexing");
- this.replicationGroup = replicationGroup;
+ public ReplicationAction(Request request, ActionListener listener,
+ ReplicationGroup group, String opType) {
+ this.request = request;
+ this.listener = listener;
+ this.replicationGroup = group;
+ this.opType = opType;
+ }
+
+ public void execute() throws Exception {
+ new ReplicationOperation(request, new PrimaryRef(),
+ new ActionListener() {
+ @Override
+ public void onResponse(PrimaryResult result) {
+ result.respond(listener);
+ }
+
+ @Override
+ public void onFailure(Exception e) {
+ listener.onFailure(e);
+ }
+ }, true, new ReplicasRef(), () -> null, logger, opType) {
+ @Override
+ protected List getShards(ShardId shardId, ClusterState state) {
+ return replicationGroup.shardRoutings();
+ }
+
+ @Override
+ protected String checkActiveShardCount() {
+ return null;
+ }
+
+ @Override
+ protected Set getInSyncAllocationIds(ShardId shardId, ClusterState clusterState) {
+ return replicationGroup.shardRoutings().stream().filter(ShardRouting::active).map(r -> r.allocationId().getId())
+ .collect(Collectors.toSet());
+ }
+ }.execute();
+ }
+
+ protected abstract PrimaryResult performOnPrimary(IndexShard primary, Request request) throws Exception;
+
+ protected abstract void performOnReplica(ReplicaRequest request, IndexShard replica);
+
+ class PrimaryRef implements ReplicationOperation.Primary {
+
+ @Override
+ public ShardRouting routingEntry() {
+ return replicationGroup.primary.routingEntry();
+ }
+
+ @Override
+ public void failShard(String message, Exception exception) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public PrimaryResult perform(Request request) throws Exception {
+ PrimaryResult response = performOnPrimary(replicationGroup.primary, request);
+ response.replicaRequest().primaryTerm(replicationGroup.primary.getPrimaryTerm());
+ return response;
+ }
+
+ @Override
+ public void updateLocalCheckpointForShard(String allocationId, long checkpoint) {
+ replicationGroup.getPrimary().updateLocalCheckpointForShard(allocationId, checkpoint);
+ }
+
+ @Override
+ public long localCheckpoint() {
+ return replicationGroup.getPrimary().getLocalCheckpoint();
+ }
+ }
+
+ class ReplicasRef implements ReplicationOperation.Replicas {
+
+ @Override
+ public void performOn(
+ ShardRouting replicaRouting,
+ ReplicaRequest request,
+ ActionListener listener) {
+ try {
+ IndexShard replica = replicationGroup.replicas.stream()
+ .filter(s -> replicaRouting.isSameAllocation(s.routingEntry())).findFirst().get();
+ performOnReplica(request, replica);
+ listener.onResponse(new ReplicaResponse(replica.routingEntry().allocationId().getId(), replica.getLocalCheckpoint()));
+ } catch (Exception e) {
+ listener.onFailure(e);
+ }
+ }
+
+ @Override
+ public void failShard(ShardRouting replica, long primaryTerm, String message, Exception exception, Runnable onSuccess,
+ Consumer onPrimaryDemoted, Consumer onIgnoredFailure) {
+ throw new UnsupportedOperationException();
+ }
+
+ @Override
+ public void markShardCopyAsStale(ShardId shardId, String allocationId, long primaryTerm, Runnable onSuccess,
+ Consumer onPrimaryDemoted, Consumer onIgnoredFailure) {
+ throw new UnsupportedOperationException();
+ }
+ }
+
+ class PrimaryResult implements ReplicationOperation.PrimaryResult {
+ final ReplicaRequest replicaRequest;
+ final Response finalResponse;
+
+ public PrimaryResult(ReplicaRequest replicaRequest, Response finalResponse) {
+ this.replicaRequest = replicaRequest;
+ this.finalResponse = finalResponse;
+ }
+
+ @Override
+ public ReplicaRequest replicaRequest() {
+ return replicaRequest;
+ }
+
+ @Override
+ public void setShardInfo(ReplicationResponse.ShardInfo shardInfo) {
+ finalResponse.setShardInfo(shardInfo);
+ }
+
+ public void respond(ActionListener listener) {
+ listener.onResponse(finalResponse);
+ }
+ }
+
+ }
+
+ class IndexingAction extends ReplicationAction {
+
+ public IndexingAction(IndexRequest request, ActionListener listener, ReplicationGroup replicationGroup) {
+ super(request, listener, replicationGroup, "indexing");
request.process(null, true, request.index());
}
@Override
- protected List getShards(ShardId shardId, ClusterState state) {
- return replicationGroup.shardRoutings();
- }
-
- @Override
- protected Set getInSyncAllocationIds(ShardId shardId, ClusterState clusterState) {
- return replicationGroup.shardRoutings().stream().filter(ShardRouting::active)
- .map(shr -> shr.allocationId().getId()).collect(Collectors.toSet());
- }
-
- @Override
- protected String checkActiveShardCount() {
- return null;
- }
- }
-
- private static class PrimaryRef implements ReplicationOperation.Primary {
-
- final IndexShard primary;
-
- private PrimaryRef(ReplicationGroup replicationGroup) {
- this.primary = replicationGroup.primary;
- }
-
- @Override
- public ShardRouting routingEntry() {
- return primary.routingEntry();
- }
-
- @Override
- public void failShard(String message, Exception exception) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public IndexingResult perform(IndexRequest request) throws Exception {
+ protected PrimaryResult performOnPrimary(IndexShard primary, IndexRequest request) throws Exception {
TransportWriteAction.WriteResult result = TransportIndexAction.executeIndexRequestOnPrimary(request, primary,
null);
request.primaryTerm(primary.getPrimaryTerm());
- return new IndexingResult(request, result.getResponse());
+ TransportWriteActionTestHelper.performPostWriteActions(primary, request, result.getLocation(), logger);
+ return new PrimaryResult(request, result.getResponse());
}
@Override
- public void updateLocalCheckpointForShard(String allocationId, long checkpoint) {
- primary.updateLocalCheckpointForShard(allocationId, checkpoint);
- }
-
- @Override
- public long localCheckpoint() {
- return primary.getLocalCheckpoint();
- }
-
- }
-
- private static class ReplicasRef implements ReplicationOperation.Replicas {
-
- private final ReplicationGroup replicationGroup;
-
- private ReplicasRef(ReplicationGroup replicationGroup) {
- this.replicationGroup = replicationGroup;
- }
-
- @Override
- public void performOn(
- ShardRouting replicaRouting,
- IndexRequest request,
- ActionListener listener) {
- try {
- IndexShard replica = replicationGroup.replicas.stream()
- .filter(s -> replicaRouting.isSameAllocation(s.routingEntry())).findFirst().get();
- TransportIndexAction.executeIndexRequestOnReplica(request, replica);
- listener.onResponse(
- new TransportReplicationAction.ReplicaResponse(
- replica.routingEntry().allocationId().getId(),
- replica.getLocalCheckpoint()));
- } catch (Exception e) {
- listener.onFailure(e);
- }
- }
-
- @Override
- public void failShard(ShardRouting replica, long primaryTerm, String message, Exception exception, Runnable onSuccess,
- Consumer onPrimaryDemoted, Consumer onIgnoredFailure) {
- throw new UnsupportedOperationException();
- }
-
- @Override
- public void markShardCopyAsStale(ShardId shardId, String allocationId, long primaryTerm, Runnable onSuccess,
- Consumer onPrimaryDemoted, Consumer onIgnoredFailure) {
- throw new UnsupportedOperationException();
- }
-
- }
-
-
- private static class IndexingResult implements ReplicationOperation.PrimaryResult {
- final IndexRequest replicaRequest;
- final IndexResponse finalResponse;
-
- public IndexingResult(IndexRequest replicaRequest, IndexResponse finalResponse) {
- this.replicaRequest = replicaRequest;
- this.finalResponse = finalResponse;
- }
-
- @Override
- public IndexRequest replicaRequest() {
- return replicaRequest;
- }
-
- @Override
- public void setShardInfo(ReplicationResponse.ShardInfo shardInfo) {
- finalResponse.setShardInfo(shardInfo);
- }
-
- public void respond(ActionListener listener) {
- listener.onResponse(finalResponse);
+ protected void performOnReplica(IndexRequest request, IndexShard replica) {
+ Engine.Index index = TransportIndexAction.executeIndexRequestOnReplica(request, replica);
+ TransportWriteActionTestHelper.performPostWriteActions(replica, request, index.getTranslogLocation(), logger);
}
}
-
}
diff --git a/docs/reference/index-modules.asciidoc b/docs/reference/index-modules.asciidoc
index ff1a3c62c7f..28e9e6a114e 100644
--- a/docs/reference/index-modules.asciidoc
+++ b/docs/reference/index-modules.asciidoc
@@ -38,7 +38,11 @@ specific index module:
The number of primary shards that an index should have. Defaults to 5.
This setting can only be set at index creation time. It cannot be
- changed on a closed index.
+ changed on a closed index. Note: the number of shards are limited to `1024` per
+ index. This limitation is a safety limit to prevent accidental creation of indices
+ that can destabilize a cluster due to resource allocation. The limit can be modified
+ by specifying `export ES_JAVA_OPTS="-Des.index.max_number_of_shards=128"` system property on every node that is
+ part of the cluster.
`index.shard.check_on_startup`::
+
diff --git a/docs/reference/ingest/ingest-node.asciidoc b/docs/reference/ingest/ingest-node.asciidoc
index 66f0635094a..a71fec1c3b3 100644
--- a/docs/reference/ingest/ingest-node.asciidoc
+++ b/docs/reference/ingest/ingest-node.asciidoc
@@ -934,6 +934,12 @@ to the requester.
[[foreach-processor]]
=== Foreach Processor
+
+experimental[This processor may change or be replaced by something else that provides similar functionality. This
+processor executes in its own context, which makes it different compared to all other processors and for features like
+verbose simulation the subprocessor isn't visible. The reason we still expose this processor, is that it is the only
+processor that can operate on an array]
+
Processes elements in an array of unknown length.
All processors can operate on elements inside an array, but if all elements of an array need to
diff --git a/docs/reference/search/suggesters/phrase-suggest.asciidoc b/docs/reference/search/suggesters/phrase-suggest.asciidoc
index dace399d650..6c502421e4e 100644
--- a/docs/reference/search/suggesters/phrase-suggest.asciidoc
+++ b/docs/reference/search/suggesters/phrase-suggest.asciidoc
@@ -71,11 +71,10 @@ PUT test
}
}
}
-POST test/test
+POST test/test?refresh=true
{"title": "noble warriors"}
-POST test/test
+POST test/test?refresh=true
{"title": "nobel prize"}
-POST _refresh
--------------------------------------------------
// CONSOLE
// TESTSETUP
@@ -126,7 +125,7 @@ can contain misspellings (See parameter descriptions below).
"options" : [ {
"text" : "nobel prize",
"highlighted": "nobel prize",
- "score" : 0.40765354
+ "score" : 0.5962314
}]
}
]
diff --git a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ForEachProcessor.java b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ForEachProcessor.java
index e5a720011a5..2a1046acb9c 100644
--- a/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ForEachProcessor.java
+++ b/modules/ingest-common/src/main/java/org/elasticsearch/ingest/common/ForEachProcessor.java
@@ -38,6 +38,8 @@ import static org.elasticsearch.ingest.ConfigurationUtils.readStringProperty;
*
* This can be useful in cases to do string operations on json array of strings,
* or remove a field from objects inside a json array.
+ *
+ * Note that this processor is experimental.
*/
public final class ForEachProcessor extends AbstractProcessor {
diff --git a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorFactoryTests.java b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorFactoryTests.java
index ef517d986cb..27eeb80670a 100644
--- a/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorFactoryTests.java
+++ b/modules/ingest-common/src/test/java/org/elasticsearch/ingest/common/ScriptProcessorFactoryTests.java
@@ -56,7 +56,7 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> factory.create(null, randomAsciiOfLength(10), configMap));
- assertThat(exception.getMessage(), is("[null] Only one of [file], [id], or [inline] may be configured"));
+ assertThat(exception.getMessage(), is("Only one of [file], [id], or [inline] may be configured"));
}
public void testFactoryValidationAtLeastOneScriptingType() throws Exception {
@@ -66,6 +66,6 @@ public class ScriptProcessorFactoryTests extends ESTestCase {
ElasticsearchException exception = expectThrows(ElasticsearchException.class,
() -> factory.create(null, randomAsciiOfLength(10), configMap));
- assertThat(exception.getMessage(), is("[null] Need [file], [id], or [inline] parameter to refer to scripts"));
+ assertThat(exception.getMessage(), is("Need [file], [id], or [inline] parameter to refer to scripts"));
}
}
diff --git a/qa/evil-tests/src/test/java/org/elasticsearch/cluster/metadata/EvilSystemPropertyTests.java b/qa/evil-tests/src/test/java/org/elasticsearch/cluster/metadata/EvilSystemPropertyTests.java
new file mode 100644
index 00000000000..5e44fdbefad
--- /dev/null
+++ b/qa/evil-tests/src/test/java/org/elasticsearch/cluster/metadata/EvilSystemPropertyTests.java
@@ -0,0 +1,47 @@
+/*
+ * Licensed to Elasticsearch under one or more contributor
+ * license agreements. See the NOTICE file distributed with
+ * this work for additional information regarding copyright
+ * ownership. Elasticsearch licenses this file to you under
+ * the Apache License, Version 2.0 (the "License"); you may
+ * not use this file except in compliance with the License.
+ * You may obtain a copy of the License at
+ *
+ * http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing,
+ * software distributed under the License is distributed on an
+ * "AS IS" BASIS, WITHOUT WARRANTIES OR CONDITIONS OF ANY
+ * KIND, either express or implied. See the License for the
+ * specific language governing permissions and limitations
+ * under the License.
+ */
+package org.elasticsearch.cluster.metadata;
+
+import org.elasticsearch.common.SuppressForbidden;
+import org.elasticsearch.common.settings.Settings;
+import org.elasticsearch.test.ESTestCase;
+
+public class EvilSystemPropertyTests extends ESTestCase {
+
+ @SuppressForbidden(reason = "manipulates system properties for testing")
+ public void testMaxNumShards() {
+ IllegalArgumentException exception = expectThrows(IllegalArgumentException.class, () ->
+ IndexMetaData.buildNumberOfShardsSetting()
+ .get(Settings.builder().put("index.number_of_shards", 1025).build()));
+ assertEquals("Failed to parse value [1025] for setting [index.number_of_shards] must be <= 1024", exception.getMessage());
+
+ Integer numShards = IndexMetaData.INDEX_NUMBER_OF_SHARDS_SETTING.get(Settings.builder().put("index.number_of_shards", 100).build());
+ assertEquals(100, numShards.intValue());
+ int limit = randomIntBetween(1, 10);
+ System.setProperty("es.index.max_number_of_shards", Integer.toString(limit));
+ try {
+ IllegalArgumentException e = expectThrows(IllegalArgumentException.class, () ->
+ IndexMetaData.buildNumberOfShardsSetting()
+ .get(Settings.builder().put("index.number_of_shards", 11).build()));
+ assertEquals("Failed to parse value [11] for setting [index.number_of_shards] must be <= " + limit, e.getMessage());
+ } finally {
+ System.clearProperty("es.index.max_number_of_shards");
+ }
+ }
+}
diff --git a/test/framework/src/test/java/org/elasticsearch/test/test/LoggingListenerTests.java b/test/framework/src/test/java/org/elasticsearch/test/test/LoggingListenerTests.java
index 2d428202741..f5f1cb77a73 100644
--- a/test/framework/src/test/java/org/elasticsearch/test/test/LoggingListenerTests.java
+++ b/test/framework/src/test/java/org/elasticsearch/test/test/LoggingListenerTests.java
@@ -21,6 +21,7 @@ package org.elasticsearch.test.test;
import org.apache.logging.log4j.Level;
import org.apache.logging.log4j.Logger;
+import org.elasticsearch.common.logging.ESLoggerFactory;
import org.elasticsearch.common.logging.Loggers;
import org.elasticsearch.test.ESTestCase;
import org.elasticsearch.test.junit.annotations.TestLogging;
@@ -50,27 +51,28 @@ public class LoggingListenerTests extends ESTestCase {
Logger xyzLogger = Loggers.getLogger("xyz");
Logger abcLogger = Loggers.getLogger("abc");
- assertEquals(Level.INFO, abcLogger.getLevel());
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
- assertThat(abcLogger.getLevel(), equalTo(Level.INFO));
+ final Level level = ESLoggerFactory.getRootLogger().getLevel();
+
+ assertThat(xyzLogger.getLevel(), equalTo(level));
+ assertThat(abcLogger.getLevel(), equalTo(level));
loggingListener.testRunStarted(suiteDescription);
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
- assertThat(abcLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
+ assertThat(abcLogger.getLevel(), equalTo(level));
Method method = TestClass.class.getMethod("annotatedTestMethod");
TestLogging annotation = method.getAnnotation(TestLogging.class);
Description testDescription = Description.createTestDescription(LoggingListenerTests.class, "annotatedTestMethod", annotation);
loggingListener.testStarted(testDescription);
assertThat(xyzLogger.getLevel(), equalTo(Level.TRACE));
- assertThat(abcLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(abcLogger.getLevel(), equalTo(level));
loggingListener.testFinished(testDescription);
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
- assertThat(abcLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
+ assertThat(abcLogger.getLevel(), equalTo(level));
loggingListener.testRunFinished(new Result());
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
- assertThat(abcLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
+ assertThat(abcLogger.getLevel(), equalTo(level));
}
public void testCustomLevelPerClass() throws Exception {
@@ -81,24 +83,26 @@ public class LoggingListenerTests extends ESTestCase {
Logger abcLogger = Loggers.getLogger("abc");
Logger xyzLogger = Loggers.getLogger("xyz");
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
- assertThat(abcLogger.getLevel(), equalTo(Level.INFO));
+ final Level level = ESLoggerFactory.getRootLogger().getLevel();
+
+ assertThat(xyzLogger.getLevel(), equalTo(level));
+ assertThat(abcLogger.getLevel(), equalTo(level));
loggingListener.testRunStarted(suiteDescription);
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
assertThat(abcLogger.getLevel(), equalTo(Level.WARN));
Description testDescription = Description.createTestDescription(LoggingListenerTests.class, "test");
loggingListener.testStarted(testDescription);
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
assertThat(abcLogger.getLevel(), equalTo(Level.WARN));
loggingListener.testFinished(testDescription);
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
assertThat(abcLogger.getLevel(), equalTo(Level.WARN));
loggingListener.testRunFinished(new Result());
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
- assertThat(abcLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
+ assertThat(abcLogger.getLevel(), equalTo(level));
}
public void testCustomLevelPerClassAndPerMethod() throws Exception {
@@ -109,10 +113,12 @@ public class LoggingListenerTests extends ESTestCase {
Logger abcLogger = Loggers.getLogger("abc");
Logger xyzLogger = Loggers.getLogger("xyz");
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
- assertThat(abcLogger.getLevel(), equalTo(Level.INFO));
+ final Level level = ESLoggerFactory.getRootLogger().getLevel();
+
+ assertThat(xyzLogger.getLevel(), equalTo(level));
+ assertThat(abcLogger.getLevel(), equalTo(level));
loggingListener.testRunStarted(suiteDescription);
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
assertThat(abcLogger.getLevel(), equalTo(Level.WARN));
Method method = TestClass.class.getMethod("annotatedTestMethod");
@@ -123,7 +129,7 @@ public class LoggingListenerTests extends ESTestCase {
assertThat(abcLogger.getLevel(), equalTo(Level.WARN));
loggingListener.testFinished(testDescription);
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
assertThat(abcLogger.getLevel(), equalTo(Level.WARN));
Method method2 = TestClass.class.getMethod("annotatedTestMethod2");
@@ -134,12 +140,12 @@ public class LoggingListenerTests extends ESTestCase {
assertThat(abcLogger.getLevel(), equalTo(Level.TRACE));
loggingListener.testFinished(testDescription2);
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
assertThat(abcLogger.getLevel(), equalTo(Level.WARN));
loggingListener.testRunFinished(new Result());
- assertThat(xyzLogger.getLevel(), equalTo(Level.INFO));
- assertThat(abcLogger.getLevel(), equalTo(Level.INFO));
+ assertThat(xyzLogger.getLevel(), equalTo(level));
+ assertThat(abcLogger.getLevel(), equalTo(level));
}
/**