Jian Li
Committed by Thomas Vachuska

[ONOS-3528] Log exception for all threads that use BoundedThreadPool

Change-Id: I9c904c49998a8206ba2b5a084e03e776fa1d8237
...@@ -16,6 +16,8 @@ ...@@ -16,6 +16,8 @@
16 package org.onlab.util; 16 package org.onlab.util;
17 17
18 import java.util.concurrent.Callable; 18 import java.util.concurrent.Callable;
19 +import java.util.concurrent.CancellationException;
20 +import java.util.concurrent.ExecutionException;
19 import java.util.concurrent.Future; 21 import java.util.concurrent.Future;
20 import java.util.concurrent.LinkedBlockingQueue; 22 import java.util.concurrent.LinkedBlockingQueue;
21 import java.util.concurrent.RejectedExecutionHandler; 23 import java.util.concurrent.RejectedExecutionHandler;
...@@ -111,6 +113,28 @@ public final class BoundedThreadPool extends ThreadPoolExecutor { ...@@ -111,6 +113,28 @@ public final class BoundedThreadPool extends ThreadPoolExecutor {
111 updateLoad(); 113 updateLoad();
112 } 114 }
113 115
116 + @Override
117 + protected void afterExecute(Runnable r, Throwable t) {
118 + super.afterExecute(r, t);
119 + if (t == null && r instanceof Future<?>) {
120 + try {
121 + Future<?> future = (Future<?>) r;
122 + if (future.isDone()) {
123 + future.get();
124 + }
125 + } catch (CancellationException ce) {
126 + t = ce;
127 + } catch (ExecutionException ee) {
128 + t = ee.getCause();
129 + } catch (InterruptedException ie) {
130 + Thread.currentThread().interrupt();
131 + }
132 + }
133 + if (t != null) {
134 + log.error("Uncaught exception on " + r.getClass().getSimpleName(), t);
135 + }
136 + }
137 +
114 // TODO schedule this with a fixed delay from a scheduled executor 138 // TODO schedule this with a fixed delay from a scheduled executor
115 private final AtomicLong lastPrinted = new AtomicLong(0L); 139 private final AtomicLong lastPrinted = new AtomicLong(0L);
116 140
......