Clean up orphaned alarms on alarm definition delete

Change-Id: I8dea800768989b80f1fe810f1c9572ed439d0133
This commit is contained in:
Ryan Brandt 2015-04-30 12:02:00 -06:00
parent 1f0888d6fa
commit c6f025016d
5 changed files with 24 additions and 2 deletions

View File

@ -48,4 +48,7 @@ public interface AlarmDAO {
/** Update SubAlarms when AlarmDefinition changes */ /** Update SubAlarms when AlarmDefinition changes */
int updateSubAlarmExpressions(final String alarmSubExpressionId, AlarmSubExpression alarmSubExpression); int updateSubAlarmExpressions(final String alarmSubExpressionId, AlarmSubExpression alarmSubExpression);
/** Deletes all alarms for the given AlarmDefinition */
void deleteByDefinitionId(String alarmDefinitionId);
} }

View File

@ -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<String, Object> row) { private MetricDefinition createMetricDefinitionFromRow(final Map<String, Object> row) {
final Map<String, String> dimensionMap = new HashMap<>(); final Map<String, String> dimensionMap = new HashMap<>();
final String dimensions = getString(row, "dimensions"); final String dimensions = getString(row, "dimensions");

View File

@ -198,6 +198,7 @@ public class AlarmCreationBolt extends BaseRichBolt {
} }
alarmCache.remove(alarmDefinitionId); alarmCache.remove(alarmDefinitionId);
alarmDefinitionCache.remove(alarmDefinitionId); alarmDefinitionCache.remove(alarmDefinitionId);
alarmDAO.deleteByDefinitionId(alarmDefinitionId);
} }
protected void handleNewMetricDefinition( protected void handleNewMetricDefinition(

View File

@ -69,7 +69,7 @@ public class AlarmThresholdingBolt extends BaseRichBolt {
private transient Logger logger; private transient Logger logger;
private DataSourceFactory dbConfig; private DataSourceFactory dbConfig;
private KafkaProducerConfiguration producerConfiguration; private KafkaProducerConfiguration producerConfiguration;
final Map<String, Alarm> alarms = new HashMap<String, Alarm>(); final Map<String, Alarm> alarms = new HashMap<>();
final Map<String, AlarmDefinition> alarmDefinitions = new HashMap<>(); final Map<String, AlarmDefinition> alarmDefinitions = new HashMap<>();
private transient AlarmDAO alarmDAO; private transient AlarmDAO alarmDAO;
private transient AlarmDefinitionDAO alarmDefinitionDAO; private transient AlarmDefinitionDAO alarmDefinitionDAO;
@ -217,8 +217,16 @@ public class AlarmThresholdingBolt extends BaseRichBolt {
} }
private void changeAlarmState(Alarm alarm, AlarmState initialState, String stateChangeReason) { private void changeAlarmState(Alarm alarm, AlarmState initialState, String stateChangeReason) {
alarmDAO.updateState(alarm.getId(), alarm.getState());
final AlarmDefinition alarmDefinition = alarmDefinitions.get(alarm.getAlarmDefinitionId()); 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<MetricDefinition> alarmedMetrics = new ArrayList<>(alarm.getAlarmedMetrics().size()); final List<MetricDefinition> alarmedMetrics = new ArrayList<>(alarm.getAlarmedMetrics().size());
for (final MetricDefinitionAndTenantId mdtid : alarm.getAlarmedMetrics()) { for (final MetricDefinitionAndTenantId mdtid : alarm.getAlarmedMetrics()) {
alarmedMetrics.add(mdtid.metricDefinition); alarmedMetrics.add(mdtid.metricDefinition);

View File

@ -445,5 +445,8 @@ public class ThresholdingEngineAlarmTest extends TopologyTestCase {
} }
return false; return false;
} }
@Override
public void deleteByDefinitionId(String alarmDefinitionId) {}
} }
} }