You are viewing a plain text version of this content. The canonical link for it is here.
Posted to issues@ambari.apache.org by "Richard Zang (JIRA)" <ji...@apache.org> on 2017/06/14 17:28:00 UTC
[jira] [Updated] (AMBARI-21248) Exception needs to be handled
properly for mail alert
[ https://issues.apache.org/jira/browse/AMBARI-21248?page=com.atlassian.jira.plugin.system.issuetabpanels:all-tabpanel ]
Richard Zang updated AMBARI-21248:
----------------------------------
Priority: Critical (was: Major)
> Exception needs to be handled properly for mail alert
> -----------------------------------------------------
>
> Key: AMBARI-21248
> URL: https://issues.apache.org/jira/browse/AMBARI-21248
> Project: Ambari
> Issue Type: Bug
> Components: ambari-server
> Affects Versions: 2.4.2
> Reporter: Richard Zang
> Assignee: Dmytro Sen
> Priority: Critical
> Fix For: 2.5.2
>
>
> In org.apache.ambari.server.state.services.AlertNoticeDispatchService, we have below code snippet:
> {code}
> ...
> protected void runOneIteration() throws Exception {
> …
> String targetType = target.getNotificationType();
> NotificationDispatcher dispatcher = m_dispatchFactory.getDispatcher(targetType);
> …
> if (dispatcher.isDigestSupported()) {
> ...
> {code}
> If the database has a change to AlertTargetEntity's targetType column (unlikely but let's assume it happened), then dispatcher can be null and the subsequent if clause will throw an exception. In https://github.com/google/guava/blob/master/guava/src/com/google/common/util/concurrent/AbstractScheduledService.java, we see that the exception may happen silently since shutDown() and notifyFailed() does not log anything.
> ...
> {code}
> class Task implements Runnable {
> @Override
> public void run() {
> lock.lock();
> try {
> if (runningTask.isCancelled()) { // task may have been cancelled while blocked on the lock. return; }
> AbstractScheduledService.this.runOneIteration();
> } catch (Throwable t) {
> try {
> shutDown();
> } catch (Exception ignored) {
> logger.log(Level.WARNING, "Error while attempting to shut down the service after failure.", ignored);
> }
> notifyFailed(t);
> runningTask.cancel(false); // prevent future invocations.
> } finally {
> lock.unlock();
> }
> }
> }
> }
> {code}
> So, runOneIteration will shutdown the scheduler if it hits an uncaught exception. We should wrap a try/catch.
--
This message was sent by Atlassian JIRA
(v6.4.14#64029)