]> source.dussan.org Git - sonarqube.git/commitdiff
SONAR-11964 Fail at startup when detecting MySQL
authorJulien Lancelot <julien.lancelot@sonarsource.com>
Fri, 28 Jun 2019 07:21:02 +0000 (09:21 +0200)
committerSonarTech <sonartech@sonarsource.com>
Fri, 28 Jun 2019 18:21:11 +0000 (20:21 +0200)
server/sonar-db-core/src/main/java/org/sonar/db/DefaultDatabase.java
server/sonar-db-core/src/main/java/org/sonar/db/dialect/MySql.java
server/sonar-db-core/src/test/java/org/sonar/db/DefaultDatabaseTest.java
server/sonar-db-core/src/test/java/org/sonar/db/dialect/MySqlTest.java
sonar-application/src/main/assembly/conf/sonar.properties

index b2863282fe47a7aba84be467f1e9355ffd339952..0349abf3a40bbb9935ef7b707f078c6b5d81553a 100644 (file)
@@ -33,10 +33,12 @@ import org.apache.commons.dbcp2.BasicDataSourceFactory;
 import org.apache.commons.dbutils.DbUtils;
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.config.Settings;
+import org.sonar.api.utils.MessageException;
 import org.sonar.api.utils.log.Logger;
 import org.sonar.api.utils.log.Loggers;
 import org.sonar.db.dialect.Dialect;
 import org.sonar.db.dialect.DialectUtils;
+import org.sonar.db.dialect.MySql;
 import org.sonar.db.profiling.NullConnectionInterceptor;
 import org.sonar.db.profiling.ProfiledConnectionInterceptor;
 import org.sonar.db.profiling.ProfiledDataSource;
@@ -63,8 +65,7 @@ public class DefaultDatabase implements Database {
   private static final String DBCP_JDBC_MAX_WAIT = "maxWaitMillis";
   private static final Map<String, String> SONAR_JDBC_TO_DBCP_PROPERTY_MAPPINGS = ImmutableMap.of(
     SONAR_JDBC_MAX_ACTIVE, DBCP_JDBC_MAX_ACTIVE,
-    SONAR_JDBC_MAX_WAIT, DBCP_JDBC_MAX_WAIT
-  );
+    SONAR_JDBC_MAX_WAIT, DBCP_JDBC_MAX_WAIT);
 
   private final LogbackHelper logbackHelper;
   private final Settings settings;
@@ -79,8 +80,9 @@ public class DefaultDatabase implements Database {
 
   @Override
   public void start() {
+    initSettings();
+    failIfMySql();
     try {
-      initSettings();
       initDataSource();
       checkConnection();
 
@@ -100,6 +102,19 @@ public class DefaultDatabase implements Database {
     properties.setProperty(SONAR_JDBC_DRIVER, dialect.getDefaultDriverClassName());
   }
 
+  private void failIfMySql() {
+    if (!MySql.ID.equals(dialect.getId())) {
+      return;
+    }
+    throw MessageException.of("\n" +
+      "#############################################################################################################\n" +
+      "#         End of Life of MySQL Support : SonarQube 7.9 and future versions do not support MySQL.            #\n" +
+      "#         Please migrate to a supported database. Get more details at                                       #\n" +
+      "#         https://community.sonarsource.com/t/end-of-life-of-mysql-support                                  #\n" +
+      "#         and https://github.com/SonarSource/mysql-migrator                                                 #\n" +
+      "#############################################################################################################\n");
+  }
+
   private void initDataSource() throws Exception {
     // but it's correctly caught by start()
     LOG.info("Create JDBC data source for {}", properties.getProperty(JDBC_URL.getKey()), DEFAULT_URL);
index bc8dfe815288af84494fbbd274a80669a9b53d26..08c5d88713858b96071272037941f791f8533a41 100644 (file)
@@ -23,7 +23,6 @@ import java.sql.DatabaseMetaData;
 import java.sql.SQLException;
 import org.apache.commons.lang.StringUtils;
 import org.sonar.api.utils.Version;
-import org.sonar.api.utils.log.Loggers;
 
 public class MySql extends AbstractDialect {
 
@@ -62,15 +61,5 @@ public class MySql extends AbstractDialect {
   @Override
   public void init(DatabaseMetaData metaData) throws SQLException {
     checkDbVersion(metaData, MIN_SUPPORTED_VERSION);
-
-    String message = "\n" +
-      "#############################################################################################################\n" +
-      "#         End of Life of MySQL Support : SonarQube 7.8 is the last version that will support MySQL.         #\n" +
-      "#         Please consider migrating to a supported database. Get the migration detail on                    #\n" +
-      "#         https://community.sonarsource.com/t/end-of-life-of-mysql-support                                  #\n" +
-      "#         and https://github.com/SonarSource/mysql-migrator                                                 #\n" +
-      "#############################################################################################################\n";
-
-    Loggers.get(getClass()).warn(message);
   }
 }
index a43143b586184e77328301418e0b5937bd00ddaf..f282aabcdb0e5bb4eabdeaf14c5421d0af45bf68 100644 (file)
@@ -28,8 +28,8 @@ import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.junit.runner.RunWith;
-import org.sonar.api.config.Settings;
 import org.sonar.api.config.internal.MapSettings;
+import org.sonar.api.utils.MessageException;
 import org.sonar.db.dialect.PostgreSql;
 import org.sonar.process.logging.LogbackHelper;
 
@@ -40,10 +40,10 @@ import static org.mockito.Mockito.mock;
 
 @RunWith(DataProviderRunner.class)
 public class DefaultDatabaseTest {
+
   private LogbackHelper logbackHelper = mock(LogbackHelper.class);
   private static final String SONAR_JDBC = "sonar.jdbc.";
 
-
   @Rule
   public ExpectedException expectedException = none();
 
@@ -101,7 +101,7 @@ public class DefaultDatabaseTest {
 
   @Test
   public void shouldCompleteProperties() {
-    Settings settings = new MapSettings();
+    MapSettings settings = new MapSettings();
 
     DefaultDatabase db = new DefaultDatabase(logbackHelper, settings) {
       @Override
@@ -118,7 +118,7 @@ public class DefaultDatabaseTest {
 
   @Test
   public void shouldStart() {
-    Settings settings = new MapSettings();
+    MapSettings settings = new MapSettings();
     settings.setProperty("sonar.jdbc.url", "jdbc:h2:mem:sonar");
     settings.setProperty("sonar.jdbc.driverClassName", "org.h2.Driver");
     settings.setProperty("sonar.jdbc.username", "sonar");
@@ -135,7 +135,7 @@ public class DefaultDatabaseTest {
 
   @Test
   public void shouldGuessDialectFromUrl() {
-    Settings settings = new MapSettings();
+    MapSettings settings = new MapSettings();
     settings.setProperty("sonar.jdbc.url", "jdbc:postgresql://localhost/sonar");
 
     DefaultDatabase database = new DefaultDatabase(logbackHelper, settings);
@@ -146,7 +146,7 @@ public class DefaultDatabaseTest {
 
   @Test
   public void shouldGuessDefaultDriver() {
-    Settings settings = new MapSettings();
+    MapSettings settings = new MapSettings();
     settings.setProperty("sonar.jdbc.url", "jdbc:postgresql://localhost/sonar");
 
     DefaultDatabase database = new DefaultDatabase(logbackHelper, settings);
@@ -155,6 +155,18 @@ public class DefaultDatabaseTest {
     assertThat(database.getProperties().getProperty("sonar.jdbc.driverClassName")).isEqualTo("org.postgresql.Driver");
   }
 
+  @Test
+  public void fail_when_mysql_is_used() {
+    MapSettings settings = new MapSettings();
+    settings.setProperty("sonar.jdbc.url", "jdbc:mysql://localhost/sonar");
+
+    DefaultDatabase database = new DefaultDatabase(logbackHelper, settings);
+
+    expectedException.expect(MessageException.class);
+    expectedException.expectMessage("End of Life of MySQL Support");
+    database.start();
+  }
+
   @DataProvider
   public static Object[][] sonarJdbcAndDbcpProperties() {
     return new Object[][] {
index a176c15bdf14b94a56dd765285a61eba00c49ca2..5982642cbfd21c98329cb77be78eafdb049e146e 100644 (file)
@@ -21,14 +21,12 @@ package org.sonar.db.dialect;
 
 import java.sql.DatabaseMetaData;
 import java.sql.SQLException;
-import java.util.List;
 import org.junit.Rule;
 import org.junit.Test;
 import org.junit.rules.ExpectedException;
 import org.mockito.Mockito;
 import org.sonar.api.utils.MessageException;
 import org.sonar.api.utils.log.LogTester;
-import org.sonar.api.utils.log.LoggerLevel;
 
 import static org.assertj.core.api.Assertions.assertThat;
 import static org.mockito.Mockito.mock;
@@ -86,24 +84,16 @@ public class MySqlTest {
     expectedException.expect(MessageException.class);
     expectedException.expectMessage("Unsupported mysql version: 5.5. Minimal supported version is 5.6.");
 
-    DatabaseMetaData metadata = newMetadata( 5, 5);
+    DatabaseMetaData metadata = newMetadata(5, 5);
     underTest.init(metadata);
   }
 
   @Test
   public void init_does_not_fail_if_mysql_5_6() throws Exception {
-    DatabaseMetaData metadata = newMetadata( 5, 6);
+    DatabaseMetaData metadata = newMetadata(5, 6);
     underTest.init(metadata);
   }
 
-  @Test
-  public void init_logs_warning() throws SQLException {
-    underTest.init(newMetadata(5, 6));
-
-    List<String> logs = this.logs.logs(LoggerLevel.WARN);
-    assertThat(logs.get(0).contains("End of Life of MySQL Support : SonarQube 7.8 is the last version that will support MySQL.")).isTrue();
-  }
-
   @Test
   public void supportsUpsert_returns_false() {
     assertThat(underTest.supportsUpsert()).isFalse();
index faf3e39c15f64fd2e3879f1745c2a486f08bde17..d69565f27e800c3f8d45b631ca52bda354c74bdc 100644 (file)
 # H2 embedded database server listening port, defaults to 9092
 #sonar.embeddedDatabase.port=9092
 
-#----- DEPRECATED 
-#----- MySQL >=5.6 && <8.0
-# Support of MySQL is dropped in Data Center Editions and deprecated in all other editions
-# Only InnoDB storage engine is supported (not myISAM).
-# Only the bundled driver is supported. It can not be changed.
-#sonar.jdbc.url=jdbc:mysql://localhost:3306/sonar?useUnicode=true&characterEncoding=utf8&rewriteBatchedStatements=true&useConfigs=maxPerformance&useSSL=false
-
 
 #----- Oracle 11g/12c
 # The Oracle JDBC driver must be copied into the directory extensions/jdbc-driver/oracle/.