Repository: ambari Updated Branches: refs/heads/branch-2.6 63989a2d6 -> 43432ae30
AMBARI-21843. Database consistency check fails after upgrade to ambari 2.6.0.(vbrodetskyi) Project: http://git-wip-us.apache.org/repos/asf/ambari/repo Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/43432ae3 Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/43432ae3 Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/43432ae3 Branch: refs/heads/branch-2.6 Commit: 43432ae30355765fbf982553d7360aa00d7534e1 Parents: 63989a2 Author: Vitaly Brodetskyi <vbrodets...@hortonworks.com> Authored: Wed Aug 30 01:23:31 2017 +0300 Committer: Vitaly Brodetskyi <vbrodets...@hortonworks.com> Committed: Wed Aug 30 01:23:31 2017 +0300 ---------------------------------------------------------------------- .../checks/DatabaseConsistencyCheckHelper.java | 87 +++++--------------- .../DatabaseConsistencyCheckHelperTest.java | 56 ++----------- 2 files changed, 29 insertions(+), 114 deletions(-) ---------------------------------------------------------------------- http://git-wip-us.apache.org/repos/asf/ambari/blob/43432ae3/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java index aa96875..f5a7203 100644 --- a/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java +++ b/ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java @@ -187,7 +187,6 @@ public class DatabaseConsistencyCheckHelper { checkSchemaName(); checkMySQLEngine(); checkForConfigsNotMappedToService(); - checkForNotMappedConfigsToCluster(); checkForConfigsSelectedMoreThanOnce(); checkForHostsWithoutState(); checkHostComponentStatesCountEqualsHostComponentsDesiredStates(); @@ -244,49 +243,6 @@ public class DatabaseConsistencyCheckHelper { LOG.info("DB store version is compatible"); } - static void checkForNotMappedConfigsToCluster() { - LOG.info("Checking for configs not mapped to any cluster"); - - String GET_NOT_MAPPED_CONFIGS_QUERY = "select type_name from clusterconfig where type_name not in (select type_name from clusterconfigmapping)"; - Set<String> nonSelectedConfigs = new HashSet<>(); - ResultSet rs = null; - Statement statement = null; - - ensureConnection(); - - try { - statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE); - rs = statement.executeQuery(GET_NOT_MAPPED_CONFIGS_QUERY); - if (rs != null) { - while (rs.next()) { - nonSelectedConfigs.add(rs.getString("type_name")); - } - } - if (!nonSelectedConfigs.isEmpty()) { - warning("You have config(s): {} that is(are) not mapped (in clusterconfigmapping table) to any cluster!", - nonSelectedConfigs); - } - } catch (SQLException e) { - LOG.error("Exception occurred during check for not mapped configs to cluster procedure: ", e); - } finally { - if (rs != null) { - try { - rs.close(); - } catch (SQLException e) { - LOG.error("Exception occurred during result set closing procedure: ", e); - } - } - - if (statement != null) { - try { - statement.close(); - } catch (SQLException e) { - LOG.error("Exception occurred during statement closing procedure: ", e); - } - } - } - } - /** * This method checks if ambari database has tables with too big size (according to limit). * First of all we are trying to get table size from schema information, but if it's not possible, @@ -373,7 +329,7 @@ public class DatabaseConsistencyCheckHelper { throw new SQLException(); } } catch (SQLException ex) { - LOG.error(String.format("Failed to get %s row count: ", tableName), e); + error(String.format("Failed to get %s row count: ", tableName), e); } } finally { if (rs != null) { @@ -397,7 +353,7 @@ public class DatabaseConsistencyCheckHelper { } /** - * This method checks if any config type in clusterconfigmapping table, has + * This method checks if any config type in clusterconfig table, has * more than one versions selected. If config version is selected(in selected column = 1), * it means that this version of config is actual. So, if any config type has more * than one selected version it's a bug and we are showing error message for user. @@ -405,10 +361,10 @@ public class DatabaseConsistencyCheckHelper { static void checkForConfigsSelectedMoreThanOnce() { LOG.info("Checking for configs selected more than once"); - String GET_CONFIGS_SELECTED_MORE_THAN_ONCE_QUERY = "select c.cluster_name, ccm.type_name from clusterconfigmapping ccm " + - "join clusters c on ccm.cluster_id=c.cluster_id " + - "group by c.cluster_name, ccm.type_name " + - "having sum(selected) > 1"; + String GET_CONFIGS_SELECTED_MORE_THAN_ONCE_QUERY = "select c.cluster_name, cc.type_name from clusterconfig cc " + + "join clusters c on cc.cluster_id=c.cluster_id " + + "group by c.cluster_name, cc.type_name " + + "having sum(cc.selected) > 1"; Multimap<String, String> clusterConfigTypeMap = HashMultimap.create(); ResultSet rs = null; Statement statement = null; @@ -424,13 +380,13 @@ public class DatabaseConsistencyCheckHelper { } for (String clusterName : clusterConfigTypeMap.keySet()) { - error("You have config(s), in cluster {}, that is(are) selected more than once in clusterconfigmapping table: {}", + error("You have config(s), in cluster {}, that is(are) selected more than once in clusterconfig table: {}", clusterName ,StringUtils.join(clusterConfigTypeMap.get(clusterName), ",")); } } } catch (SQLException e) { - LOG.error("Exception occurred during check for config selected more than ones procedure: ", e); + error("Exception occurred during check for config selected more than once procedure: ", e); } finally { if (rs != null) { try { @@ -479,7 +435,7 @@ public class DatabaseConsistencyCheckHelper { } } catch (SQLException e) { - LOG.error("Exception occurred during check for host without state procedure: ", e); + error("Exception occurred during check for host without state procedure: ", e); } finally { if (rs != null) { try { @@ -547,7 +503,7 @@ public class DatabaseConsistencyCheckHelper { } } catch (SQLException e) { - LOG.error("Exception occurred during topology request tables check: ", e); + error("Exception occurred during topology request tables check: ", e); } finally { if (statement != null) { try { @@ -573,7 +529,7 @@ public class DatabaseConsistencyCheckHelper { } } catch (SQLException e) { - LOG.error("Exception occurred during topology request tables check: ", e); + error("Exception occurred during topology request tables check: ", e); } finally { if (rs != null) { try { @@ -636,7 +592,7 @@ public class DatabaseConsistencyCheckHelper { error("Your host component states (hostcomponentstate table) count not equals host component desired states (hostcomponentdesiredstate table) count!"); } } catch (SQLException e) { - LOG.error("Exception occurred during check for same count of host component states and host component desired states: ", e); + error("Exception occurred during check for same count of host component states and host component desired states: ", e); } finally { if (rs != null) { try { @@ -867,7 +823,7 @@ public class DatabaseConsistencyCheckHelper { } } } catch (SQLException e) { - LOG.error("Exception occurred during checking MySQL engine to be innodb: ", e); + error("Exception occurred during checking MySQL engine to be innodb: ", e); } finally { if (rs != null) { try { @@ -884,7 +840,7 @@ public class DatabaseConsistencyCheckHelper { * 1) Check if we have services in cluster which doesn't have service config id(not available in serviceconfig table). * 2) Check if service has no mapped configs to it's service config id. * 3) Check if service has all required configs mapped to it. - * 4) Check if service has config which is not selected(has no actual config version) in clusterconfigmapping table. + * 4) Check if service has config which is not selected(has no actual config version) in clusterconfig table. * If any issue was discovered, we are showing error message for user. * */ static void checkServiceConfigs() { @@ -909,11 +865,10 @@ public class DatabaseConsistencyCheckHelper { "join serviceconfig sc on cs.service_name=sc.service_name and cs.cluster_id=sc.cluster_id " + "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " + "join clusterconfig cc on scm.config_id=cc.config_id and cc.cluster_id=sc.cluster_id " + - "join clusterconfigmapping ccm on cc.type_name=ccm.type_name and cc.version_tag=ccm.version_tag and cc.cluster_id=ccm.cluster_id " + - "join clusters c on ccm.cluster_id=c.cluster_id " + + "join clusters c on cc.cluster_id=c.cluster_id " + "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_name=sc.service_name and sc2.cluster_id=sc.cluster_id) " + "group by c.cluster_name, cs.service_name, cc.type_name " + - "having sum(ccm.selected) < 1"; + "having sum(cc.selected) < 1"; Multimap<String, String> clusterServiceMap = HashMultimap.create(); Map<String, Map<String, String>> clusterStackInfo = new HashMap<>(); Map<String, Multimap<String, String>> clusterServiceVersionMap = new HashMap<>(); @@ -1086,8 +1041,8 @@ public class DatabaseConsistencyCheckHelper { } } - //getting services which has mapped configs which are not selected in clusterconfigmapping - LOG.info("Getting services which has mapped configs which are not selected in clusterconfigmapping"); + //getting services which has mapped configs which are not selected in clusterconfig + LOG.info("Getting services which has mapped configs which are not selected in clusterconfig"); rs = statement.executeQuery(GET_NOT_SELECTED_SERVICE_CONFIGS_QUERY); if (rs != null) { String serviceName = null, configType = null, clusterName = null; @@ -1118,9 +1073,9 @@ public class DatabaseConsistencyCheckHelper { } } } catch (SQLException e) { - LOG.error("Exception occurred during complex service check procedure: ", e); + error("Exception occurred during complex service check procedure: ", e); } catch (AmbariException e) { - LOG.error("Exception occurred during complex service check procedure: ", e); + error("Exception occurred during complex service check procedure: ", e); } finally { if (rs != null) { try { @@ -1236,7 +1191,7 @@ public class DatabaseConsistencyCheckHelper { } } - if (warnIfFound) { + if (warnIfFound && !configGroupMap.isEmpty()) { output.replace(output.lastIndexOf(","), output.length(), "]"); warning("You have config groups present in the database with no " + "corresponding service found, {}. Run --auto-fix-database to fix " + http://git-wip-us.apache.org/repos/asf/ambari/blob/43432ae3/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java ---------------------------------------------------------------------- diff --git a/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java b/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java index 5ce03a3..6c6c00f 100644 --- a/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java +++ b/ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java @@ -64,45 +64,7 @@ import com.google.inject.Injector; public class DatabaseConsistencyCheckHelperTest { - @Test - public void testCheckForNotMappedConfigs() throws Exception { - EasyMockSupport easyMockSupport = new EasyMockSupport(); - - final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class); - final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class); - final ResultSet mockResultSet = easyMockSupport.createNiceMock(ResultSet.class); - final Statement mockStatement = easyMockSupport.createNiceMock(Statement.class); - - final StackManagerFactory mockStackManagerFactory = easyMockSupport.createNiceMock(StackManagerFactory.class); - final EntityManager mockEntityManager = easyMockSupport.createNiceMock(EntityManager.class); - final Clusters mockClusters = easyMockSupport.createNiceMock(Clusters.class); - final OsFamily mockOSFamily = easyMockSupport.createNiceMock(OsFamily.class); - final Injector mockInjector = Guice.createInjector(new AbstractModule() { - @Override - protected void configure() { - bind(StackManagerFactory.class).toInstance(mockStackManagerFactory); - bind(EntityManager.class).toInstance(mockEntityManager); - bind(DBAccessor.class).toInstance(mockDBDbAccessor); - bind(Clusters.class).toInstance(mockClusters); - bind(OsFamily.class).toInstance(mockOSFamily); - } - }); - - - - expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement); - expect(mockStatement.executeQuery("select type_name from clusterconfig where type_name not in (select type_name from clusterconfigmapping)")).andReturn(mockResultSet); - - DatabaseConsistencyCheckHelper.setInjector(mockInjector); - DatabaseConsistencyCheckHelper.setConnection(mockConnection); - - easyMockSupport.replayAll(); - - DatabaseConsistencyCheckHelper.checkForNotMappedConfigsToCluster(); - - easyMockSupport.verifyAll(); - } @Test public void testCheckForConfigsSelectedMoreThanOnce() throws Exception { @@ -130,10 +92,10 @@ public class DatabaseConsistencyCheckHelperTest { }); expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement); - expect(mockStatement.executeQuery("select c.cluster_name, ccm.type_name from clusterconfigmapping ccm " + - "join clusters c on ccm.cluster_id=c.cluster_id " + - "group by c.cluster_name, ccm.type_name " + - "having sum(selected) > 1")).andReturn(mockResultSet); + expect(mockStatement.executeQuery("select c.cluster_name, cc.type_name from clusterconfig cc " + + "join clusters c on cc.cluster_id=c.cluster_id " + + "group by c.cluster_name, cc.type_name " + + "having sum(cc.selected) > 1")).andReturn(mockResultSet); @@ -360,11 +322,10 @@ public class DatabaseConsistencyCheckHelperTest { "join serviceconfig sc on cs.service_name=sc.service_name and cs.cluster_id=sc.cluster_id " + "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " + "join clusterconfig cc on scm.config_id=cc.config_id and cc.cluster_id=sc.cluster_id " + - "join clusterconfigmapping ccm on cc.type_name=ccm.type_name and cc.version_tag=ccm.version_tag and cc.cluster_id=ccm.cluster_id " + - "join clusters c on ccm.cluster_id=c.cluster_id " + + "join clusters c on cc.cluster_id=c.cluster_id " + "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_name=sc.service_name and sc2.cluster_id=sc.cluster_id) " + "group by c.cluster_name, cs.service_name, cc.type_name " + - "having sum(ccm.selected) < 1")).andReturn(mockResultSet); + "having sum(cc.selected) < 1")).andReturn(mockResultSet); DatabaseConsistencyCheckHelper.setInjector(mockInjector); DatabaseConsistencyCheckHelper.setConnection(mockConnection); @@ -561,11 +522,10 @@ public class DatabaseConsistencyCheckHelperTest { "join serviceconfig sc on cs.service_name=sc.service_name and cs.cluster_id=sc.cluster_id " + "join serviceconfigmapping scm on sc.service_config_id=scm.service_config_id " + "join clusterconfig cc on scm.config_id=cc.config_id and cc.cluster_id=sc.cluster_id " + - "join clusterconfigmapping ccm on cc.type_name=ccm.type_name and cc.version_tag=ccm.version_tag and cc.cluster_id=ccm.cluster_id " + - "join clusters c on ccm.cluster_id=c.cluster_id " + + "join clusters c on cc.cluster_id=c.cluster_id " + "where sc.group_id is null and sc.service_config_id = (select max(service_config_id) from serviceconfig sc2 where sc2.service_name=sc.service_name and sc2.cluster_id=sc.cluster_id) " + "group by c.cluster_name, cs.service_name, cc.type_name " + - "having sum(ccm.selected) < 1")).andReturn(mockResultSet); + "having sum(cc.selected) < 1")).andReturn(mockResultSet); DatabaseConsistencyCheckHelper.setInjector(mockInjector); DatabaseConsistencyCheckHelper.setConnection(mockConnection);