Переглянути джерело

AMBARI-16094. Improvements to DB consistency check.(vbrodetskyi)

Vitaly Brodetskyi 9 роки тому
батько
коміт
cb8dca09c7

+ 9 - 2
ambari-server/conf/unix/log4j.properties

@@ -54,13 +54,20 @@ log4j.appender.alerts.layout=org.apache.log4j.PatternLayout
 log4j.appender.alerts.layout.ConversionPattern=%d{ISO8601} %m%n
 
 # Log database check process
-log4j.logger.org.apache.ambari.server.checks.CheckDatabaseHelper=INFO, dbcheck
-log4j.additivity.org.apache.ambari.server.checks.CheckDatabaseHelper=false
+log4j.logger.org.apache.ambari.server.checks.DatabaseConsistencyChecker=INFO, dbcheck
+log4j.additivity.org.apache.ambari.server.checks.DatabaseConsistencyChecker=false
 log4j.appender.dbcheck=org.apache.log4j.FileAppender
 log4j.appender.dbcheck.File=${ambari.log.dir}/${ambari.dbcheck.file}
 log4j.appender.dbcheck.layout=org.apache.log4j.PatternLayout
 log4j.appender.dbcheck.layout.ConversionPattern=%d{ISO8601} %5p - %m%n
 
+log4j.logger.org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper=INFO, dbcheckhelper
+log4j.additivity.org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper=false
+log4j.appender.dbcheckhelper=org.apache.log4j.FileAppender
+log4j.appender.dbcheckhelper.File=${ambari.log.dir}/${ambari.dbcheck.file}
+log4j.appender.dbcheckhelper.layout=org.apache.log4j.PatternLayout
+log4j.appender.dbcheckhelper.layout.ConversionPattern=%d{ISO8601} %5p - %m%n
+
 # EclipsLink -> slf4j bridge
 log4j.logger.eclipselink=TRACE,eclipselink
 log4j.additivity.eclipselink=false

+ 9 - 2
ambari-server/conf/windows/log4j.properties

@@ -79,13 +79,20 @@ log4j.appender.alerts.layout=org.apache.log4j.PatternLayout
 log4j.appender.alerts.layout.ConversionPattern=%d{ISO8601} %m%n
 
 # Log database check process
-log4j.logger.org.apache.ambari.server.checks.CheckDatabaseHelper=INFO, dbcheck
-log4j.additivity.org.apache.ambari.server.checks.CheckDatabaseHelper=false
+log4j.logger.org.apache.ambari.server.checks.DatabaseConsistencyChecker=INFO, dbcheck
+log4j.additivity.org.apache.ambari.server.checks.DatabaseConsistencyChecker=false
 log4j.appender.dbcheck=org.apache.log4j.FileAppender
 log4j.appender.dbcheck.File=${ambari.log.dir}/${ambari.dbcheck.file}
 log4j.appender.dbcheck.layout=org.apache.log4j.PatternLayout
 log4j.appender.dbcheck.layout.ConversionPattern=%d{ISO8601} %5p - %m%n
 
+log4j.logger.org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper=INFO, dbcheckhelper
+log4j.additivity.org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper=false
+log4j.appender.dbcheckhelper=org.apache.log4j.FileAppender
+log4j.appender.dbcheckhelper.File=${ambari.log.dir}/${ambari.dbcheck.file}
+log4j.appender.dbcheckhelper.layout=org.apache.log4j.PatternLayout
+log4j.appender.dbcheckhelper.layout.ConversionPattern=%d{ISO8601} %5p - %m%n
+
 # EclipsLink -> slf4j bridge
 log4j.logger.eclipselink=TRACE,eclipselink
 log4j.additivity.eclipselink=false

+ 9 - 2
ambari-server/src/main/conf/log4j.properties

@@ -79,13 +79,20 @@ log4j.appender.alerts.layout=org.apache.log4j.PatternLayout
 log4j.appender.alerts.layout.ConversionPattern=%d{ISO8601} %m%n
 
 # Log database check process
-log4j.logger.org.apache.ambari.server.checks.CheckDatabaseHelper=INFO, dbcheck
-log4j.additivity.org.apache.ambari.server.checks.CheckDatabaseHelper=false
+log4j.logger.org.apache.ambari.server.checks.DatabaseConsistencyChecker=INFO, dbcheck
+log4j.additivity.org.apache.ambari.server.checks.DatabaseConsistencyChecker=false
 log4j.appender.dbcheck=org.apache.log4j.FileAppender
 log4j.appender.dbcheck.File=${ambari.log.dir}/${ambari.dbcheck.file}
 log4j.appender.dbcheck.layout=org.apache.log4j.PatternLayout
 log4j.appender.dbcheck.layout.ConversionPattern=%d{ISO8601} %5p - %m%n
 
+log4j.logger.org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper=INFO, dbcheckhelper
+log4j.additivity.org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper=false
+log4j.appender.dbcheckhelper=org.apache.log4j.FileAppender
+log4j.appender.dbcheckhelper.File=${ambari.log.dir}/${ambari.dbcheck.file}
+log4j.appender.dbcheckhelper.layout=org.apache.log4j.PatternLayout
+log4j.appender.dbcheckhelper.layout.ConversionPattern=%d{ISO8601} %5p - %m%n
+
 # EclipsLink -> slf4j bridge
 log4j.logger.eclipselink=TRACE,eclipselink
 log4j.additivity.eclipselink=false

+ 134 - 133
ambari-server/src/main/java/org/apache/ambari/server/checks/CheckDatabaseHelper.java → ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelper.java

@@ -17,6 +17,8 @@
  */
 package org.apache.ambari.server.checks;
 
+import java.io.File;
+import java.io.IOException;
 import java.sql.Connection;
 import java.sql.ResultSet;
 import java.sql.SQLException;
@@ -25,135 +27,137 @@ import java.util.Collection;
 import java.util.HashMap;
 import java.util.HashSet;
 import java.util.Map;
+import java.util.Scanner;
 import java.util.Set;
 
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
-import org.apache.ambari.server.audit.AuditLoggerModule;
-import org.apache.ambari.server.controller.ControllerModule;
+import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.orm.DBAccessor;
+import org.apache.ambari.server.orm.dao.MetainfoDAO;
+import org.apache.ambari.server.orm.entities.MetainfoEntity;
 import org.apache.ambari.server.state.ServiceInfo;
-import org.apache.ambari.server.utils.EventBusSynchronizer;
+import org.apache.ambari.server.utils.VersionUtils;
 import org.apache.commons.lang.StringUtils;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
 import com.google.common.collect.HashMultimap;
 import com.google.common.collect.Multimap;
-import com.google.inject.Guice;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
-import com.google.inject.persist.PersistService;
 
-/*
-* Class for database validation.
-* Here we will check configs, services, components and etc.
-*/
-public class CheckDatabaseHelper {
-  private static final Logger LOG = LoggerFactory.getLogger
-          (CheckDatabaseHelper.class);
-
-  private static final String AUTHENTICATED_USER_NAME = "ambari-check-database";
-
-  private PersistService persistService;
-  private DBAccessor dbAccessor;
-  private Connection connection;
-  private AmbariMetaInfo ambariMetaInfo;
-  private Injector injector;
-  private boolean errorAvailable = false;
-  private boolean warningAvailable = false;
+public class DatabaseConsistencyCheckHelper {
+
+  static Logger LOG = LoggerFactory.getLogger(DatabaseConsistencyCheckHelper.class);
 
   @Inject
-  public CheckDatabaseHelper(DBAccessor dbAccessor,
-                             Injector injector,
-                             PersistService persistService) {
-    this.dbAccessor = dbAccessor;
-    this.injector = injector;
-    this.persistService = persistService;
-  }
+  private static Injector injector;
 
-  /**
-   * Extension of main controller module
-   */
-  public static class CheckHelperControllerModule extends ControllerModule {
+  private static MetainfoDAO metainfoDAO;
+  private static Connection connection;
+  private static AmbariMetaInfo ambariMetaInfo;
+  private static DBAccessor dbAccessor;
 
-    public CheckHelperControllerModule() throws Exception {
-    }
 
-    @Override
-    protected void configure() {
-      super.configure();
-      EventBusSynchronizer.synchronizeAmbariEventPublisher(binder());
-    }
+  private static boolean errorAvailable = false;
+  private static boolean warningAvailable = false;
+
+  public static boolean isErrorAvailable() {
+    return errorAvailable;
   }
 
-  /**
-   * Extension of audit logger module
-   */
-  public static class CheckHelperAuditModule extends AuditLoggerModule {
+  public static void setErrorAvailable(boolean errorAvailable) {
+    errorAvailable = errorAvailable;
+  }
 
-    public CheckHelperAuditModule() throws Exception {
-    }
+  public static boolean isWarningAvailable() {
+    return warningAvailable;
+  }
 
-    @Override
-    protected void configure() {
-      super.configure();
-    }
+  public static void setWarningAvailable(boolean warningAvailable) {
+    warningAvailable = warningAvailable;
+  }
 
+  public static void resetErrorWarningFlags() {
+    errorAvailable = false;
+    warningAvailable = false;
   }
 
-  /*
-  * init method to create connection
-  * */
-  protected void init() {
-    connection = dbAccessor.getConnection();
-    ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
+  protected static void setInjector(Injector injector) {
+    DatabaseConsistencyCheckHelper.injector = injector;
+  }
+
+  public static void setConnection(Connection connection) {
+    DatabaseConsistencyCheckHelper.connection = connection;
   }
 
   /*
-  * method to close connection
-  * */
-  private void closeConnection() {
+    * method to close connection
+    * */
+  public static void closeConnection() {
     try {
-      connection.close();
+      if (connection != null) {
+        connection.close();
+      }
     } catch (SQLException e) {
       LOG.error("Exception occurred during connection close procedure: ", e);
     }
   }
 
-  public void startPersistenceService() {
-    persistService.start();
-  }
+  public static void checkDBVersionCompatible() throws AmbariException {
+    LOG.info("Checking DB store version");
 
-  public void stopPersistenceService() {
-    persistService.stop();
-  }
+    if (metainfoDAO == null) {
+      metainfoDAO = injector.getInstance(MetainfoDAO.class);
+    }
 
-  protected boolean isErrorAvailable() {
-    return errorAvailable;
-  }
+    MetainfoEntity schemaVersionEntity = metainfoDAO.findByKey(Configuration.SERVER_VERSION_KEY);
+    String schemaVersion = null;
 
-  protected void setErrorAvailable(boolean errorAvailable) {
-    this.errorAvailable = errorAvailable;
-  }
+    if (schemaVersionEntity != null) {
+      schemaVersion = schemaVersionEntity.getMetainfoValue();
+    }
 
-  public boolean isWarningAvailable() {
-    return warningAvailable;
-  }
+    Configuration conf = injector.getInstance(Configuration.class);
+    File versionFile = new File(conf.getServerVersionFilePath());
+    if (!versionFile.exists()) {
+      throw new AmbariException("Server version file does not exist.");
+    }
+    String serverVersion = null;
+    try (Scanner scanner = new Scanner(versionFile)) {
+      serverVersion = scanner.useDelimiter("\\Z").next();
 
-  public void setWarningAvailable(boolean warningAvailable) {
-    this.warningAvailable = warningAvailable;
+    } catch (IOException ioe) {
+      throw new AmbariException("Unable to read server version file.");
+    }
+
+    if (schemaVersionEntity==null || VersionUtils.compareVersions(schemaVersion, serverVersion, 3) != 0) {
+      String error = "Current database store version is not compatible with " +
+              "current server version"
+              + ", serverVersion=" + serverVersion
+              + ", schemaVersion=" + schemaVersion;
+      LOG.error(error);
+      throw new AmbariException(error);
+    }
+
+    LOG.info("DB store version is compatible");
   }
 
-  /*
-    * This method checks if all configurations that we have in clusterconfig table
-    * have at least one mapping in clusterconfigmapping table. If we found not mapped config
-    * then we are showing warning message for user.
-    * */
-  protected void checkForNotMappedConfigsToCluster() {
+  public 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;
+
+    if (connection == null) {
+      if (dbAccessor == null) {
+        dbAccessor = injector.getInstance(DBAccessor.class);
+      }
+      connection = dbAccessor.getConnection();
+    }
+
     try {
       Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
       rs = statement.executeQuery(GET_NOT_MAPPED_CONFIGS_QUERY);
@@ -185,13 +189,23 @@ public class CheckDatabaseHelper {
   * 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.
   * */
-  protected void checkForConfigsSelectedMoreThanOnce() {
+  public 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";
     Multimap<String, String> clusterConfigTypeMap = HashMultimap.create();
     ResultSet rs = null;
+
+    if (connection == null) {
+      if (dbAccessor == null) {
+        dbAccessor = injector.getInstance(DBAccessor.class);
+      }
+      connection = dbAccessor.getConnection();
+    }
+
     try {
       Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
       rs = statement.executeQuery(GET_CONFIGS_SELECTED_MORE_THAN_ONCE_QUERY);
@@ -225,10 +239,20 @@ public class CheckDatabaseHelper {
   * has related host state info in hoststate table.
   * If not then we are showing error.
   * */
-  protected void checkForHostsWithoutState() {
+  public static void checkForHostsWithoutState() {
+    LOG.info("Checking for hosts without state");
+
     String GET_HOSTS_WITHOUT_STATUS_QUERY = "select host_name from hosts where host_id not in (select host_id from hoststate)";
     Set<String> hostsWithoutStatus = new HashSet<>();
     ResultSet rs = null;
+
+    if (connection == null) {
+      if (dbAccessor == null) {
+        dbAccessor = injector.getInstance(DBAccessor.class);
+      }
+      connection = dbAccessor.getConnection();
+    }
+
     try {
       Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
       rs = statement.executeQuery(GET_HOSTS_WITHOUT_STATUS_QUERY);
@@ -262,7 +286,9 @@ public class CheckDatabaseHelper {
   * two tables should have the same count of rows. If not then we are
   * showing error for user.
   * */
-  protected void checkHostComponentStatesCountEqualsHostComponentsDesiredStates() {
+  public static void checkHostComponentStatesCountEqualsHostComponentsDesiredStates() {
+    LOG.info("Checking host component states count equals host component desired states count");
+
     String GET_HOST_COMPONENT_STATE_COUNT_QUERY = "select count(*) from hostcomponentstate";
     String GET_HOST_COMPONENT_DESIRED_STATE_COUNT_QUERY = "select count(*) from hostcomponentdesiredstate";
     String GET_MERGED_TABLE_ROW_COUNT_QUERY = "select count(*) FROM hostcomponentstate hcs " +
@@ -271,6 +297,14 @@ public class CheckDatabaseHelper {
     int hostComponentDesiredStateCount = 0;
     int mergedCount = 0;
     ResultSet rs = null;
+
+    if (connection == null) {
+      if (dbAccessor == null) {
+        dbAccessor = injector.getInstance(DBAccessor.class);
+      }
+      connection = dbAccessor.getConnection();
+    }
+
     try {
       Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
 
@@ -323,7 +357,9 @@ public class CheckDatabaseHelper {
   * 4) Check if service has config which is not selected(has no actual config version) in clusterconfigmapping table.
   * If any issue was discovered, we are showing error message for user.
   * */
-  protected void checkServiceConfigs()  {
+  public static void checkServiceConfigs()  {
+    LOG.info("Checking services and their configs");
+
     String GET_SERVICES_WITHOUT_CONFIGS_QUERY = "select c.cluster_name, service_name from clusterservices cs " +
             "join clusters c on cs.cluster_id=c.cluster_id " +
             "where service_name not in (select service_name from serviceconfig sc where sc.cluster_id=cs.cluster_id and sc.service_name=cs.service_name and sc.group_id is null)";
@@ -354,6 +390,17 @@ public class CheckDatabaseHelper {
     Map<String, Multimap<String, String>> clusterServiceConfigType = new HashMap<>();
     ResultSet rs = null;
 
+    if (connection == null) {
+      if (dbAccessor == null) {
+        dbAccessor = injector.getInstance(DBAccessor.class);
+      }
+      connection = dbAccessor.getConnection();
+    }
+
+    if (ambariMetaInfo == null) {
+      ambariMetaInfo = injector.getInstance(AmbariMetaInfo.class);
+    }
+
     try {
       Statement statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE);
 
@@ -528,51 +575,5 @@ public class CheckDatabaseHelper {
 
   }
 
-  /*
-  * Main method from which we are calling all checks
-  * */
-  public static void main(String[] args) throws Exception {
-    CheckDatabaseHelper checkDatabaseHelper = null;
-    try {
-      LOG.info("******************************* Check database started *******************************");
-
-      Injector injector = Guice.createInjector(new CheckHelperControllerModule(), new CheckHelperAuditModule());
-      checkDatabaseHelper = injector.getInstance(CheckDatabaseHelper.class);
-
-      checkDatabaseHelper.startPersistenceService();
-
-      checkDatabaseHelper.init();
-
-      checkDatabaseHelper.checkForNotMappedConfigsToCluster();
-
-      checkDatabaseHelper.checkForConfigsSelectedMoreThanOnce();
 
-      checkDatabaseHelper.checkForHostsWithoutState();
-
-      checkDatabaseHelper.checkHostComponentStatesCountEqualsHostComponentsDesiredStates();
-
-      checkDatabaseHelper.checkServiceConfigs();
-
-      checkDatabaseHelper.stopPersistenceService();
-
-      LOG.info("******************************* Check database completed *******************************");
-    } catch (Throwable e) {
-      if (e instanceof AmbariException) {
-        LOG.error("Exception occurred during database check:", e);
-        throw (AmbariException)e;
-      }else{
-        LOG.error("Unexpected error, database check failed", e);
-        throw new Exception("Unexpected error, database check failed", e);
-      }
-    } finally {
-      if (checkDatabaseHelper != null) {
-        checkDatabaseHelper.closeConnection();
-        if (checkDatabaseHelper.isErrorAvailable() || checkDatabaseHelper.isWarningAvailable()) {
-          System.out.print("Some error(s) or/and warning(s) was(were) found. Please check ambari-server-check-database.log for problem(s).");
-        } else {
-          System.out.print("No erros were found.");
-        }
-      }
-    }
-  }
 }

+ 156 - 0
ambari-server/src/main/java/org/apache/ambari/server/checks/DatabaseConsistencyChecker.java

@@ -0,0 +1,156 @@
+/*
+ * Licensed to the Apache Software Foundation (ASF) under one
+ * or more contributor license agreements.  See the NOTICE file
+ * distributed with this work for additional information
+ * regarding copyright ownership.  The ASF licenses this file
+ * to you under the Apache License, Version 2.0 (the
+ * "License"); you may not use this file except in compliance
+ * with the License.  You may obtain a copy of the License at
+ *
+ *     http://www.apache.org/licenses/LICENSE-2.0
+ *
+ * Unless required by applicable law or agreed to in writing, software
+ * distributed under the License is distributed on an "AS IS" BASIS,
+ * WITHOUT WARRANTIES OR CONDITIONS OF ANY KIND, either express or implied.
+ * See the License for the specific language governing permissions and
+ * limitations under the License.
+ */
+package org.apache.ambari.server.checks;
+
+import java.util.Enumeration;
+
+import org.apache.ambari.server.AmbariException;
+import org.apache.ambari.server.audit.AuditLoggerModule;
+import org.apache.ambari.server.controller.ControllerModule;
+import org.apache.ambari.server.orm.DBAccessor;
+import org.apache.ambari.server.utils.EventBusSynchronizer;
+import org.apache.log4j.FileAppender;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
+import org.slf4j.impl.Log4jLoggerAdapter;
+
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+import com.google.inject.persist.PersistService;
+
+public class DatabaseConsistencyChecker {
+  private static final Logger LOG = LoggerFactory.getLogger
+          (DatabaseConsistencyChecker.class);
+
+
+  private PersistService persistService;
+  private DBAccessor dbAccessor;
+  private Injector injector;
+
+
+  @Inject
+  public DatabaseConsistencyChecker(DBAccessor dbAccessor,
+                             Injector injector,
+                             PersistService persistService) {
+    this.dbAccessor = dbAccessor;
+    this.injector = injector;
+    this.persistService = persistService;
+  }
+
+  /**
+   * Extension of main controller module
+   */
+  public static class CheckHelperControllerModule extends ControllerModule {
+
+    public CheckHelperControllerModule() throws Exception {
+    }
+
+    @Override
+    protected void configure() {
+      super.configure();
+      EventBusSynchronizer.synchronizeAmbariEventPublisher(binder());
+    }
+  }
+
+  /**
+   * Extension of audit logger module
+   */
+  public static class CheckHelperAuditModule extends AuditLoggerModule {
+
+    public CheckHelperAuditModule() throws Exception {
+    }
+
+    @Override
+    protected void configure() {
+      super.configure();
+    }
+
+  }
+
+  public void startPersistenceService() {
+    persistService.start();
+  }
+
+  public void stopPersistenceService() {
+    persistService.stop();
+  }
+
+  /*
+  * Main method from which we are calling all checks
+  * */
+  public static void main(String[] args) throws Exception {
+    DatabaseConsistencyChecker databaseConsistencyChecker = null;
+    try {
+      LOG.info("******************************* Check database started *******************************");
+
+      Injector injector = Guice.createInjector(new CheckHelperControllerModule(), new CheckHelperAuditModule());
+      databaseConsistencyChecker = injector.getInstance(DatabaseConsistencyChecker.class);
+
+      databaseConsistencyChecker.startPersistenceService();
+
+      DatabaseConsistencyCheckHelper.checkForNotMappedConfigsToCluster();
+
+      DatabaseConsistencyCheckHelper.checkForConfigsSelectedMoreThanOnce();
+
+      DatabaseConsistencyCheckHelper.checkForHostsWithoutState();
+
+      DatabaseConsistencyCheckHelper.checkHostComponentStatesCountEqualsHostComponentsDesiredStates();
+
+      DatabaseConsistencyCheckHelper.checkServiceConfigs();
+
+      databaseConsistencyChecker.stopPersistenceService();
+
+      LOG.info("******************************* Check database completed *******************************");
+    } catch (Throwable e) {
+      if (e instanceof AmbariException) {
+        LOG.error("Exception occurred during database check:", e);
+        throw (AmbariException)e;
+      }else{
+        LOG.error("Unexpected error, database check failed", e);
+        throw new Exception("Unexpected error, database check failed", e);
+      }
+    } finally {
+        DatabaseConsistencyCheckHelper.closeConnection();
+        if (DatabaseConsistencyCheckHelper.isErrorAvailable()) {
+          String ambariDBConsistencyCheckLog = "ambari-server-check-database.log";
+          if (LOG instanceof Log4jLoggerAdapter) {
+            org.apache.log4j.Logger dbConsistencyCheckHelperLogger = org.apache.log4j.Logger.getLogger(DatabaseConsistencyCheckHelper.class);
+            Enumeration appenders = dbConsistencyCheckHelperLogger.getAllAppenders();
+            while (appenders.hasMoreElements()) {
+              Object appender = appenders.nextElement();
+              if (appender instanceof FileAppender) {
+                ambariDBConsistencyCheckLog = ((FileAppender) appender).getFile();
+                break;
+              }
+            }
+          }
+          ambariDBConsistencyCheckLog = ambariDBConsistencyCheckLog.replace("//", "/");
+          System.out.print(String.format("DB configs consistency check failed. Run \"ambari-server start --skip-database-check\" to skip. " +
+                  "If you use this \"--skip-database-check\" option, do not make any changes to your cluster topology " +
+                  "or perform a cluster upgrade until you correct the database consistency issues. See \"%s\" " +
+                  "for more details on the consistency issues.", ambariDBConsistencyCheckLog));
+        } else {
+          System.out.print("No errors were found.");
+        }
+
+    }
+  }
+
+
+}

+ 5 - 10
ambari-server/src/main/java/org/apache/ambari/server/controller/AmbariServer.java

@@ -19,6 +19,9 @@
 package org.apache.ambari.server.controller;
 
 
+import javax.crypto.BadPaddingException;
+import javax.servlet.DispatcherType;
+
 import java.io.File;
 import java.io.IOException;
 import java.net.Authenticator;
@@ -31,9 +34,6 @@ import java.util.HashMap;
 import java.util.Map;
 import java.util.logging.LogManager;
 
-import javax.crypto.BadPaddingException;
-import javax.servlet.DispatcherType;
-
 import org.apache.ambari.eventdb.webservice.WorkflowJsonService;
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.StateRecoveryManager;
@@ -58,6 +58,7 @@ import org.apache.ambari.server.audit.AuditLogger;
 import org.apache.ambari.server.audit.AuditLoggerModule;
 import org.apache.ambari.server.audit.request.RequestAuditLogger;
 import org.apache.ambari.server.bootstrap.BootStrapImpl;
+import org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper;
 import org.apache.ambari.server.configuration.ComponentSSLConfiguration;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.controller.internal.AbstractControllerResourceProvider;
@@ -75,7 +76,6 @@ import org.apache.ambari.server.controller.internal.StackDependencyResourceProvi
 import org.apache.ambari.server.controller.internal.UserPrivilegeResourceProvider;
 import org.apache.ambari.server.controller.internal.ViewPermissionResourceProvider;
 import org.apache.ambari.server.controller.metrics.ThreadPoolEnabledPropertyProvider;
-import org.apache.ambari.server.controller.utilities.DatabaseChecker;
 import org.apache.ambari.server.controller.utilities.KerberosChecker;
 import org.apache.ambari.server.orm.GuiceJpaInitializer;
 import org.apache.ambari.server.orm.PersistenceType;
@@ -295,11 +295,6 @@ public class AmbariServer {
 
     setSystemProperties(configs);
 
-    if (System.getProperty("skipDatabaseConsistencyValidation") == null) {
-      DatabaseChecker.checkDBConsistency();
-      DatabaseChecker.checkDBConfigsConsistency();
-    }
-
     try {
       ClassPathXmlApplicationContext parentSpringAppContext =
           new ClassPathXmlApplicationContext();
@@ -957,7 +952,7 @@ public class AmbariServer {
       setupProxyAuth();
 
       injector.getInstance(GuiceJpaInitializer.class);
-      DatabaseChecker.checkDBVersion();
+      DatabaseConsistencyCheckHelper.checkDBVersionCompatible();
       server = injector.getInstance(AmbariServer.class);
       CertificateManager certMan = injector.getInstance(CertificateManager.class);
       certMan.initRootCert();

+ 2 - 2
ambari-server/src/main/java/org/apache/ambari/server/controller/ControllerModule.java

@@ -55,6 +55,7 @@ import org.apache.ambari.server.actionmanager.RequestFactory;
 import org.apache.ambari.server.actionmanager.StageFactory;
 import org.apache.ambari.server.actionmanager.StageFactoryImpl;
 import org.apache.ambari.server.checks.AbstractCheckDescriptor;
+import org.apache.ambari.server.checks.DatabaseConsistencyCheckHelper;
 import org.apache.ambari.server.checks.UpgradeCheckRegistry;
 import org.apache.ambari.server.configuration.Configuration;
 import org.apache.ambari.server.configuration.Configuration.ConnectionPoolType;
@@ -72,7 +73,6 @@ import org.apache.ambari.server.controller.internal.UpgradeResourceProvider;
 import org.apache.ambari.server.controller.metrics.timeline.cache.TimelineMetricCacheEntryFactory;
 import org.apache.ambari.server.controller.metrics.timeline.cache.TimelineMetricCacheProvider;
 import org.apache.ambari.server.controller.spi.ResourceProvider;
-import org.apache.ambari.server.controller.utilities.DatabaseChecker;
 import org.apache.ambari.server.controller.utilities.KerberosChecker;
 import org.apache.ambari.server.notifications.DispatchFactory;
 import org.apache.ambari.server.notifications.NotificationDispatcher;
@@ -367,7 +367,7 @@ public class ControllerModule extends AbstractModule {
 
     bind(AuthenticationEntryPoint.class).to(AmbariEntryPoint.class).in(Scopes.SINGLETON);
 
-    requestStaticInjection(DatabaseChecker.class);
+    requestStaticInjection(DatabaseConsistencyCheckHelper.class);
     requestStaticInjection(KerberosChecker.class);
     requestStaticInjection(AuthorizationHelper.class);
 

+ 3 - 0
ambari-server/src/main/java/org/apache/ambari/server/controller/utilities/DatabaseChecker.java

@@ -54,6 +54,9 @@ import org.slf4j.LoggerFactory;
 import com.google.inject.Inject;
 import com.google.inject.Injector;
 
+
+/*This class should not be used anymore
+* now we will use DatabaseConsistencyChecker*/
 public class DatabaseChecker {
 
   static Logger LOG = LoggerFactory.getLogger(DatabaseChecker.class);

+ 2 - 2
ambari-server/src/main/python/ambari-server.py

@@ -330,7 +330,7 @@ def init_parser_options(parser):
   parser.add_option('--jdbc-driver', default=None, dest="jdbc_driver",
                     help="Specifies the path to the JDBC driver JAR file")
   parser.add_option('--skip-properties-validation', action="store_true", default=False, help="Skip properties file validation", dest="skip_properties_validation")
-  parser.add_option('--skip-database-validation', action="store_true", default=False, help="Skip database consistency validation", dest="skip_database_validation")
+  parser.add_option('--skip-database-check', action="store_true", default=False, help="Skip database consistency check", dest="skip_database_check")
   parser.add_option('--mpack', default=None,
                     help="Specified the path for management pack to be installed/upgraded",
                     dest="mpack_path")
@@ -404,7 +404,7 @@ def init_parser_options(parser):
   parser.add_option('--cluster-name', default=None, help="Cluster name", dest="cluster_name")
   parser.add_option('--version-display-name', default=None, help="Display name of desired repo version", dest="desired_repo_version")
   parser.add_option('--skip-properties-validation', action="store_true", default=False, help="Skip properties file validation", dest="skip_properties_validation")
-  parser.add_option('--skip-database-validation', action="store_true", default=False, help="Skip database consistency validation", dest="skip_database_validation")
+  parser.add_option('--skip-database-check', action="store_true", default=False, help="Skip database consistency check", dest="skip_database_check")
   parser.add_option('--force-version', action="store_true", default=False, help="Force version to current", dest="force_repo_version")
   parser.add_option('--version', dest="stack_versions", default=None, action="append", type="string",
                     help="Specify stack version that needs to be enabled. All other stacks versions will be disabled")

+ 11 - 4
ambari-server/src/main/python/ambari_server/checkDatabase.py

@@ -39,7 +39,7 @@ from ambari_server.serverUtils import is_server_runing
 from ambari_server.userInput import get_YN_input
 
 CHECK_DATABASE_HELPER_CMD = "{0} -cp {1} " + \
-                         "org.apache.ambari.server.checks.CheckDatabaseHelper"
+                         "org.apache.ambari.server.checks.DatabaseConsistencyChecker"
 
 def check_database(options):
 
@@ -74,13 +74,20 @@ def check_database(options):
   environ = setupSecurity.generate_env(options, ambari_user, current_user)
 
   (retcode, stdout, stderr) = os_utils.run_os_command(command, env=environ)
-  print_info_msg("Return code from check database command, retcode = " + str(retcode))
+
 
   if retcode > 0:
-    print_error_msg("Database check failed to complete. Please check ambari-server.log and ambari-server-check-database.log for problem.")
-    raise FatalException(1, 'Database check failed.')
+    print str(stdout)
+    raise FatalException(1, 'Database check failed to complete. Please check ' + configDefaults.SERVER_LOG_FILE +
+                            ' and ' + configDefaults.DB_CHECK_LOG + ' for more information.')
   else:
     print str(stdout)
+    if not stdout.startswith("No errors"):
+      print "Ambari Server 'check-database' completed"
+      sys.exit(1)
+
+
+
 
 
 

+ 1 - 0
ambari-server/src/main/python/ambari_server/serverConfiguration.py

@@ -333,6 +333,7 @@ class ServerConfigDefaults(object):
     self.OUT_DIR = parse_log4j_file(get_conf_dir() + "/log4j.properties")['ambari.log.dir'].replace("//", "/")
     self.SERVER_OUT_FILE = os.path.join(self.OUT_DIR, "ambari-server.out")
     self.SERVER_LOG_FILE = os.path.join(self.OUT_DIR, "ambari-server.log")
+    self.DB_CHECK_LOG = os.path.join(self.OUT_DIR, "ambari-server-check-database.log")
     self.ROOT_FS_PATH = os.sep
 
     self.JDK_INSTALL_DIR = ""

+ 28 - 7
ambari-server/src/main/python/ambari_server_main.py

@@ -26,7 +26,7 @@ from ambari_commons.logging_utils import get_debug_mode, print_warning_msg, prin
   set_debug_mode_from_options
 from ambari_commons.os_check import OSConst
 from ambari_commons.os_family_impl import OsFamilyFuncImpl, OsFamilyImpl
-from ambari_commons.os_utils import is_root
+from ambari_commons.os_utils import is_root, run_os_command
 from ambari_server.dbConfiguration import ensure_dbms_is_running, ensure_jdbc_driver_is_installed
 from ambari_server.serverConfiguration import configDefaults, find_jdk, get_ambari_properties, \
   get_conf_dir, get_is_persisted, get_is_secure, get_java_exe_path, get_original_master_key, read_ambari_user, \
@@ -56,6 +56,7 @@ if ambari_provider_module is not None:
 jvm_args = os.getenv('AMBARI_JVM_ARGS', '-Xms512m -Xmx2048m -XX:MaxPermSize=128m')
 
 ENV_FOREGROUND_KEY = "AMBARI_SERVER_RUN_IN_FOREGROUND"
+CHECK_DATABASE_HELPER_CMD = "{0} -cp {1} org.apache.ambari.server.checks.DatabaseConsistencyChecker"
 IS_FOREGROUND = ENV_FOREGROUND_KEY in os.environ and os.environ[ENV_FOREGROUND_KEY].lower() == "true"
 
 SERVER_START_CMD = "{0} " \
@@ -283,14 +284,34 @@ def server_process_main(options, scmStatus=None):
   suspend_start = (debug_mode & 2) or SUSPEND_START_MODE
   suspend_mode = 'y' if suspend_start else 'n'
 
-  if options.skip_database_validation:
+  environ = generate_env(options, ambari_user, current_user)
+  class_path = serverClassPath.get_full_ambari_classpath_escaped_for_shell(validate_classpath=True)
+
+  if options.skip_database_check:
     global jvm_args
-    jvm_args += " -DskipDatabaseConsistencyValidation"
+    jvm_args += " -DskipDatabaseConsistencyCheck"
+    print "Ambari Server is starting with the database consistency check skipped. Do not make any changes to your cluster " \
+          "topology or perform a cluster upgrade until you correct the database consistency issues. See \"" \
+          + configDefaults.DB_CHECK_LOG + "\" for more details on the consistency issues."
+  else:
+    print "Ambari database consistency check started..."
+    command = CHECK_DATABASE_HELPER_CMD.format(java_exe, class_path)
+
+    (retcode, stdout, stderr) = run_os_command(command, env=environ)
+
+    if retcode > 0:
+      print str(stdout)
+      raise FatalException(1, 'Database check failed to complete. Please check ' + configDefaults.SERVER_LOG_FILE +
+                            ' and ' + configDefaults.DB_CHECK_LOG + ' for more information.')
+    else:
+      print str(stdout)
+      print "Ambari database consistency check finished"
+
+      if not stdout.startswith("No errors"):
+        sys.exit(1)
+
+  param_list = generate_child_process_param_list(ambari_user, java_exe, class_path, debug_start, suspend_mode)
 
-  param_list = generate_child_process_param_list(ambari_user, java_exe,
-                                                 serverClassPath.get_full_ambari_classpath_escaped_for_shell(validate_classpath=True),
-                                                 debug_start, suspend_mode)
-  environ = generate_env(options, ambari_user, current_user)
 
   if not os.path.exists(configDefaults.PID_DIR):
     os.makedirs(configDefaults.PID_DIR, 0755)

+ 33 - 38
ambari-server/src/test/java/org/apache/ambari/server/checks/CheckDatabaseHelperTest.java → ambari-server/src/test/java/org/apache/ambari/server/checks/DatabaseConsistencyCheckHelperTest.java

@@ -40,12 +40,12 @@ import com.google.inject.AbstractModule;
 import com.google.inject.Guice;
 import com.google.inject.Injector;
 
-public class CheckDatabaseHelperTest {
+public class DatabaseConsistencyCheckHelperTest {
 
   @Test
   public void testCheckForNotMappedConfigs() throws Exception {
     EasyMockSupport easyMockSupport = new EasyMockSupport();
-    final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
+
     final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class);
     final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class);
     final ResultSet mockResultSet = easyMockSupport.createNiceMock(ResultSet.class);
@@ -58,7 +58,7 @@ public class CheckDatabaseHelperTest {
     final Injector mockInjector = Guice.createInjector(new AbstractModule() {
       @Override
       protected void configure() {
-        bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo);
+
         bind(StackManagerFactory.class).toInstance(mockStackManagerFactory);
         bind(EntityManager.class).toInstance(mockEntityManager);
         bind(DBAccessor.class).toInstance(mockDBDbAccessor);
@@ -68,18 +68,16 @@ public class CheckDatabaseHelperTest {
     });
 
 
-    expect(mockDBDbAccessor.getConnection()).andReturn(mockConnection);
+
     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);
 
-    CheckDatabaseHelper checkDatabaseHelper = new CheckDatabaseHelper(mockDBDbAccessor, mockInjector, null);
-
+    DatabaseConsistencyCheckHelper.setInjector(mockInjector);
+    DatabaseConsistencyCheckHelper.setConnection(mockConnection);
 
     easyMockSupport.replayAll();
 
-    mockAmbariMetainfo.init();
-    checkDatabaseHelper.init();
-    checkDatabaseHelper.checkForNotMappedConfigsToCluster();
+    DatabaseConsistencyCheckHelper.checkForNotMappedConfigsToCluster();
 
     easyMockSupport.verifyAll();
   }
@@ -87,7 +85,7 @@ public class CheckDatabaseHelperTest {
   @Test
   public void testCheckForConfigsSelectedMoreThanOnce() throws Exception {
     EasyMockSupport easyMockSupport = new EasyMockSupport();
-    final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
+
     final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class);
     final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class);
     final ResultSet mockResultSet = easyMockSupport.createNiceMock(ResultSet.class);
@@ -100,7 +98,7 @@ public class CheckDatabaseHelperTest {
     final Injector mockInjector = Guice.createInjector(new AbstractModule() {
       @Override
       protected void configure() {
-        bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo);
+
         bind(StackManagerFactory.class).toInstance(mockStackManagerFactory);
         bind(EntityManager.class).toInstance(mockEntityManager);
         bind(DBAccessor.class).toInstance(mockDBDbAccessor);
@@ -109,22 +107,21 @@ public class CheckDatabaseHelperTest {
       }
     });
 
-
-    expect(mockDBDbAccessor.getConnection()).andReturn(mockConnection);
     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);
 
-    CheckDatabaseHelper checkDatabaseHelper = new CheckDatabaseHelper(mockDBDbAccessor, mockInjector, null);
+
+
+    DatabaseConsistencyCheckHelper.setInjector(mockInjector);
+    DatabaseConsistencyCheckHelper.setConnection(mockConnection);
 
 
     easyMockSupport.replayAll();
 
-    mockAmbariMetainfo.init();
-    checkDatabaseHelper.init();
-    checkDatabaseHelper.checkForConfigsSelectedMoreThanOnce();
+    DatabaseConsistencyCheckHelper.checkForConfigsSelectedMoreThanOnce();
 
     easyMockSupport.verifyAll();
   }
@@ -132,7 +129,7 @@ public class CheckDatabaseHelperTest {
   @Test
   public void testCheckForHostsWithoutState() throws Exception {
     EasyMockSupport easyMockSupport = new EasyMockSupport();
-    final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
+
     final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class);
     final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class);
     final ResultSet mockResultSet = easyMockSupport.createNiceMock(ResultSet.class);
@@ -145,7 +142,7 @@ public class CheckDatabaseHelperTest {
     final Injector mockInjector = Guice.createInjector(new AbstractModule() {
       @Override
       protected void configure() {
-        bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo);
+
         bind(StackManagerFactory.class).toInstance(mockStackManagerFactory);
         bind(EntityManager.class).toInstance(mockEntityManager);
         bind(DBAccessor.class).toInstance(mockDBDbAccessor);
@@ -155,18 +152,18 @@ public class CheckDatabaseHelperTest {
     });
 
 
-    expect(mockDBDbAccessor.getConnection()).andReturn(mockConnection);
+
     expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement);
     expect(mockStatement.executeQuery("select host_name from hosts where host_id not in (select host_id from hoststate)")).andReturn(mockResultSet);
 
-    CheckDatabaseHelper checkDatabaseHelper = new CheckDatabaseHelper(mockDBDbAccessor, mockInjector, null);
-
+    DatabaseConsistencyCheckHelper.setInjector(mockInjector);
+    DatabaseConsistencyCheckHelper.setConnection(mockConnection);
 
     easyMockSupport.replayAll();
 
-    mockAmbariMetainfo.init();
-    checkDatabaseHelper.init();
-    checkDatabaseHelper.checkForHostsWithoutState();
+
+
+    DatabaseConsistencyCheckHelper.checkForHostsWithoutState();
 
     easyMockSupport.verifyAll();
   }
@@ -174,7 +171,7 @@ public class CheckDatabaseHelperTest {
   @Test
   public void testCheckHostComponentStatesCountEqualsHostComponentsDesiredStates() throws Exception {
     EasyMockSupport easyMockSupport = new EasyMockSupport();
-    final AmbariMetaInfo mockAmbariMetainfo = easyMockSupport.createNiceMock(AmbariMetaInfo.class);
+
     final DBAccessor mockDBDbAccessor = easyMockSupport.createNiceMock(DBAccessor.class);
     final Connection mockConnection = easyMockSupport.createNiceMock(Connection.class);
     final ResultSet mockResultSet = easyMockSupport.createNiceMock(ResultSet.class);
@@ -187,7 +184,7 @@ public class CheckDatabaseHelperTest {
     final Injector mockInjector = Guice.createInjector(new AbstractModule() {
       @Override
       protected void configure() {
-        bind(AmbariMetaInfo.class).toInstance(mockAmbariMetainfo);
+
         bind(StackManagerFactory.class).toInstance(mockStackManagerFactory);
         bind(EntityManager.class).toInstance(mockEntityManager);
         bind(DBAccessor.class).toInstance(mockDBDbAccessor);
@@ -197,7 +194,7 @@ public class CheckDatabaseHelperTest {
     });
 
 
-    expect(mockDBDbAccessor.getConnection()).andReturn(mockConnection);
+
     expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement);
     expect(mockStatement.executeQuery("select count(*) from hostcomponentstate")).andReturn(mockResultSet);
     expect(mockStatement.executeQuery("select count(*) from hostcomponentdesiredstate")).andReturn(mockResultSet);
@@ -205,14 +202,13 @@ public class CheckDatabaseHelperTest {
             "JOIN hostcomponentdesiredstate hcds ON hcs.service_name=hcds.service_name AND " +
             "hcs.component_name=hcds.component_name AND hcs.host_id=hcds.host_id")).andReturn(mockResultSet);
 
-    CheckDatabaseHelper checkDatabaseHelper = new CheckDatabaseHelper(mockDBDbAccessor, mockInjector, null);
-
+    DatabaseConsistencyCheckHelper.setInjector(mockInjector);
+    DatabaseConsistencyCheckHelper.setConnection(mockConnection);
 
     easyMockSupport.replayAll();
 
-    mockAmbariMetainfo.init();
-    checkDatabaseHelper.init();
-    checkDatabaseHelper.checkHostComponentStatesCountEqualsHostComponentsDesiredStates();
+
+    DatabaseConsistencyCheckHelper.checkHostComponentStatesCountEqualsHostComponentsDesiredStates();
 
     easyMockSupport.verifyAll();
   }
@@ -259,7 +255,6 @@ public class CheckDatabaseHelperTest {
     expect(stackResultSet.next()).andReturn(true);
     expect(stackResultSet.getString("stack_name")).andReturn("HDP");
     expect(stackResultSet.getString("stack_version")).andReturn("2.2");
-    expect(mockDBDbAccessor.getConnection()).andReturn(mockConnection);
     expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE, ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement);
     expect(mockStatement.executeQuery("select c.cluster_name, service_name from clusterservices cs " +
             "join clusters c on cs.cluster_id=c.cluster_id " +
@@ -286,14 +281,14 @@ public class CheckDatabaseHelperTest {
             "group by c.cluster_name, cs.service_name, cc.type_name " +
             "having sum(ccm.selected) < 1")).andReturn(mockResultSet);
 
-    CheckDatabaseHelper checkDatabaseHelper = new CheckDatabaseHelper(mockDBDbAccessor, mockInjector, null);
-
+    DatabaseConsistencyCheckHelper.setInjector(mockInjector);
+    DatabaseConsistencyCheckHelper.setConnection(mockConnection);
 
     easyMockSupport.replayAll();
 
     mockAmbariMetainfo.init();
-    checkDatabaseHelper.init();
-    checkDatabaseHelper.checkServiceConfigs();
+
+    DatabaseConsistencyCheckHelper.checkServiceConfigs();
 
     easyMockSupport.verifyAll();
   }

+ 13 - 7
ambari-server/src/test/java/org/apache/ambari/server/controller/utilities/DatabaseCheckerTest.java

@@ -18,9 +18,11 @@
 
 package org.apache.ambari.server.controller.utilities;
 
-import com.google.inject.Guice;
-import com.google.inject.Inject;
-import com.google.inject.Injector;
+import static org.easymock.EasyMock.createMock;
+import static org.easymock.EasyMock.expect;
+import static org.easymock.EasyMock.replay;
+import static org.junit.Assert.fail;
+
 import org.apache.ambari.server.AmbariException;
 import org.apache.ambari.server.api.services.AmbariMetaInfo;
 import org.apache.ambari.server.configuration.Configuration;
@@ -31,12 +33,14 @@ import org.apache.ambari.server.orm.entities.MetainfoEntity;
 import org.junit.After;
 import org.junit.Before;
 import org.junit.BeforeClass;
+import org.junit.Ignore;
 import org.junit.Test;
 
-import static org.easymock.EasyMock.createMock;
-import static org.easymock.EasyMock.expect;
-import static org.easymock.EasyMock.replay;
-import static org.junit.Assert.fail;
+import com.google.inject.Guice;
+import com.google.inject.Inject;
+import com.google.inject.Injector;
+
+/*Ignore this test because DatabaseChecker is not used anymore and it will be removed soon*/
 
 public class DatabaseCheckerTest {
   private static Injector injector;
@@ -59,6 +63,7 @@ public class DatabaseCheckerTest {
   public void teardown() throws AmbariException {
   }
 
+  @Ignore
   @Test
   public void testCheckDBVersion_Valid() throws Exception {
     MetainfoDAO metainfoDAO =  createMock(MetainfoDAO.class);
@@ -78,6 +83,7 @@ public class DatabaseCheckerTest {
     }
   }
 
+  @Ignore
   @Test(expected = AmbariException.class)
   public void testCheckDBVersionInvalid() throws Exception {
     MetainfoDAO metainfoDAO =  createMock(MetainfoDAO.class);

+ 3 - 2
ambari-server/src/test/python/TestAmbariServer.py

@@ -6938,7 +6938,8 @@ class TestAmbariServer(TestCase):
   @patch("ambari_server.serverConfiguration.parse_properties_file")
   @patch("ambari_server.serverConfiguration.get_ambari_properties")
   @patch("ambari_server.serverConfiguration.get_java_exe_path")
-  def test_check_database(self, getJavaExePathMock,
+  @patch("sys.exit")
+  def test_check_database(self, exitMock, getJavaExePathMock,
                              getAmbariPropertiesMock, parsePropertiesFileMock, ensureDriverInstalledMock, readAmbariUserMock,
                              ensureCanStartUnderCurrentUserMock, generateEnvMock, runOSCommandMock, isServerRunningMock):
     properties = Properties()
@@ -6959,7 +6960,7 @@ class TestAmbariServer(TestCase):
     self.assertTrue(ensureCanStartUnderCurrentUserMock.called)
     self.assertTrue(generateEnvMock.called)
 
-    self.assertEquals(runOSCommandMock.call_args[0][0], '/path/to/java -cp test:path12 org.apache.ambari.server.checks.CheckDatabaseHelper')
+    self.assertEquals(runOSCommandMock.call_args[0][0], '/path/to/java -cp test:path12 org.apache.ambari.server.checks.DatabaseConsistencyChecker')
 
     pass