Bug-4636: NotificationSubscriber's exception prevents notifications to other listeners 81/29681/3
authorKamal Rameshan <kramesha@cisco.com>
Fri, 13 Nov 2015 19:26:21 +0000 (11:26 -0800)
committerGerrit Code Review <gerrit@opendaylight.org>
Mon, 16 Nov 2015 13:36:00 +0000 (13:36 +0000)
Catch the exception and log it with enough context.

Change-Id: I23c248c59753008e6d09155513b2dba108fbccbf
Signed-off-by: Kamal Rameshan <kramesha@cisco.com>
Signed-off-by: Robert Varga <rovarga@cisco.com>
opendaylight/md-sal/sal-dom-broker/src/main/java/org/opendaylight/controller/md/sal/dom/broker/impl/DOMNotificationRouterEvent.java

index 65c7166..85f93a6 100644 (file)
@@ -15,12 +15,15 @@ import java.util.Collection;
 import org.opendaylight.controller.md.sal.dom.api.DOMNotification;
 import org.opendaylight.controller.md.sal.dom.api.DOMNotificationListener;
 import org.opendaylight.yangtools.concepts.ListenerRegistration;
+import org.slf4j.Logger;
+import org.slf4j.LoggerFactory;
 
 /**
  * A single notification event in the disruptor ringbuffer. These objects are reused,
  * so they do have mutable state.
  */
 final class DOMNotificationRouterEvent {
+    private static final Logger LOG = LoggerFactory.getLogger(DOMNotificationRouterEvent.class);
     public static final EventFactory<DOMNotificationRouterEvent> FACTORY = new EventFactory<DOMNotificationRouterEvent>() {
         @Override
         public DOMNotificationRouterEvent newInstance() {
@@ -45,9 +48,13 @@ final class DOMNotificationRouterEvent {
 
     void deliverNotification() {
         for (ListenerRegistration<? extends DOMNotificationListener> r : subscribers) {
-            final DOMNotificationListener l = r.getInstance();
-            if (l != null) {
-                l.onNotification(notification);
+            final DOMNotificationListener listener = r.getInstance();
+            if (listener != null) {
+                try {
+                    listener.onNotification(notification);
+                } catch (Exception e) {
+                    LOG.error("Delivery of notification {} caused an error in listener {}", notification, listener, e);
+                }
             }
         }
     }