]> source.dussan.org Git - sonarqube.git/commitdiff
Ability to customize the number of ES shards/replicas per index
authorSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 5 Oct 2015 07:09:45 +0000 (09:09 +0200)
committerSimon Brandhof <simon.brandhof@sonarsource.com>
Mon, 5 Oct 2015 07:09:45 +0000 (09:09 +0200)
Properties are not documented on purpose. For internal tests for
now.

server/sonar-server/src/main/java/org/sonar/server/es/IndexDefinition.java
server/sonar-server/src/main/java/org/sonar/server/es/NewIndex.java
server/sonar-server/src/test/java/org/sonar/server/es/NewIndexTest.java

index 7f9adbfbae79a61707791441bf7a4c7065df2bbb..20c90752707ab5d40734bbeb4ab6061cf9b12c10 100644 (file)
@@ -28,7 +28,7 @@ import java.util.Map;
 @ServerSide
 public interface IndexDefinition {
 
-  public static class IndexDefinitionContext {
+  class IndexDefinitionContext {
     private final Map<String, NewIndex> byKey = Maps.newHashMap();
 
     public NewIndex create(String key) {
index fb136dc0fce917c8b38bde75bf7840248db9d704..68604e722b3ad863cbc231c6f92fd1701603a818 100644 (file)
@@ -23,6 +23,10 @@ import com.google.common.base.Preconditions;
 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;
@@ -30,11 +34,7 @@ import org.sonar.api.config.Settings;
 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 {
 
@@ -42,15 +42,6 @@ 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<>();
@@ -304,4 +295,18 @@ public class NewIndex {
   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);
+  }
 }
index 7a3152ada9e7afcf42f665297b6402f6ea18c102..a64c75666fe32b103142e857fd21182b2c14c4ab 100644 (file)
@@ -20,6 +20,7 @@
 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;
 
@@ -144,4 +145,44 @@ public class NewIndexTest {
       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");
+  }
 }