AMBARI-21362. Ambari upgrade not idempotent due to column move
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/5c874ccb Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/5c874ccb Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/5c874ccb Branch: refs/heads/feature-branch-AMBARI-21307 Commit: 5c874ccb40b282e5074588906cb7de1f7eeae614 Parents: a3681c0 Author: Attila Doroszlai <adorosz...@hortonworks.com> Authored: Tue Jun 27 14:33:27 2017 +0200 Committer: Attila Doroszlai <adorosz...@hortonworks.com> Committed: Wed Jun 28 18:31:49 2017 +0200 ---------------------------------------------------------------------- .../ambari/server/orm/DBAccessorImpl.java | 5 +++- .../ambari/server/orm/DBAccessorImplTest.java | 29 ++++++++++++++++++++ 2 files changed, 33 insertions(+), 1 deletion(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/5c874ccb/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 13e7d7d..83ea8e1 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 @@ -1411,7 +1411,10 @@ public class DBAccessorImpl implements DBAccessor { public void moveColumnToAnotherTable(String sourceTableName, DBColumnInfo sourceColumn, String sourceIDFieldName, String targetTableName, DBColumnInfo targetColumn, String targetIDFieldName, Object initialValue) throws SQLException { - if (this.tableHasColumn(sourceTableName, sourceIDFieldName)) { + if (tableHasColumn(sourceTableName, sourceIDFieldName) && + tableHasColumn(sourceTableName, sourceColumn.getName()) && + tableHasColumn(targetTableName, targetIDFieldName) + ) { final String moveSQL = dbmsHelper.getCopyColumnToAnotherTableStatement(sourceTableName, sourceColumn.getName(), sourceIDFieldName, targetTableName, targetColumn.getName(),targetIDFieldName); http://git-wip-us.apache.org/repos/asf/ambari/blob/5c874ccb/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java b/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java index ca2674c..b4ffbf1 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/orm/DBAccessorImplTest.java @@ -638,4 +638,33 @@ public class DBAccessorImplTest { } } + + @Test + public void testMoveNonexistentColumnIsNoop() throws Exception { + DBAccessorImpl dbAccessor = injector.getInstance(DBAccessorImpl.class); + String sourceTableName = getFreeTableName(); + String targetTableName = getFreeTableName(); + int testRowAmount = 10; + + createMyTable(sourceTableName, "col1"); + createMyTable(targetTableName, "col1", "col2"); + + for (Integer i=0; i < testRowAmount; i++){ + dbAccessor.insertRow(sourceTableName, + new String[] {"id", "col1"}, + new String[]{i.toString(), String.format("'source,1,%s'", i)}, false); + + dbAccessor.insertRow(targetTableName, + new String[] {"id", "col1", "col2"}, + new String[]{i.toString(), String.format("'target,1,%s'", i), String.format("'target,2,%s'", i)}, false); + } + + DBColumnInfo sourceColumn = new DBColumnInfo("col2", String.class, null, null, false); + DBColumnInfo targetColumn = new DBColumnInfo("col2", String.class, null, null, false); + + dbAccessor.moveColumnToAnotherTable(sourceTableName, sourceColumn, "id", + targetTableName, targetColumn, "id", "initial"); + + // should not result in exception due to unknown column in source table + } }