aboutsummaryrefslogtreecommitdiffstats
path: root/server/sonar-server
diff options
context:
space:
mode:
authorSébastien Lesaint <sebastien.lesaint@sonarsource.com>2019-06-12 14:05:21 +0200
committerSonarTech <sonartech@sonarsource.com>2019-06-14 20:21:10 +0200
commit94b72ea61ba5dd9a16c90f5674df234f1131baf4 (patch)
treeebd904e48dd13de5f97dedade99a23c24933e645 /server/sonar-server
parent856a11e8266edf43d70d3781d30ac017435685bb (diff)
downloadsonarqube-94b72ea61ba5dd9a16c90f5674df234f1131baf4.tar.gz
sonarqube-94b72ea61ba5dd9a16c90f5674df234f1131baf4.zip
SONAR-12187 do not fail at startup if ES indices are read-only
unless the DB vendor is changed
Diffstat (limited to 'server/sonar-server')
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/es/metadata/EsDbCompatibilityImpl.java4
-rw-r--r--server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java4
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/es/IndexCreatorTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/es/IndexerStartupTaskTest.java3
-rw-r--r--server/sonar-server/src/test/java/org/sonar/server/es/metadata/EsDbCompatibilityImplTest.java77
5 files changed, 78 insertions, 13 deletions
diff --git a/server/sonar-server/src/main/java/org/sonar/server/es/metadata/EsDbCompatibilityImpl.java b/server/sonar-server/src/main/java/org/sonar/server/es/metadata/EsDbCompatibilityImpl.java
index b846d1fc450..c535e81d92d 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/es/metadata/EsDbCompatibilityImpl.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/es/metadata/EsDbCompatibilityImpl.java
@@ -40,7 +40,9 @@ public class EsDbCompatibilityImpl implements EsDbCompatibility {
@Override
public void markAsCompatible() {
- metadataIndex.setDbMetadata(getDbVendor());
+ if (!hasSameDbVendor()) {
+ metadataIndex.setDbMetadata(getDbVendor());
+ }
}
private String getDbVendor() {
diff --git a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java
index e47bbbe1d28..f7081969ecf 100644
--- a/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java
+++ b/server/sonar-server/src/main/java/org/sonar/server/platform/platformlevel/PlatformLevel4.java
@@ -63,8 +63,8 @@ import org.sonar.server.es.IndexDefinitions;
import org.sonar.server.es.ProjectIndexersImpl;
import org.sonar.server.es.RecoveryIndexer;
import org.sonar.server.es.metadata.EsDbCompatibilityImpl;
-import org.sonar.server.es.metadata.MetadataIndex;
import org.sonar.server.es.metadata.MetadataIndexDefinition;
+import org.sonar.server.es.metadata.MetadataIndexImpl;
import org.sonar.server.extension.CoreExtensionBootstraper;
import org.sonar.server.extension.CoreExtensionStopper;
import org.sonar.server.favorite.FavoriteModule;
@@ -244,7 +244,7 @@ public class PlatformLevel4 extends PlatformLevel {
addIfStartupLeader(
IndexCreator.class,
MetadataIndexDefinition.class,
- MetadataIndex.class,
+ MetadataIndexImpl.class,
EsDbCompatibilityImpl.class);
addIfCluster(NodeHealthModule.class);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/es/IndexCreatorTest.java b/server/sonar-server/src/test/java/org/sonar/server/es/IndexCreatorTest.java
index ba7f0138ef1..d3d6797a4d3 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/es/IndexCreatorTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/es/IndexCreatorTest.java
@@ -36,6 +36,7 @@ import org.sonar.api.utils.log.LoggerLevel;
import org.sonar.server.es.IndexType.IndexMainType;
import org.sonar.server.es.metadata.MetadataIndex;
import org.sonar.server.es.metadata.MetadataIndexDefinition;
+import org.sonar.server.es.metadata.MetadataIndexImpl;
import org.sonar.server.es.newindex.NewRegularIndex;
import org.sonar.server.es.newindex.SettingsConfiguration;
import org.sonar.server.platform.db.migration.es.MigrationEsClient;
@@ -60,7 +61,7 @@ public class IndexCreatorTest {
public EsTester es = EsTester.createCustom();
private MetadataIndexDefinition metadataIndexDefinition = new MetadataIndexDefinition(new MapSettings().asConfig());
- private MetadataIndex metadataIndex = new MetadataIndex(es.client());
+ private MetadataIndex metadataIndex = new MetadataIndexImpl(es.client());
private TestEsDbCompatibility esDbCompatibility = new TestEsDbCompatibility();
private MapSettings settings = new MapSettings();
private MigrationEsClient migrationEsClient = mock(MigrationEsClient.class);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/es/IndexerStartupTaskTest.java b/server/sonar-server/src/test/java/org/sonar/server/es/IndexerStartupTaskTest.java
index b9b17c31ee2..de10b8e1905 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/es/IndexerStartupTaskTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/es/IndexerStartupTaskTest.java
@@ -26,6 +26,7 @@ import org.junit.Test;
import org.mockito.Mockito;
import org.sonar.api.config.internal.MapSettings;
import org.sonar.server.es.metadata.MetadataIndex;
+import org.sonar.server.es.metadata.MetadataIndexImpl;
import org.sonar.server.es.newindex.FakeIndexDefinition;
import static org.mockito.ArgumentMatchers.eq;
@@ -41,7 +42,7 @@ public class IndexerStartupTaskTest {
public EsTester es = EsTester.createCustom(new FakeIndexDefinition());
private final MapSettings settings = new MapSettings();
- private final MetadataIndex metadataIndex = mock(MetadataIndex.class);
+ private final MetadataIndex metadataIndex = mock(MetadataIndexImpl.class);
private final StartupIndexer indexer = mock(StartupIndexer.class);
private final IndexerStartupTask underTest = new IndexerStartupTask(es.client(), settings.asConfig(), metadataIndex, indexer);
diff --git a/server/sonar-server/src/test/java/org/sonar/server/es/metadata/EsDbCompatibilityImplTest.java b/server/sonar-server/src/test/java/org/sonar/server/es/metadata/EsDbCompatibilityImplTest.java
index 108c89475a6..66001567d87 100644
--- a/server/sonar-server/src/test/java/org/sonar/server/es/metadata/EsDbCompatibilityImplTest.java
+++ b/server/sonar-server/src/test/java/org/sonar/server/es/metadata/EsDbCompatibilityImplTest.java
@@ -19,24 +19,34 @@
*/
package org.sonar.server.es.metadata;
+import java.util.HashMap;
+import java.util.Map;
+import java.util.Optional;
+import javax.annotation.CheckForNull;
import org.junit.Rule;
import org.junit.Test;
import org.junit.rules.ExpectedException;
import org.mockito.Mockito;
import org.sonar.db.DbClient;
-import org.sonar.server.es.EsTester;
-import org.sonar.server.es.newindex.FakeIndexDefinition;
+import org.sonar.server.es.Index;
+import org.sonar.server.es.IndexType;
+
+import static org.apache.commons.lang.RandomStringUtils.randomAlphabetic;
import static org.assertj.core.api.Assertions.assertThat;
+import static org.mockito.ArgumentMatchers.anyString;
import static org.mockito.Mockito.mock;
+import static org.mockito.Mockito.reset;
+import static org.mockito.Mockito.spy;
+import static org.mockito.Mockito.times;
+import static org.mockito.Mockito.verify;
import static org.mockito.Mockito.when;
public class EsDbCompatibilityImplTest {
@Rule
public ExpectedException expectedException = ExpectedException.none();
- @Rule
- public EsTester es = EsTester.createCustom(new MetadataIndexDefinitionBridge(), new FakeIndexDefinition());
+
private DbClient dbClient = mock(DbClient.class, Mockito.RETURNS_DEEP_STUBS);
- private MetadataIndex metadataIndex = new MetadataIndex(es.client());
+ private MetadataIndex metadataIndex = spy(new TestMetadataIndex());
private EsDbCompatibilityImpl underTest = new EsDbCompatibilityImpl(dbClient, metadataIndex);
@Test
@@ -63,7 +73,7 @@ public class EsDbCompatibilityImplTest {
}
@Test
- public void store_db_metadata_in_es() {
+ public void markAsCompatible_db_metadata_in_es() {
prepareDb("mysql");
underTest.markAsCompatible();
@@ -72,7 +82,7 @@ public class EsDbCompatibilityImplTest {
}
@Test
- public void store_updates_db_metadata_in_es() {
+ public void markAsCompatible_updates_db_metadata_in_es() {
prepareEs("mysql");
prepareDb("postgres");
@@ -82,7 +92,7 @@ public class EsDbCompatibilityImplTest {
}
@Test
- public void store_marks_es_as_compatible_with_db() {
+ public void markAsCompatible_marks_es_as_compatible_with_db() {
prepareDb("postgres");
underTest.markAsCompatible();
@@ -90,11 +100,62 @@ public class EsDbCompatibilityImplTest {
assertThat(underTest.hasSameDbVendor()).isTrue();
}
+ @Test
+ public void markAsCompatible_has_no_effect_if_vendor_is_the_same() {
+ String vendor = randomAlphabetic(12);
+ prepareEs(vendor);
+ prepareDb(vendor);
+
+ underTest.markAsCompatible();
+
+ assertThat(underTest.hasSameDbVendor()).isTrue();
+ verify(metadataIndex, times(0)).setDbMetadata(anyString());
+ }
+
private void prepareDb(String dbVendor) {
when(dbClient.getDatabase().getDialect().getId()).thenReturn(dbVendor);
}
private void prepareEs(String dbVendor) {
metadataIndex.setDbMetadata(dbVendor);
+ // reset spy to not perturbate assertions on spy from verified code
+ reset(metadataIndex);
+ }
+
+ private static class TestMetadataIndex implements MetadataIndex {
+ private final Map<Index, String> hashes = new HashMap<>();
+ private final Map<IndexType, Boolean> initializeds = new HashMap<>();
+ @CheckForNull
+ private String dbVendor = null;
+
+ @Override
+ public Optional<String> getHash(Index index) {
+ return Optional.ofNullable(hashes.get(index));
+ }
+
+ @Override
+ public void setHash(Index index, String hash) {
+ hashes.put(index, hash);
+ }
+
+ @Override
+ public boolean getInitialized(IndexType indexType) {
+ return initializeds.getOrDefault(indexType, false);
+ }
+
+ @Override
+ public void setInitialized(IndexType indexType, boolean initialized) {
+ initializeds.put(indexType, initialized);
+ }
+
+ @Override
+ public Optional<String> getDbVendor() {
+ return Optional.ofNullable(dbVendor);
+ }
+
+ @Override
+ public void setDbMetadata(String vendor) {
+ this.dbVendor = vendor;
+ }
}
}