diff --git a/thresh/src/main/java/monasca/thresh/domain/service/AlarmDAO.java b/thresh/src/main/java/monasca/thresh/domain/service/AlarmDAO.java index ce844fd..b3c6b5c 100644 --- a/thresh/src/main/java/monasca/thresh/domain/service/AlarmDAO.java +++ b/thresh/src/main/java/monasca/thresh/domain/service/AlarmDAO.java @@ -48,4 +48,7 @@ public interface AlarmDAO { /** Update SubAlarms when AlarmDefinition changes */ int updateSubAlarmExpressions(final String alarmSubExpressionId, AlarmSubExpression alarmSubExpression); + + /** Deletes all alarms for the given AlarmDefinition */ + void deleteByDefinitionId(String alarmDefinitionId); } diff --git a/thresh/src/main/java/monasca/thresh/infrastructure/persistence/AlarmDAOImpl.java b/thresh/src/main/java/monasca/thresh/infrastructure/persistence/AlarmDAOImpl.java index 6ad36f5..c78d0f3 100644 --- a/thresh/src/main/java/monasca/thresh/infrastructure/persistence/AlarmDAOImpl.java +++ b/thresh/src/main/java/monasca/thresh/infrastructure/persistence/AlarmDAOImpl.java @@ -294,6 +294,13 @@ public class AlarmDAOImpl implements AlarmDAO { } } + @Override + public void deleteByDefinitionId(String alarmDefinitionId){ + try (Handle h = db.open()) { + h.execute("delete from alarm where alarm_definition_id = :id", alarmDefinitionId); + } + } + private MetricDefinition createMetricDefinitionFromRow(final Map row) { final Map dimensionMap = new HashMap<>(); final String dimensions = getString(row, "dimensions"); diff --git a/thresh/src/main/java/monasca/thresh/infrastructure/thresholding/AlarmCreationBolt.java b/thresh/src/main/java/monasca/thresh/infrastructure/thresholding/AlarmCreationBolt.java index 0bf1816..b570438 100644 --- a/thresh/src/main/java/monasca/thresh/infrastructure/thresholding/AlarmCreationBolt.java +++ b/thresh/src/main/java/monasca/thresh/infrastructure/thresholding/AlarmCreationBolt.java @@ -198,6 +198,7 @@ public class AlarmCreationBolt extends BaseRichBolt { } alarmCache.remove(alarmDefinitionId); alarmDefinitionCache.remove(alarmDefinitionId); + alarmDAO.deleteByDefinitionId(alarmDefinitionId); } protected void handleNewMetricDefinition( diff --git a/thresh/src/main/java/monasca/thresh/infrastructure/thresholding/AlarmThresholdingBolt.java b/thresh/src/main/java/monasca/thresh/infrastructure/thresholding/AlarmThresholdingBolt.java index 2948ae9..8730fe8 100644 --- a/thresh/src/main/java/monasca/thresh/infrastructure/thresholding/AlarmThresholdingBolt.java +++ b/thresh/src/main/java/monasca/thresh/infrastructure/thresholding/AlarmThresholdingBolt.java @@ -69,7 +69,7 @@ public class AlarmThresholdingBolt extends BaseRichBolt { private transient Logger logger; private DataSourceFactory dbConfig; private KafkaProducerConfiguration producerConfiguration; - final Map alarms = new HashMap(); + final Map alarms = new HashMap<>(); final Map alarmDefinitions = new HashMap<>(); private transient AlarmDAO alarmDAO; private transient AlarmDefinitionDAO alarmDefinitionDAO; @@ -217,8 +217,16 @@ public class AlarmThresholdingBolt extends BaseRichBolt { } private void changeAlarmState(Alarm alarm, AlarmState initialState, String stateChangeReason) { - alarmDAO.updateState(alarm.getId(), alarm.getState()); final AlarmDefinition alarmDefinition = alarmDefinitions.get(alarm.getAlarmDefinitionId()); + // If the Alarm Definition id does not exist, ignore updating this alarm + if (alarmDefinition == null) { + logger.warn("Failed to locate alarm definition for id {}," + + " ignoring state update to alarm with id {}", + alarm.getAlarmDefinitionId(), + alarm.getId()); + return; + } + alarmDAO.updateState(alarm.getId(), alarm.getState()); final List alarmedMetrics = new ArrayList<>(alarm.getAlarmedMetrics().size()); for (final MetricDefinitionAndTenantId mdtid : alarm.getAlarmedMetrics()) { alarmedMetrics.add(mdtid.metricDefinition); diff --git a/thresh/src/test/java/monasca/thresh/ThresholdingEngineAlarmTest.java b/thresh/src/test/java/monasca/thresh/ThresholdingEngineAlarmTest.java index 28d0b8b..4a84b23 100644 --- a/thresh/src/test/java/monasca/thresh/ThresholdingEngineAlarmTest.java +++ b/thresh/src/test/java/monasca/thresh/ThresholdingEngineAlarmTest.java @@ -445,5 +445,8 @@ public class ThresholdingEngineAlarmTest extends TopologyTestCase { } return false; } + + @Override + public void deleteByDefinitionId(String alarmDefinitionId) {} } }