Jian Li
Committed by Gerrit Code Review

[ONOS-3528] Log exceptions of the tasks for SharedExecutorService

This commit tries to log all the runtime exceptions of the tasks
that are executed by using submit method of SharedExecutorService.

Change-Id: I72760213a0f977096353dacd20263e5c93af5c6a
...@@ -16,9 +16,11 @@ ...@@ -16,9 +16,11 @@
16 package org.onlab.util; 16 package org.onlab.util;
17 17
18 import com.codahale.metrics.Timer; 18 import com.codahale.metrics.Timer;
19 +import com.google.common.base.Throwables;
19 import org.onlab.metrics.MetricsComponent; 20 import org.onlab.metrics.MetricsComponent;
20 import org.onlab.metrics.MetricsFeature; 21 import org.onlab.metrics.MetricsFeature;
21 import org.onlab.metrics.MetricsService; 22 import org.onlab.metrics.MetricsService;
23 +import org.slf4j.Logger;
22 24
23 import java.util.Collection; 25 import java.util.Collection;
24 import java.util.List; 26 import java.util.List;
...@@ -39,6 +41,7 @@ import static org.slf4j.LoggerFactory.getLogger; ...@@ -39,6 +41,7 @@ import static org.slf4j.LoggerFactory.getLogger;
39 class SharedExecutorService implements ExecutorService { 41 class SharedExecutorService implements ExecutorService {
40 42
41 private static final String NOT_ALLOWED = "Shutdown of shared executor is not allowed"; 43 private static final String NOT_ALLOWED = "Shutdown of shared executor is not allowed";
44 + private final Logger log = getLogger(getClass());
42 45
43 private ExecutorService executor; 46 private ExecutorService executor;
44 47
...@@ -78,7 +81,6 @@ class SharedExecutorService implements ExecutorService { ...@@ -78,7 +81,6 @@ class SharedExecutorService implements ExecutorService {
78 oldExecutor.shutdown(); 81 oldExecutor.shutdown();
79 } 82 }
80 83
81 -
82 @Override 84 @Override
83 public void shutdown() { 85 public void shutdown() {
84 throw new UnsupportedOperationException(NOT_ALLOWED); 86 throw new UnsupportedOperationException(NOT_ALLOWED);
...@@ -138,12 +140,12 @@ class SharedExecutorService implements ExecutorService { ...@@ -138,12 +140,12 @@ class SharedExecutorService implements ExecutorService {
138 140
139 @Override 141 @Override
140 public <T> Future<T> submit(Runnable task, T result) { 142 public <T> Future<T> submit(Runnable task, T result) {
141 - return executor.submit(task, result); 143 + return executor.submit(wrap(task), result);
142 } 144 }
143 145
144 @Override 146 @Override
145 public Future<?> submit(Runnable task) { 147 public Future<?> submit(Runnable task) {
146 - return executor.submit(task); 148 + return executor.submit(wrap(task));
147 } 149 }
148 150
149 @Override 151 @Override
...@@ -193,10 +195,36 @@ class SharedExecutorService implements ExecutorService { ...@@ -193,10 +195,36 @@ class SharedExecutorService implements ExecutorService {
193 } 195 }
194 } 196 }
195 197
198 + private Runnable wrap(Runnable command) {
199 + return new LoggableRunnable(command);
200 + }
201 +
202 + /**
203 + * A runnable class that allows to capture and log the exceptions.
204 + */
205 + private class LoggableRunnable implements Runnable {
206 +
207 + private Runnable runnable;
208 +
209 + public LoggableRunnable(Runnable runnable) {
210 + super();
211 + this.runnable = runnable;
212 + }
213 +
214 + @Override
215 + public void run() {
216 + try {
217 + runnable.run();
218 + } catch (Exception e) {
219 + log.error("Uncaught exception on " + runnable.getClass().getSimpleName(), e);
220 + throw Throwables.propagate(e);
221 + }
222 + }
223 + }
224 +
196 /** 225 /**
197 * CallableExtended class is used to get Runnable Object 226 * CallableExtended class is used to get Runnable Object
198 * from Callable Object. 227 * from Callable Object.
199 - *
200 */ 228 */
201 class CallableExtended implements Callable { 229 class CallableExtended implements Callable {
202 230
......