You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by nc...@apache.org on 2017/02/03 14:53:51 UTC
[47/50] [abbrv] ambari git commit: AMBARI-19824. Add consistency
checker for blueprint tables (magyari_sandor)
AMBARI-19824. Add consistency checker for blueprint tables (magyari_sandor)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/4ad3a2b3
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/4ad3a2b3
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/4ad3a2b3
Branch: refs/heads/branch-dev-patch-upgrade
Commit: 4ad3a2b3611a38aeea3d64411feec8776a6af554
Parents: 779995d
Author: Sandor Magyari <sm...@hortonworks.com>
Authored: Thu Feb 2 00:11:15 2017 +0100
Committer: Sandor Magyari <sm...@hortonworks.com>
Committed: Fri Feb 3 13:47:01 2017 +0200
----------------------------------------------------------------------
.../checks/DatabaseConsistencyCheckHelper.java | 78 ++++++++++++++++++++
.../DatabaseConsistencyCheckHelperTest.java | 58 +++++++++++++++
2 files changed, 136 insertions(+)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ad3a2b3/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 ea5fa15..7aa8652 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
@@ -137,6 +137,7 @@ public class DatabaseConsistencyCheckHelper {
checkForHostsWithoutState();
checkHostComponentStates();
checkServiceConfigs();
+ checkTopologyTables();
LOG.info("******************************* Check database completed *******************************");
}
@@ -342,6 +343,83 @@ public class DatabaseConsistencyCheckHelper {
}
}
+
+ /**
+ * This method checks that for each row in topology_request there is at least one row in topology_logical_request,
+ * topology_host_request, topology_host_task, topology_logical_task.
+ * */
+ public static void checkTopologyTables() {
+ LOG.info("Checking Topology tables");
+
+ String SELECT_REQUEST_COUNT_QUERY = "select count(tpr.id) from topology_request tpr";
+
+ String SELECT_JOINED_COUNT_QUERY = "select count(DISTINCT tpr.id) from topology_request tpr join " +
+ "topology_logical_request tlr on tpr.id = tlr.request_id join topology_host_request thr on tlr.id = " +
+ "thr.logical_request_id join topology_host_task tht on thr.id = tht.host_request_id join topology_logical_task " +
+ "tlt on tht.id = tlt.host_task_id";
+
+ int topologyRequestCount = 0;
+ int topologyRequestTablesJoinedCount = 0;
+
+ ResultSet rs = null;
+ Statement statement = null;
+
+ if (connection == null) {
+ if (dbAccessor == null) {
+ dbAccessor = injector.getInstance(DBAccessor.class);
+ }
+ connection = dbAccessor.getConnection();
+ }
+
+ try {
+ statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
+
+ rs = statement.executeQuery(SELECT_REQUEST_COUNT_QUERY);
+ if (rs != null) {
+ while (rs.next()) {
+ topologyRequestCount = rs.getInt(1);
+ }
+ }
+
+ rs = statement.executeQuery(SELECT_JOINED_COUNT_QUERY);
+ if (rs != null) {
+ while (rs.next()) {
+ topologyRequestTablesJoinedCount = rs.getInt(1);
+ }
+ }
+
+ if (topologyRequestCount != topologyRequestTablesJoinedCount) {
+ LOG.error("Your topology request hierarchy is not complete for each row in topology_request should exist " +
+ "at least one raw in topology_logical_request, topology_host_request, topology_host_task, " +
+ "topology_logical_task.");
+ errorsFound = true;
+ }
+
+
+ } catch (SQLException e) {
+ LOG.error("Exception occurred during topology request tables check: ", 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 count of host component states equals count
* of desired host component states. According to ambari logic these
http://git-wip-us.apache.org/repos/asf/ambari/blob/4ad3a2b3/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 cf0854d..f73562d 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
@@ -172,6 +172,64 @@ public class DatabaseConsistencyCheckHelperTest {
}
@Test
+ public void testCheckTopologyTablesAreConsistent() throws Exception {
+ testCheckTopologyTablesConsistent(2);
+ Assert.assertTrue(!DatabaseConsistencyCheckHelper.ifErrorsFound());
+ }
+
+ @Test
+ public void testCheckTopologyTablesAreNotConsistent() throws Exception {
+ testCheckTopologyTablesConsistent(1);
+ Assert.assertTrue(DatabaseConsistencyCheckHelper.ifErrorsFound());
+ }
+
+ private void testCheckTopologyTablesConsistent(int resultCount) throws Exception {
+ EasyMockSupport easyMockSupport = new EasyMockSupport();
+
+ final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class);
+ final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class);
+ final ResultSet mockCountResultSet = easyMockSupport.createNiceMock(ResultSet.class);
+ final ResultSet mockJoinResultSet = 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(mockCountResultSet.next()).andReturn(true).once();
+ expect(mockCountResultSet.getInt(1)).andReturn(2);
+ expect(mockJoinResultSet.next()).andReturn(true).once();
+ expect(mockJoinResultSet.getInt(1)).andReturn(resultCount);
+ expect(mockStatement.executeQuery("select count(tpr.id) from topology_request tpr")).andReturn(mockCountResultSet);
+ expect(mockStatement.executeQuery("select count(DISTINCT tpr.id) from topology_request tpr join " +
+ "topology_logical_request tlr on tpr.id = tlr.request_id join topology_host_request thr on tlr.id = thr.logical_request_id join topology_host_task tht on thr.id = tht.host_request_id join topology_logical_task tlt on tht.id = tlt.host_task_id")).andReturn(mockJoinResultSet);
+
+ DatabaseConsistencyCheckHelper.setInjector(mockInjector);
+ DatabaseConsistencyCheckHelper.setConnection(mockConnection);
+
+ easyMockSupport.replayAll();
+
+
+ DatabaseConsistencyCheckHelper.checkTopologyTables();
+
+ easyMockSupport.verifyAll();
+
+ }
+
+ @Test
public void testCheckHostComponentStatesCountEqualsHostComponentsDesiredStates() throws Exception {
EasyMockSupport easyMockSupport = new EasyMockSupport();