You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by jo...@apache.org on 2017/07/18 15:03:19 UTC

[43/50] [abbrv] ambari git commit: AMBARI-21490 Ambari Schema Upgrade fails : Unknown column 'from_version' in 'field list' (dgrinenko)

AMBARI-21490 Ambari Schema Upgrade fails : Unknown column 'from_version' in 'field list' (dgrinenko)


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

Branch: refs/heads/branch-feature-AMBARI-21450
Commit: 651fe3d706185992e107486ee69059ec8eccf909
Parents: 606c5ca
Author: Dmytro Grinenko <ha...@apache.org>
Authored: Mon Jul 17 18:51:26 2017 +0300
Committer: Dmytro Grinenko <ha...@apache.org>
Committed: Mon Jul 17 18:51:26 2017 +0300

----------------------------------------------------------------------
 .../apache/ambari/server/orm/DBAccessor.java    |  14 ++
 .../ambari/server/orm/DBAccessorImpl.java       |  24 +++
 .../server/upgrade/UpgradeCatalog220.java       | 197 +------------------
 .../server/upgrade/UpgradeCatalog252.java       |  11 +-
 4 files changed, 48 insertions(+), 198 deletions(-)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/ambari/blob/651fe3d7/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java
index 899426e..0313698 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessor.java
@@ -680,6 +680,20 @@ public interface DBAccessor {
   void moveColumnToAnotherTable(String sourceTableName, DBColumnInfo sourceColumn, String sourceIDFieldName,
        String targetTableName, DBColumnInfo targetColumn, String targetIDFieldName, Object initialValue) throws SQLException;
 
+  /**
+   * Remove all rows from the table
+   * @param tableName name of the table
+   */
+  void clearTable(String tableName) throws SQLException;
+
+  /**
+   * Reset all rows with {@code value} for {@code columnName} column
+   * @param tableName name of the table
+   * @param columnName name of the column name to be update
+   * @param value data to use for update
+   */
+  void clearTableColumn(String tableName, String columnName, Object value) throws SQLException;
+
   enum DbType {
     ORACLE,
     MYSQL,

http://git-wip-us.apache.org/repos/asf/ambari/blob/651fe3d7/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
index 2256d44..38d60e9 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/orm/DBAccessorImpl.java
@@ -1442,4 +1442,28 @@ public class DBAccessorImpl implements DBAccessor {
       dropColumn(sourceTableName, sourceColumn.getName());
     }
   }
+
+  /**
+   * Remove all rows from the table
+   *
+   * @param tableName name of the table
+   */
+  @Override
+  public void clearTable(String tableName) throws SQLException{
+    String sqlQuery = "DELETE FROM " + convertObjectName(tableName);
+    executeQuery(sqlQuery);
+  }
+
+  /**
+   * Reset all rows with {@code value} for {@code columnName} column
+   *
+   * @param tableName  name of the table
+   * @param columnName
+   * @param value      data to use for update
+   */
+  @Override
+  public void clearTableColumn(String tableName, String columnName, Object value) throws SQLException {
+    String sqlQuery = String.format("UPDATE %s SET %s = ?", convertObjectName(tableName), convertObjectName(columnName));
+    executePreparedUpdate(sqlQuery, value);
+  }
 }

http://git-wip-us.apache.org/repos/asf/ambari/blob/651fe3d7/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java
index 8ee7943..0bf60af 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog220.java
@@ -455,22 +455,10 @@ public class UpgradeCatalog220 extends AbstractUpgradeCatalog {
   protected void executeStackUpgradeDDLUpdates() throws SQLException, AmbariException {
     final Configuration.DatabaseType databaseType = configuration.getDatabaseType();
 
-    // Add columns
-    if (!dbAccessor.tableHasColumn(UPGRADE_TABLE, UPGRADE_PACKAGE_COL)) {
-      LOG.info("Adding upgrade_package column to upgrade table.");
-      dbAccessor.addColumn(UPGRADE_TABLE, new DBColumnInfo(UPGRADE_PACKAGE_COL, String.class, 255, null, true));
-    }
-    if (!dbAccessor.tableHasColumn(UPGRADE_TABLE, UPGRADE_TYPE_COL)) {
-      LOG.info("Adding upgrade_type column to upgrade table.");
-      dbAccessor.addColumn(UPGRADE_TABLE, new DBColumnInfo(UPGRADE_TYPE_COL, String.class, 32, null, true));
-    }
-
-    // Populate values in upgrade table.
-    boolean success = populateUpgradeTable();
+    dbAccessor.addColumn(UPGRADE_TABLE, new DBColumnInfo(UPGRADE_PACKAGE_COL, String.class, 255, null, true));
+    dbAccessor.addColumn(UPGRADE_TABLE, new DBColumnInfo(UPGRADE_TYPE_COL, String.class, 32, null, true));
 
-    if (!success) {
-      throw new AmbariException("Errors found while populating the upgrade table with values for columns upgrade_type and upgrade_package.");
-    }
+    // Tip: skipping data update as we clearing this table at UpgradeCatalog252 DDL
 
     if (dbAccessor.tableHasColumn(REPO_VERSION_TABLE, UPGRADE_PACKAGE_COL)) {
       LOG.info("Dropping upgrade_package column from repo_version table.");
@@ -500,184 +488,7 @@ public class UpgradeCatalog220 extends AbstractUpgradeCatalog {
     }
   }
 
-  /**
-   * Populate the upgrade table with values for the columns upgrade_type and upgrade_package.
-   * The upgrade_type will default to {@code org.apache.ambari.server.state.stack.upgrade.UpgradeType.ROLLING}
-   * whereas the upgrade_package will be calculated.
-   * @return {@code} true on success, and {@code} false otherwise.
-   */
-  private boolean populateUpgradeTable() {
-    boolean success = true;
-    Statement statement = null;
-    ResultSet rs = null;
-    try {
-      statement = dbAccessor.getConnection().createStatement();
-      if (statement != null) {
-        // Need to use SQL since the schema is changing and some of the columns have not yet been added..
-        rs = statement.executeQuery("SELECT upgrade_id, cluster_id, from_version, to_version, direction, upgrade_package, upgrade_type FROM upgrade");
-        if (rs != null) {
-          try {
-            while (rs.next()) {
-              final long upgradeId = rs.getLong("upgrade_id");
-              final long clusterId = rs.getLong("cluster_id");
-              final String fromVersion = rs.getString("from_version");
-              final String toVersion = rs.getString("to_version");
-              final Direction direction = Direction.valueOf(rs.getString("direction"));
-              // These two values are likely null.
-              String upgradePackage = rs.getString("upgrade_package");
-              String upgradeType = rs.getString("upgrade_type");
-
-              LOG.info(MessageFormat.format("Populating rows for the upgrade table record with " +
-                  "upgrade_id: {0,number,#}, cluster_id: {1,number,#}, from_version: {2}, to_version: {3}, direction: {4}",
-                upgradeId, clusterId, fromVersion, toVersion, direction));
-
-              // Set all upgrades that have been done so far to type "rolling"
-              if (StringUtils.isEmpty(upgradeType)) {
-                LOG.info("Updating the record's upgrade_type to " + UpgradeType.ROLLING);
-                dbAccessor.executeQuery("UPDATE upgrade SET upgrade_type = '" + UpgradeType.ROLLING + "' WHERE upgrade_id = " + upgradeId);
-              }
-
-              if (StringUtils.isEmpty(upgradePackage)) {
-                String version = null;
-                StackEntity stack = null;
-
-                if (direction == Direction.UPGRADE) {
-                  version = toVersion;
-                } else if (direction == Direction.DOWNGRADE) {
-                  // TODO AMBARI-12698, this is going to be a problem.
-                  // During a downgrade, the "to_version" is overwritten to the source version, but the "from_version"
-                  // doesn't swap. E.g.,
-                  //  upgrade_id | from_version |  to_version  | direction
-                  // ------------+--------------+--------------+----------
-                  //           1 | 2.2.6.0-2800 | 2.3.0.0-2557 | UPGRADE
-                  //           2 | 2.2.6.0-2800 | 2.2.6.0-2800 | DOWNGRADE
-                  version = fromVersion;
-                }
-
-                ClusterEntity cluster = clusterDAO.findById(clusterId);
-
-                if (null != cluster) {
-                  stack = cluster.getDesiredStack();
-                  upgradePackage = calculateUpgradePackage(stack, version);
-                } else {
-                  LOG.error("Could not find a cluster with cluster_id " + clusterId);
-                }
-
-                if (!StringUtils.isEmpty(upgradePackage)) {
-                  LOG.info("Updating the record's upgrade_package to " + upgradePackage);
-                  dbAccessor.executeQuery("UPDATE upgrade SET upgrade_package = '" + upgradePackage + "' WHERE upgrade_id = " + upgradeId);
-                } else {
-                  success = false;
-                  LOG.error("Unable to populate column upgrade_package for record in table upgrade with id " + upgradeId);
-                }
-              }
-            }
-          } catch (Exception e) {
-            success = false;
-            e.printStackTrace();
-            LOG.error("Unable to populate the upgrade_type and upgrade_package columns of the upgrade table. " + e);
-          }
-        }
-      }
-    } catch (Exception e) {
-      success = false;
-      e.printStackTrace();
-      LOG.error("Failed to retrieve records from the upgrade table to populate the upgrade_type and upgrade_package columns. Exception: " + e);
-    } finally {
-      try {
-        if (rs != null) {
-          rs.close();
-        }
-        if (statement != null) {
-          statement.close();
-        }
-      } catch (SQLException e) {
-        ;
-      }
-    }
-    return success;
-  }
-
-  /**
-   * Find the single Repo Version for the given stack and version, and return
-   * its upgrade_package column. Because the upgrade_package column is going to
-   * be removed from this entity, must use raw SQL instead of the entity class.
-   * <p/>
-   * It's possible that there is an invalid version listed in the upgrade table.
-   * For example:
-   *
-   * <pre>
-   * upgrade
-   * 1 2 1295  2.2.0.0-2041  2.2.4.2-2     UPGRADE
-   * 2 2 1296  2.2.0.0-2041  2.2.0.0-2041  DOWNGRADE
-   * 3 2 1299  2.2.0.0-2041  2.2.4.2       UPGRADE
-   *
-   * repo_version
-   * 1  2.2.0.0-2041  HDP-2.2.0.0-2041  upgrade-2.2
-   * 2  2.2.4.2-2     HDP-2.2.4.2-2     upgrade-2.2
-   * </pre>
-   *
-   * Notice that it's possible for the {@code upgrade} table to include entries
-   * for a repo version which does not exist; {@code 2.2.4.2}. In these cases,
-   * this method will attempt a "best match".
-   *
-   * @param stack
-   *          Stack
-   * @param version
-   *          Stack version
-   * @return The value of the upgrade_package column, or null if not found.
-   */
-
-  private String calculateUpgradePackage(StackEntity stack, String version) {
-    String upgradePackage = null;
-    // Find the corresponding repo_version, and extract its upgrade_package
-    if (null != version && null != stack) {
-      RepositoryVersionEntity repoVersion = repositoryVersionDAO.findByStackNameAndVersion(stack.getStackName(), version);
-
-      // a null repoVersion means there's mismatch between the upgrade and repo_version table;
-      // use a best-guess approach based on the Stack
-      if( null == repoVersion ){
-        List<RepositoryVersionEntity> bestMatches = repositoryVersionDAO.findByStack(new StackId(stack));
-        if (!bestMatches.isEmpty()) {
-          repoVersion = bestMatches.get(0);
-        }
-      }
-
-      // our efforts have failed; we have no idea what to use; return null as per the contract of the method
-      if( null == repoVersion ) {
-        return null;
-      }
-
-      Statement statement = null;
-      ResultSet rs = null;
-      try {
-        statement = dbAccessor.getConnection().createStatement();
-        if (statement != null) {
-          // Need to use SQL since the schema is changing and the entity will no longer have the upgrade_package column.
-          rs = statement.executeQuery("SELECT upgrade_package FROM repo_version WHERE repo_version_id = " + repoVersion.getId());
-          if (rs != null && rs.next()) {
-            upgradePackage = rs.getString("upgrade_package");
-          }
-        }
-      } catch (Exception e) {
-        LOG.error("Failed to retrieve upgrade_package for repo_version record with id " + repoVersion.getId() + ". Exception: " + e.getMessage());
-      } finally {
-        try {
-          if (rs != null) {
-            rs.close();
-          }
-          if (statement != null) {
-            statement.close();
-          }
-        } catch (SQLException e) {
-          ;
-        }
-      }
-    }
-    return upgradePackage;
-  }
-
-  /**
+   /**
    * {@inheritDoc}
    */
   @Override

http://git-wip-us.apache.org/repos/asf/ambari/blob/651fe3d7/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java
index 6d2ab84..3c8686c 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog252.java
@@ -127,11 +127,12 @@ public class UpgradeCatalog252 extends AbstractUpgradeCatalog {
    * @throws SQLException
    */
   private void addRepositoryColumnsToUpgradeTable() throws SQLException {
-    dbAccessor.executeQuery(String.format("UPDATE %s SET %s = NULL", CLUSTERS_TABLE, UPGRADE_ID_COLUMN));
-    dbAccessor.executeQuery(String.format("DELETE FROM %s", SERVICE_COMPONENT_HISTORY_TABLE));
-    dbAccessor.executeQuery(String.format("DELETE FROM %s", UPGRADE_ITEM_TABLE));
-    dbAccessor.executeQuery(String.format("DELETE FROM %s", UPGRADE_GROUP_TABLE));
-    dbAccessor.executeQuery(String.format("DELETE FROM %s", UPGRADE_TABLE));
+    dbAccessor.clearTableColumn(CLUSTERS_TABLE, UPGRADE_ID_COLUMN, null);
+    dbAccessor.clearTable(SERVICE_COMPONENT_HISTORY_TABLE);
+    dbAccessor.clearTable(SERVICE_COMPONENT_HISTORY_TABLE);
+    dbAccessor.clearTable(UPGRADE_ITEM_TABLE);
+    dbAccessor.clearTable(UPGRADE_GROUP_TABLE);
+    dbAccessor.clearTable(UPGRADE_TABLE);
 
     dbAccessor.dropColumn(UPGRADE_TABLE, "to_version");
     dbAccessor.dropColumn(UPGRADE_TABLE, "from_version");