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 @@
package org.onlab.util;
import com.codahale.metrics.Timer;
import com.google.common.base.Throwables;
import org.onlab.metrics.MetricsComponent;
import org.onlab.metrics.MetricsFeature;
import org.onlab.metrics.MetricsService;
import org.slf4j.Logger;
import java.util.Collection;
import java.util.List;
......@@ -39,6 +41,7 @@ import static org.slf4j.LoggerFactory.getLogger;
class SharedExecutorService implements ExecutorService {
private static final String NOT_ALLOWED = "Shutdown of shared executor is not allowed";
private final Logger log = getLogger(getClass());
private ExecutorService executor;
......@@ -78,7 +81,6 @@ class SharedExecutorService implements ExecutorService {
oldExecutor.shutdown();
}
@Override
public void shutdown() {
throw new UnsupportedOperationException(NOT_ALLOWED);
......@@ -138,12 +140,12 @@ class SharedExecutorService implements ExecutorService {
@Override
public <T> Future<T> submit(Runnable task, T result) {
return executor.submit(task, result);
return executor.submit(wrap(task), result);
}
@Override
public Future<?> submit(Runnable task) {
return executor.submit(task);
return executor.submit(wrap(task));
}
@Override
......@@ -193,10 +195,36 @@ class SharedExecutorService implements ExecutorService {
}
}
private Runnable wrap(Runnable command) {
return new LoggableRunnable(command);
}
/**
* A runnable class that allows to capture and log the exceptions.
*/
private class LoggableRunnable implements Runnable {
private Runnable runnable;
public LoggableRunnable(Runnable runnable) {
super();
this.runnable = runnable;
}
@Override
public void run() {
try {
runnable.run();
} catch (Exception e) {
log.error("Uncaught exception on " + runnable.getClass().getSimpleName(), e);
throw Throwables.propagate(e);
}
}
}
/**
* CallableExtended class is used to get Runnable Object
* from Callable Object.
*
*/
class CallableExtended implements Callable {
......