|
@@ -20,13 +20,22 @@
|
|
|
package org.elasticsearch.common.settings;
|
|
|
|
|
|
import org.elasticsearch.common.inject.AbstractModule;
|
|
|
+import org.elasticsearch.common.logging.ESLogger;
|
|
|
+import org.elasticsearch.common.logging.Loggers;
|
|
|
+import org.elasticsearch.common.xcontent.ToXContent;
|
|
|
+import org.elasticsearch.common.xcontent.XContentBuilder;
|
|
|
+import org.elasticsearch.common.xcontent.XContentType;
|
|
|
import org.elasticsearch.tribe.TribeService;
|
|
|
|
|
|
+import java.io.IOException;
|
|
|
+import java.util.Collections;
|
|
|
import java.util.HashMap;
|
|
|
import java.util.HashSet;
|
|
|
import java.util.Map;
|
|
|
import java.util.Set;
|
|
|
import java.util.function.Predicate;
|
|
|
+import java.util.stream.Collectors;
|
|
|
+import java.util.stream.IntStream;
|
|
|
|
|
|
/**
|
|
|
* A module that binds the provided settings to the {@link Settings} interface.
|
|
@@ -37,9 +46,12 @@ public class SettingsModule extends AbstractModule {
|
|
|
private final Set<String> settingsFilterPattern = new HashSet<>();
|
|
|
private final Map<String, Setting<?>> nodeSettings = new HashMap<>();
|
|
|
private final Map<String, Setting<?>> indexSettings = new HashMap<>();
|
|
|
- private static final Predicate<String> TRIBE_CLIENT_NODE_SETTINGS_PREDICATE = (s) -> s.startsWith("tribe.") && TribeService.TRIBE_SETTING_KEYS.contains(s) == false;
|
|
|
+ private static final Predicate<String> TRIBE_CLIENT_NODE_SETTINGS_PREDICATE = (s) -> s.startsWith("tribe.")
|
|
|
+ && TribeService.TRIBE_SETTING_KEYS.contains(s) == false;
|
|
|
+ private final ESLogger logger;
|
|
|
|
|
|
public SettingsModule(Settings settings) {
|
|
|
+ logger = Loggers.getLogger(getClass(), settings);
|
|
|
this.settings = settings;
|
|
|
for (Setting<?> setting : ClusterSettings.BUILT_IN_CLUSTER_SETTINGS) {
|
|
|
registerSetting(setting);
|
|
@@ -53,6 +65,56 @@ public class SettingsModule extends AbstractModule {
|
|
|
protected void configure() {
|
|
|
final IndexScopedSettings indexScopedSettings = new IndexScopedSettings(settings, new HashSet<>(this.indexSettings.values()));
|
|
|
final ClusterSettings clusterSettings = new ClusterSettings(settings, new HashSet<>(this.nodeSettings.values()));
|
|
|
+ Settings indexSettings = settings.filter((s) -> s.startsWith("index.") && clusterSettings.get(s) == null);
|
|
|
+ if (indexSettings.isEmpty() == false) {
|
|
|
+ try {
|
|
|
+ String separator = IntStream.range(0, 85).mapToObj(s -> "*").collect(Collectors.joining("")).trim();
|
|
|
+ StringBuilder builder = new StringBuilder();
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ builder.append(separator);
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ builder.append("Found index level settings on node level configuration.");
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ int count = 0;
|
|
|
+ for (String word : ("Since elasticsearch 5.x index level settings can NOT be set on the nodes configuration like " +
|
|
|
+ "the elasticsearch.yaml, in system properties or command line arguments." +
|
|
|
+ "In order to upgrade all indices the settings must be updated via the /${index}/_settings API. " +
|
|
|
+ "Unless all settings are dynamic all indices must be closed in order to apply the upgrade" +
|
|
|
+ "Indices created in the future should use index templates to set default values."
|
|
|
+ ).split(" ")) {
|
|
|
+ if (count + word.length() > 85) {
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ count = 0;
|
|
|
+ }
|
|
|
+ count += word.length() + 1;
|
|
|
+ builder.append(word).append(" ");
|
|
|
+ }
|
|
|
+
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ builder.append("Please ensure all required values are updated on all indices by executing: ");
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ builder.append("curl -XPUT 'http://localhost:9200/_all/_settings?preserve_existing=true' -d '");
|
|
|
+ try (XContentBuilder xContentBuilder = XContentBuilder.builder(XContentType.JSON.xContent())) {
|
|
|
+ xContentBuilder.prettyPrint();
|
|
|
+ xContentBuilder.startObject();
|
|
|
+ indexSettings.toXContent(xContentBuilder, new ToXContent.MapParams(Collections.singletonMap("flat_settings", "true")));
|
|
|
+ xContentBuilder.endObject();
|
|
|
+ builder.append(xContentBuilder.string());
|
|
|
+ }
|
|
|
+ builder.append("'");
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+ builder.append(separator);
|
|
|
+ builder.append(System.lineSeparator());
|
|
|
+
|
|
|
+ logger.warn(builder.toString());
|
|
|
+ throw new IllegalArgumentException("node settings must not contain any index level settings");
|
|
|
+ } catch (IOException e) {
|
|
|
+ throw new RuntimeException(e);
|
|
|
+ }
|
|
|
+ }
|
|
|
// by now we are fully configured, lets check node level settings for unregistered index settings
|
|
|
final Predicate<String> acceptOnlyClusterSettings = TRIBE_CLIENT_NODE_SETTINGS_PREDICATE.negate();
|
|
|
clusterSettings.validate(settings.filter(acceptOnlyClusterSettings));
|