This is an automated email from the ASF dual-hosted git repository.
swagle pushed a commit to branch trunk
in repository https://gitbox.apache.org/repos/asf/ambari.git
The following commit(s) were added to refs/heads/trunk by this push:
new 604c82e [AMBARI-23057] Upgrade fails because of Stale alert
definitions (ap… (#2884)
604c82e is described below
commit 604c82e3cd49e71643a870dd9ca77576cc2268c9
Author: amarnathreddy pappu <[email protected]>
AuthorDate: Wed Apr 3 10:51:08 2019 -0700
[AMBARI-23057] Upgrade fails because of Stale alert definitions (ap… (#2884)
---
.../checks/DatabaseConsistencyCheckHelper.java | 105 ++++++++++++++++++++-
.../checks/DatabaseConsistencyCheckHelperTest.java | 49 ++++++++++
2 files changed, 153 insertions(+), 1 deletion(-)
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 7f52b66..3d8b4e9 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
@@ -48,6 +48,7 @@ import org.apache.ambari.server.AmbariException;
import org.apache.ambari.server.api.services.AmbariMetaInfo;
import org.apache.ambari.server.configuration.Configuration;
import org.apache.ambari.server.orm.DBAccessor;
+import org.apache.ambari.server.orm.dao.AlertDefinitionDAO;
import org.apache.ambari.server.orm.dao.ClusterDAO;
import org.apache.ambari.server.orm.dao.ExecutionCommandDAO;
import org.apache.ambari.server.orm.dao.HostComponentDesiredStateDAO;
@@ -55,6 +56,7 @@ import org.apache.ambari.server.orm.dao.HostComponentStateDAO;
import org.apache.ambari.server.orm.dao.HostRoleCommandDAO;
import org.apache.ambari.server.orm.dao.MetainfoDAO;
import org.apache.ambari.server.orm.dao.StageDAO;
+import org.apache.ambari.server.orm.entities.AlertDefinitionEntity;
import org.apache.ambari.server.orm.entities.ClusterConfigEntity;
import org.apache.ambari.server.orm.entities.HostComponentDesiredStateEntity;
import org.apache.ambari.server.orm.entities.HostComponentStateEntity;
@@ -91,6 +93,7 @@ public class DatabaseConsistencyCheckHelper {
private static Injector injector;
private static MetainfoDAO metainfoDAO;
+ private static AlertDefinitionDAO alertDefinitionDAO;
private static Connection connection;
private static AmbariMetaInfo ambariMetaInfo;
private static DBAccessor dbAccessor;
@@ -158,6 +161,7 @@ public class DatabaseConsistencyCheckHelper {
closeConnection();
connection = null;
metainfoDAO = null;
+ alertDefinitionDAO = null;
ambariMetaInfo = null;
dbAccessor = null;
}
@@ -189,6 +193,7 @@ public class DatabaseConsistencyCheckHelper {
fixConfigGroupHostMappings();
fixConfigGroupsForDeletedServices();
fixConfigsSelectedMoreThanOnce();
+ fixAlertsForDeletedServices();
}
checkSchemaName();
checkMySQLEngine();
@@ -201,6 +206,7 @@ public class DatabaseConsistencyCheckHelper {
checkConfigGroupsHasServiceName();
checkConfigGroupHostMapping(true);
checkConfigGroupsForDeletedServices(true);
+ checkForStalealertdefs();
LOG.info("******************************* Check database completed
*******************************");
return checkResult;
}
@@ -216,7 +222,9 @@ public class DatabaseConsistencyCheckHelper {
if (metainfoDAO == null) {
metainfoDAO = injector.getInstance(MetainfoDAO.class);
}
-
+ if (alertDefinitionDAO == null) {
+ alertDefinitionDAO = injector.getInstance(AlertDefinitionDAO.class);
+ }
MetainfoEntity schemaVersionEntity =
metainfoDAO.findByKey(Configuration.SERVER_VERSION_KEY);
String schemaVersion = null;
@@ -807,6 +815,52 @@ public class DatabaseConsistencyCheckHelper {
}
/**
+ * This method checks for stale alert definitions..
+ * */
+ static Map<String, String> checkForStalealertdefs () {
+ Configuration conf = injector.getInstance(Configuration.class);
+ Map<String, String> alertInfo = new HashMap<>();
+ LOG.info("Checking to ensure there is no stale alert definitions");
+
+ ensureConnection();
+
+ String STALE_ALERT_DEFINITIONS = "select definition_name, service_name
from alert_definition where service_name not in " +
+ "(select service_name from clusterservices) and service_name not
in ('AMBARI')";
+
+ ResultSet rs = null;
+ Statement statement;
+
+ try {
+ statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
+ rs = statement.executeQuery(STALE_ALERT_DEFINITIONS);
+ if (rs != null) {
+ while (rs.next()) {
+
alertInfo.put(rs.getString("definition_name"),rs.getString("service_name"));
+ }
+ if (!alertInfo.isEmpty()){
+ String alertInfoStr = "";
+ for (Map.Entry<String, String> entry : alertInfo.entrySet()) {
+ alertInfoStr = entry.getKey() + "(" + entry.getValue() + ")" ;
+ }
+ warning("You have Alerts that are not mapped with any services :
{}.Run --auto-fix-database to fix " +
+ "this automatically. Please backup Ambari Server database
before running --auto-fix-database.", alertInfoStr);
+ }
+ }
+ } catch (SQLException e) {
+ warning("Exception occurred during checking for stale alert definitions:
", e);
+ } finally {
+ if (rs != null) {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ LOG.error("Exception occurred during checking for stale alert
definitions: ", e);
+ }
+ }
+ }
+ return alertInfo;
+ }
+
+ /**
* Fix inconsistencies found by {@code checkForConfigsSelectedMoreThanOnce}
* selecting latest one by selectedTimestamp
*/
@@ -1350,6 +1404,55 @@ public class DatabaseConsistencyCheckHelper {
}
}
+ @Transactional
+ static void fixAlertsForDeletedServices() {
+
+ Configuration conf = injector.getInstance(Configuration.class);
+
+ LOG.info("fixAlertsForDeletedServices stale alert definitions for deleted
services");
+
+ ensureConnection();
+
+ String SELECT_STALE_ALERT_DEFINITIONS = "select definition_id from
alert_definition where service_name not in " +
+ "(select service_name from clusterservices) and service_name not
in ('AMBARI')";
+
+ int recordsCount = 0;
+ Statement statement = null;
+ ResultSet rs = null;
+ List<Integer> alertIds = new ArrayList<Integer>();
+ try {
+ statement = connection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE);
+ rs = statement.executeQuery(SELECT_STALE_ALERT_DEFINITIONS);
+ while (rs.next()) {
+ alertIds.add(rs.getInt("definition_id"));
+ }
+
+ } catch (SQLException e) {
+ warning("Exception occurred during fixing stale alert definitions: ", e);
+ } finally {
+ if (statement != null) {
+ try {
+ statement.close();
+ } catch (SQLException e) {
+ LOG.error("Exception occurred during fixing stale alert definitions:
", e);
+ }
+ }
+ if (rs != null) {
+ try {
+ rs.close();
+ } catch (SQLException e) {
+ LOG.error("Exception occurred during fixing stale alert definitions:
", e);
+ }
+ }
+ }
+
+ for(Integer alertId : alertIds) {
+ final AlertDefinitionEntity entity =
alertDefinitionDAO.findById(alertId.intValue());
+ alertDefinitionDAO.remove(entity);
+ }
+ warning("fixAlertsForDeletedServices - {} Stale alerts were deleted",
alertIds.size());
+
+ }
/**
* Fix inconsistencies found by @checkConfigGroupHostMapping
*/
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 bddff1a..aa89e4d 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
@@ -66,6 +66,7 @@ import org.apache.ambari.server.state.Service;
import org.apache.ambari.server.state.ServiceFactory;
import org.apache.ambari.server.state.ServiceInfo;
import org.apache.ambari.server.state.StackId;
+import org.apache.ambari.server.state.alert.AlertDefinition;
import org.apache.ambari.server.state.configgroup.ConfigGroup;
import org.apache.ambari.server.state.stack.OsFamily;
import org.apache.ambari.server.testutils.PartialNiceMockBinder;
@@ -689,6 +690,54 @@ public class DatabaseConsistencyCheckHelperTest {
}
@Test
+ public void testCheckForStalealertdefs() throws Exception {
+ EasyMockSupport easyMockSupport = new EasyMockSupport();
+ final AlertDefinition alertDefinition =
easyMockSupport.createNiceMock(AlertDefinition.class);
+ final DBAccessor mockDBDbAccessor =
easyMockSupport.createNiceMock(DBAccessor.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(AlertDefinition.class).toInstance(alertDefinition);
+ 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);
+ }
+ });
+ final ResultSet staleAlertResultSet =
easyMockSupport.createNiceMock(ResultSet.class);
+ expect(staleAlertResultSet.next()).andReturn(true).once();
+
expect(staleAlertResultSet.getString("definition_name")).andReturn("ALERT-NAME").atLeastOnce();
+
expect(staleAlertResultSet.getString("service_name")).andReturn("SERVICE-DELETED").atLeastOnce();
+ final Connection mockConnection =
easyMockSupport.createNiceMock(Connection.class);
+ final Statement mockStatement =
easyMockSupport.createNiceMock(Statement.class);
+
+ expect(mockDBDbAccessor.getConnection()).andReturn(mockConnection);
+ expect(mockDBDbAccessor.getDbType()).andReturn(DBAccessor.DbType.MYSQL);
+ expect(mockDBDbAccessor.getDbSchema()).andReturn("test_schema");
+
+ expect(mockConnection.createStatement(ResultSet.TYPE_SCROLL_SENSITIVE,
ResultSet.CONCUR_UPDATABLE)).andReturn(mockStatement).anyTimes();
+ expect(mockStatement.executeQuery("select definition_name, service_name
from alert_definition where service_name not in " +
+ "(select service_name from clusterservices) and service_name not
in ('AMBARI')")).andReturn(staleAlertResultSet);
+
+ expect(alertDefinition.getDefinitionId()).andReturn(1L);
+ expect(alertDefinition.getName()).andReturn("AlertTest");
+
+ DatabaseConsistencyCheckHelper.setInjector(mockInjector);
+
+ easyMockSupport.replayAll();
+
+ Map<String, String> stalealertdefs1 =
DatabaseConsistencyCheckHelper.checkForStalealertdefs();
+
+ Assert.assertEquals(1, stalealertdefs1.size());
+ }
+
+ @Test
public void testCollectConfigGroupsWithoutServiceName() throws Exception {
EasyMockSupport easyMockSupport = new EasyMockSupport();