You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by sw...@apache.org on 2016/12/01 08:13:55 UTC

[12/50] ambari git commit: AMBARI-18951. Force InnoDB usage for MySQL. (mpapirkovskyy)

AMBARI-18951. Force InnoDB usage for MySQL. (mpapirkovskyy)


Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/98e41c67
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/98e41c67
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/98e41c67

Branch: refs/heads/branch-feature-AMBARI-18901
Commit: 98e41c677b2e22e694eda27ee6217d560ac4dbe2
Parents: 911b917
Author: Myroslav Papirkovskyi <mp...@hortonworks.com>
Authored: Mon Nov 28 18:25:07 2016 +0200
Committer: Myroslav Papirkovskyi <mp...@hortonworks.com>
Committed: Mon Nov 28 18:44:23 2016 +0200

----------------------------------------------------------------------
 .../server/orm/helpers/dbms/MySqlHelper.java    | 18 ++++++++++
 .../server/upgrade/SchemaUpgradeHelper.java     | 35 +++++++++++++++++++-
 .../main/resources/Ambari-DDL-MySQL-CREATE.sql  |  1 +
 3 files changed, 53 insertions(+), 1 deletion(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/98e41c67/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java
index 38fe062..8a83c90 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/helpers/dbms/MySqlHelper.java
@@ -19,8 +19,13 @@
 package org.apache.ambari.server.orm.helpers.dbms;
 
 import org.apache.ambari.server.orm.DBAccessor;
+import org.eclipse.persistence.exceptions.ValidationException;
 import org.eclipse.persistence.platform.database.DatabasePlatform;
 
+import java.io.IOException;
+import java.io.Writer;
+import java.util.List;
+
 public class MySqlHelper extends GenericDbmsHelper {
   public MySqlHelper(DatabasePlatform databasePlatform) {
     super(databasePlatform);
@@ -75,4 +80,17 @@ public class MySqlHelper extends GenericDbmsHelper {
                                     .append("AND constraints.TABLE_NAME = \"").append(tableName).append("\"");
     return statement.toString();
   }
+
+  @Override
+  public Writer writeCreateTableStatement(Writer writer, String tableName,
+                                          List<DBAccessor.DBColumnInfo> columns,
+                                          List<String> primaryKeyColumns) {
+    Writer defaultWriter = super.writeCreateTableStatement(writer, tableName, columns, primaryKeyColumns);
+    try {
+      defaultWriter.write(" ENGINE=INNODB");
+    } catch (IOException e) {
+      throw ValidationException.fileError(e);
+    }
+    return defaultWriter;
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/98e41c67/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
index f772024..1b5503e 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/SchemaUpgradeHelper.java
@@ -45,6 +45,7 @@ import com.google.inject.Inject;
 import com.google.inject.Injector;
 import com.google.inject.multibindings.Multibinder;
 import com.google.inject.persist.PersistService;
+import org.springframework.jdbc.support.JdbcUtils;
 
 public class SchemaUpgradeHelper {
   private static final Logger LOG = LoggerFactory.getLogger
@@ -330,7 +331,7 @@ public class SchemaUpgradeHelper {
   /**
    * Checks if source version meets minimal requirements for upgrade
    *
-   * @param minUpgradeVersion min allowed version for the upgrade, could be obtained via {@link SchemaUpgradeHelper.getMinimalUpgradeCatalogVersion}
+   * @param minUpgradeVersion min allowed version for the upgrade, could be obtained via {@link #getMinimalUpgradeCatalogVersion()}
    * @param sourceVersion current version of the Database, which need to be upgraded
    *
    * @return  true if upgrade is allowed or false if not
@@ -343,6 +344,29 @@ public class SchemaUpgradeHelper {
     return VersionUtils.compareVersions(sourceVersion, minUpgradeVersion) >= 0;
   }
 
+  private List<String> getMyISAMTables() throws SQLException {
+    if (!configuration.getDatabaseType().equals(Configuration.DatabaseType.MYSQL)) {
+      return Collections.emptyList();
+    }
+    List<String> myISAMTables = new ArrayList<>();
+    String query = String.format("SELECT table_name FROM information_schema.tables WHERE table_schema = '%s' " +
+      "AND engine = 'MyISAM' AND table_type = 'BASE TABLE'", configuration.getServerDBName());
+    Statement statement = null;
+    ResultSet rs = null;
+    try {
+      statement = dbAccessor.getConnection().createStatement();
+      rs = statement.executeQuery(query);
+      if (rs != null) {
+        while (rs.next()) {
+          myISAMTables.add(rs.getString("table_name"));
+        }
+      }
+    } finally {
+      JdbcUtils.closeResultSet(rs);
+      JdbcUtils.closeStatement(statement);
+    }
+    return myISAMTables;
+  }
 
   /**
    * Upgrade Ambari DB schema to the target version passed in as the only
@@ -363,6 +387,15 @@ public class SchemaUpgradeHelper {
       Injector injector = Guice.createInjector(new UpgradeHelperModule(), new AuditLoggerModule());
       SchemaUpgradeHelper schemaUpgradeHelper = injector.getInstance(SchemaUpgradeHelper.class);
 
+      //Fail if MySQL database has tables with MyISAM engine
+      List<String> myISAMTables = schemaUpgradeHelper.getMyISAMTables();
+      if (!myISAMTables.isEmpty()) {
+        String errorMessage = String.format("Unsupported MyISAM table %s detected. " +
+            "For correct upgrade database should be migrated to InnoDB engine.", myISAMTables.get(0));
+        LOG.error(errorMessage);
+        throw new AmbariException(errorMessage);
+      }
+
       String targetVersion = schemaUpgradeHelper.getAmbariServerVersion();
       LOG.info("Upgrading schema to target version = " + targetVersion);
 

http://git-wip-us.apache.org/repos/asf/ambari/blob/98e41c67/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
index 09042b5..b01ed2f 100644
--- a/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
+++ b/ambari-server/src/main/resources/Ambari-DDL-MySQL-CREATE.sql
@@ -26,6 +26,7 @@ delimiter ;
 
 # USE @schema;
 
+SET default_storage_engine=INNODB;
 
 CREATE TABLE stack(
   stack_id BIGINT NOT NULL,