Просмотр исходного кода

AMBARI-16964. Upgrade Catalog 2.4 is not idempotent (aonishuk)

Andrew Onishuk 9 лет назад
Родитель
Сommit
1964559486

+ 8 - 0
ambari-server/src/main/java/org/apache/ambari/server/upgrade/UpgradeCatalog240.java

@@ -2329,6 +2329,14 @@ public class UpgradeCatalog240 extends AbstractUpgradeCatalog {
    */
   @Transactional
   private void updateViewInstanceTable() throws SQLException {
+    try {
+      if (Long.class.equals(dbAccessor.getColumnClass(VIEWINSTANCE_TABLE, CLUSTER_HANDLE_COLUMN))) {
+        LOG.info(String.format("%s column is already numeric. Skipping an update of %s table.", CLUSTER_HANDLE_COLUMN, VIEWINSTANCE_TABLE));
+        return;
+      }
+    } catch (ClassNotFoundException e) {
+      LOG.warn("Cannot determine a type of " + CLUSTER_HANDLE_COLUMN + " column.");
+    }
 
     String cluster_handle_dummy = "cluster_handle_dummy";
 

+ 2 - 1
ambari-server/src/test/java/org/apache/ambari/server/upgrade/UpgradeCatalog240Test.java

@@ -148,7 +148,7 @@ public class UpgradeCatalog240Test {
   }
 
   @Test
-  public void testExecuteDDLUpdates() throws SQLException, AmbariException {
+  public void testExecuteDDLUpdates() throws SQLException, AmbariException, ClassNotFoundException {
     Capture<DBAccessor.DBColumnInfo> capturedSortOrderColumnInfo = newCapture();
     Capture<DBAccessor.DBColumnInfo> capturedPermissionIDColumnInfo = newCapture();
     Capture<DBAccessor.DBColumnInfo> capturedScColumnInfo = newCapture();
@@ -275,6 +275,7 @@ public class UpgradeCatalog240Test {
     expect(connection.createStatement()).andReturn(statement);
 
     // Test viewInstance update
+    expect(dbAccessor.getColumnClass(UpgradeCatalog240.VIEWINSTANCE_TABLE, UpgradeCatalog240.CLUSTER_HANDLE_COLUMN)).andReturn(String.class);
     dbAccessor.addColumn(eq(UpgradeCatalog240.VIEWINSTANCE_TABLE), anyObject(DBAccessor.DBColumnInfo.class));
 
     expect(dbAccessor.getConnection()).andReturn(connection);