Made time limit for event processing configurable; cleaned-up duplicate code.
Change-Id: I08e7f1c9f4cdbd6404f1eb5e3544989e7a728d92
diff --git a/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java b/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java
index 382846c..6d97460 100644
--- a/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java
+++ b/core/net/src/main/java/org/onosproject/event/impl/CoreEventDispatcher.java
@@ -33,6 +33,7 @@
import java.util.concurrent.Future;
import java.util.concurrent.LinkedBlockingQueue;
+import static com.google.common.base.Preconditions.checkArgument;
import static java.util.concurrent.Executors.newSingleThreadExecutor;
import static org.onlab.util.Tools.groupedThreads;
import static org.slf4j.LoggerFactory.getLogger;
@@ -45,12 +46,12 @@
public class CoreEventDispatcher extends DefaultEventSinkRegistry
implements EventDeliveryService {
- // Maximum number of millis a sink can take to process an event.
- private static final long MAX_EXECUTE_MS = 1_000;
- private static final long WATCHDOG_MS = MAX_EXECUTE_MS / 4;
-
private final Logger log = getLogger(getClass());
+ // Default number of millis a sink can take to process an event.
+ private static final long DEFAULT_EXECUTE_MS = 2_000; // ms
+ private static final long WATCHDOG_MS = 250; // ms
+
private final BlockingQueue<Event> events = new LinkedBlockingQueue<>();
private final ExecutorService executor =
@@ -61,6 +62,7 @@
};
private DispatchLoop dispatchLoop;
+ private long maxProcessMillis = DEFAULT_EXECUTE_MS;
// Means to detect long-running sinks
private TimerTask watchdog;
@@ -92,6 +94,18 @@
log.info("Stopped");
}
+ @Override
+ public void setDispatchTimeLimit(long millis) {
+ checkArgument(millis >= WATCHDOG_MS,
+ "Time limit must be greater than %s", WATCHDOG_MS);
+ maxProcessMillis = millis;
+ }
+
+ @Override
+ public long getDispatchTimeLimit() {
+ return maxProcessMillis;
+ }
+
// Auxiliary event dispatching loop that feeds off the events queue.
private class DispatchLoop implements Runnable {
private volatile boolean stopped;
@@ -126,7 +140,7 @@
lastStart = 0;
} else {
log.warn("No sink registered for event class {}",
- event.getClass());
+ event.getClass().getName());
}
}
@@ -140,7 +154,7 @@
@Override
public void run() {
long delta = System.currentTimeMillis() - lastStart;
- if (lastStart > 0 && delta > MAX_EXECUTE_MS) {
+ if (lastStart > 0 && delta > maxProcessMillis) {
log.error("Event sink {} exceeded execution time limit: {} ms",
lastSink.getClass().getName(), delta);