@ServerSide
public interface IndexDefinition {
- public static class IndexDefinitionContext {
+ class IndexDefinitionContext {
private final Map<String, NewIndex> byKey = Maps.newHashMap();
public NewIndex create(String key) {
import com.google.common.collect.ImmutableMap;
import com.google.common.collect.ImmutableSortedMap;
import com.google.common.collect.Maps;
+import java.util.Map;
+import java.util.SortedMap;
+import java.util.TreeMap;
+import javax.annotation.CheckForNull;
import org.apache.commons.lang.StringUtils;
import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.settings.ImmutableSettings;
import org.sonar.process.ProcessProperties;
import org.sonar.server.search.IndexField;
-import javax.annotation.CheckForNull;
-
-import java.util.Map;
-import java.util.SortedMap;
-import java.util.TreeMap;
+import static java.lang.String.format;
public class NewIndex {
getSettings().put("index.refresh_interval", "-1");
}
- public void setShards(Settings settings) {
- boolean clusterMode = settings.getBoolean(ProcessProperties.CLUSTER_ACTIVATE);
- if (clusterMode) {
- getSettings().put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, 4);
- getSettings().put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, 1);
- // else keep defaults (one shard)
- }
- }
-
public static class NewIndexType {
private final String name;
private final Map<String, Object> attributes = new TreeMap<>();
public SortedMap<String, NewIndexType> getTypes() {
return types;
}
+
+ public void setShards(Settings settings) {
+ boolean clusterMode = settings.getBoolean(ProcessProperties.CLUSTER_ACTIVATE);
+ int shards = settings.getInt(format("sonar.search.%s.shards", indexName));
+ if (shards == 0) {
+ shards = (clusterMode ? 4 : 1);
+ }
+ int replicas = settings.getInt(format("sonar.search.%s.replicas", indexName));
+ if (replicas == 0) {
+ replicas = (clusterMode ? 1 : 0);
+ }
+ getSettings().put(IndexMetaData.SETTING_NUMBER_OF_SHARDS, shards);
+ getSettings().put(IndexMetaData.SETTING_NUMBER_OF_REPLICAS, replicas);
+ }
}
package org.sonar.server.es;
import com.google.common.collect.ImmutableMap;
+import org.elasticsearch.cluster.metadata.IndexMetaData;
import org.elasticsearch.common.settings.Settings;
import org.junit.Test;
assertThat(e).hasMessage("Can't mix searchable and non-searchable arguments on field: my_field");
}
}
+
+ @Test
+ public void one_shard_and_zero_replica_by_default() {
+ NewIndex index = new NewIndex("issues");
+ index.setShards(new org.sonar.api.config.Settings());
+ assertThat(index.getSettings().get(IndexMetaData.SETTING_NUMBER_OF_SHARDS)).isEqualTo("1");
+ assertThat(index.getSettings().get(IndexMetaData.SETTING_NUMBER_OF_REPLICAS)).isEqualTo("0");
+ }
+
+ @Test
+ public void four_shards_and_one_replica_by_default_on_cluster() {
+ NewIndex index = new NewIndex("issues");
+ org.sonar.api.config.Settings settings = new org.sonar.api.config.Settings();
+ settings.setProperty("sonar.cluster.activate", "true");
+ index.setShards(settings);
+ assertThat(index.getSettings().get(IndexMetaData.SETTING_NUMBER_OF_SHARDS)).isEqualTo("4");
+ assertThat(index.getSettings().get(IndexMetaData.SETTING_NUMBER_OF_REPLICAS)).isEqualTo("1");
+ }
+
+ @Test
+ public void customize_number_of_shards() {
+ NewIndex index = new NewIndex("issues");
+ org.sonar.api.config.Settings settings = new org.sonar.api.config.Settings();
+ settings.setProperty("sonar.search.issues.shards", "3");
+ index.setShards(settings);
+ assertThat(index.getSettings().get(IndexMetaData.SETTING_NUMBER_OF_SHARDS)).isEqualTo("3");
+ // keep default value
+ assertThat(index.getSettings().get(IndexMetaData.SETTING_NUMBER_OF_REPLICAS)).isEqualTo("0");
+ }
+
+ @Test
+ public void customize_number_of_shards_and_replicas() {
+ NewIndex index = new NewIndex("issues");
+ org.sonar.api.config.Settings settings = new org.sonar.api.config.Settings();
+ settings.setProperty("sonar.search.issues.shards", "3");
+ settings.setProperty("sonar.search.issues.replicas", "1");
+ index.setShards(settings);
+ assertThat(index.getSettings().get(IndexMetaData.SETTING_NUMBER_OF_SHARDS)).isEqualTo("3");
+ assertThat(index.getSettings().get(IndexMetaData.SETTING_NUMBER_OF_REPLICAS)).isEqualTo("1");
+ }
}