You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@ambari.apache.org by ds...@apache.org on 2017/06/19 16:19:25 UTC
ambari git commit: AMBARI-21248 Exception needs to be handled
properly for mail alert (dsen)
Repository: ambari
Updated Branches:
refs/heads/trunk 927d5c834 -> 958776415
AMBARI-21248 Exception needs to be handled properly for mail alert (dsen)
Project: http://git-wip-us.apache.org/repos/asf/ambari/repo
Commit: http://git-wip-us.apache.org/repos/asf/ambari/commit/95877641
Tree: http://git-wip-us.apache.org/repos/asf/ambari/tree/95877641
Diff: http://git-wip-us.apache.org/repos/asf/ambari/diff/95877641
Branch: refs/heads/trunk
Commit: 95877641588a50c20d8b97e8ce749addc37fc0a2
Parents: 927d5c8
Author: Dmytro Sen <ds...@apache.org>
Authored: Mon Jun 19 19:19:14 2017 +0300
Committer: Dmytro Sen <ds...@apache.org>
Committed: Mon Jun 19 19:19:14 2017 +0300
----------------------------------------------------------------------
.../services/AlertNoticeDispatchService.java | 86 ++++++++++----------
.../AlertNoticeDispatchServiceTest.java | 23 ++++++
2 files changed, 68 insertions(+), 41 deletions(-)
----------------------------------------------------------------------
http://git-wip-us.apache.org/repos/asf/ambari/blob/95877641/ambari-server/src/main/java/org/apache/ambari/server/state/services/AlertNoticeDispatchService.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/main/java/org/apache/ambari/server/state/services/AlertNoticeDispatchService.java b/ambari-server/src/main/java/org/apache/ambari/server/state/services/AlertNoticeDispatchService.java
index 2972f51..73a661d 100644
--- a/ambari-server/src/main/java/org/apache/ambari/server/state/services/AlertNoticeDispatchService.java
+++ b/ambari-server/src/main/java/org/apache/ambari/server/state/services/AlertNoticeDispatchService.java
@@ -306,65 +306,69 @@ public class AlertNoticeDispatchService extends AbstractScheduledService {
if (null == notices || notices.size() == 0) {
continue;
}
+ try {
+ String targetType = target.getNotificationType();
+ NotificationDispatcher dispatcher = m_dispatchFactory.getDispatcher(targetType);
- String targetType = target.getNotificationType();
- NotificationDispatcher dispatcher = m_dispatchFactory.getDispatcher(targetType);
-
- // create a single digest notification if supported
- if (dispatcher.isDigestSupported()) {
- AlertNotification notification = buildNotificationFromTarget(target);
- notification.CallbackIds = new ArrayList<>(notices.size());
- List<AlertHistoryEntity> histories = new ArrayList<>(
- notices.size());
+ // create a single digest notification if supported
+ if (dispatcher.isDigestSupported()) {
+ AlertNotification notification = buildNotificationFromTarget(target);
+ notification.CallbackIds = new ArrayList<>(notices.size());
+ List<AlertHistoryEntity> histories = new ArrayList<>(
+ notices.size());
- // add callback IDs so that the notices can be marked as DELIVERED or
- // FAILED, and create a list of just the alert histories
- for (AlertNoticeEntity notice : notices) {
- AlertHistoryEntity history = notice.getAlertHistory();
- histories.add(history);
+ // add callback IDs so that the notices can be marked as DELIVERED or
+ // FAILED, and create a list of just the alert histories
+ for (AlertNoticeEntity notice : notices) {
+ AlertHistoryEntity history = notice.getAlertHistory();
+ histories.add(history);
- notification.CallbackIds.add(notice.getUuid());
- }
+ notification.CallbackIds.add(notice.getUuid());
+ }
- // populate the subject and body fields; if there is a problem
- // generating the content, then mark the notices as FAILED
- try {
- renderDigestNotificationContent(dispatcher, notification, histories, target);
-
- // dispatch
- DispatchRunnable runnable = new DispatchRunnable(dispatcher, notification);
- m_executor.execute(runnable);
- } catch (Exception exception) {
- LOG.error("Unable to create notification for alerts", exception);
-
- // there was a problem generating content for the target; mark all
- // notices as FAILED and skip this target
- // mark these as failed
- notification.Callback.onFailure(notification.CallbackIds);
- }
- } else {
- // the dispatcher does not support digest, each notice must have a 1:1
- // notification created for it
- for (AlertNoticeEntity notice : notices) {
- AlertNotification notification = buildNotificationFromTarget(target);
- AlertHistoryEntity history = notice.getAlertHistory();
- notification.CallbackIds = Collections.singletonList(notice.getUuid());
// populate the subject and body fields; if there is a problem
// generating the content, then mark the notices as FAILED
try {
- renderNotificationContent(dispatcher, notification, history, target);
+ renderDigestNotificationContent(dispatcher, notification, histories, target);
// dispatch
DispatchRunnable runnable = new DispatchRunnable(dispatcher, notification);
m_executor.execute(runnable);
} catch (Exception exception) {
- LOG.error("Unable to create notification for alert", exception);
+ LOG.error("Unable to create notification for alerts", exception);
+ // there was a problem generating content for the target; mark all
+ // notices as FAILED and skip this target
// mark these as failed
notification.Callback.onFailure(notification.CallbackIds);
}
+ } else {
+ // the dispatcher does not support digest, each notice must have a 1:1
+ // notification created for it
+ for (AlertNoticeEntity notice : notices) {
+ AlertNotification notification = buildNotificationFromTarget(target);
+ AlertHistoryEntity history = notice.getAlertHistory();
+ notification.CallbackIds = Collections.singletonList(notice.getUuid());
+
+ // populate the subject and body fields; if there is a problem
+ // generating the content, then mark the notices as FAILED
+ try {
+ renderNotificationContent(dispatcher, notification, history, target);
+
+ // dispatch
+ DispatchRunnable runnable = new DispatchRunnable(dispatcher, notification);
+ m_executor.execute(runnable);
+ } catch (Exception exception) {
+ LOG.error("Unable to create notification for alert", exception);
+
+ // mark these as failed
+ notification.Callback.onFailure(notification.CallbackIds);
+ }
+ }
}
+ } catch (Exception e) {
+ LOG.error("Caught exception during Alert Notice dispatching.", e);
}
}
}
http://git-wip-us.apache.org/repos/asf/ambari/blob/95877641/ambari-server/src/test/java/org/apache/ambari/server/state/services/AlertNoticeDispatchServiceTest.java
----------------------------------------------------------------------
diff --git a/ambari-server/src/test/java/org/apache/ambari/server/state/services/AlertNoticeDispatchServiceTest.java b/ambari-server/src/test/java/org/apache/ambari/server/state/services/AlertNoticeDispatchServiceTest.java
index 42ee366..61b0c31 100644
--- a/ambari-server/src/test/java/org/apache/ambari/server/state/services/AlertNoticeDispatchServiceTest.java
+++ b/ambari-server/src/test/java/org/apache/ambari/server/state/services/AlertNoticeDispatchServiceTest.java
@@ -252,6 +252,29 @@ public class AlertNoticeDispatchServiceTest extends AlertNoticeDispatchService {
assertTrue(notification.Body.contains(ALERT_UNIQUE_TEXT));
}
+ @Test
+ public void testExceptionHandling() throws Exception {
+ List<AlertNoticeEntity> notices = getSingleMockNotice("EMAIL");
+ AlertNoticeEntity notice = notices.get(0);
+
+ EasyMock.expect(m_dao.findPendingNotices()).andReturn(notices).once();
+ EasyMock.expect(m_dispatchFactory.getDispatcher("EMAIL")).andReturn(null).once();
+ EasyMock.expect(m_dao.merge(notice)).andReturn(notice).atLeastOnce();
+
+ EasyMock.replay(m_dao, m_dispatchFactory);
+
+ // "startup" the service so that its initialization is done
+ AlertNoticeDispatchService service = m_injector.getInstance(AlertNoticeDispatchService.class);
+ service.startUp();
+
+ // service trigger with mock executor that blocks
+ service.setExecutor(new MockExecutor());
+ // no exceptions should be thrown
+ service.runOneIteration();
+
+ EasyMock.verify(m_dao, m_dispatchFactory);
+ }
+
/**
* Tests a digest dispatch for SNMP.
*