you must call get on futures
Change-Id: I2ed3a9b2250f2a1c6e2e68e35cec50e691702099
diff --git a/core/api/src/main/java/org/onlab/onos/net/flow/BatchOperationResult.java b/core/api/src/main/java/org/onlab/onos/net/flow/BatchOperationResult.java
new file mode 100644
index 0000000..43fd694
--- /dev/null
+++ b/core/api/src/main/java/org/onlab/onos/net/flow/BatchOperationResult.java
@@ -0,0 +1,23 @@
+package org.onlab.onos.net.flow;
+
+import java.util.List;
+
+/**
+ * Interface capturing the result of a batch operation.
+ *
+ */
+public interface BatchOperationResult<T> {
+
+ /**
+ * Returns whether the operation was successful.
+ * @return true if successful, false otherwise
+ */
+ boolean isSuccess();
+
+ /**
+ * Obtains a list of items which failed.
+ * @return a list of failures
+ */
+ List<T> failedItems();
+
+}
diff --git a/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java b/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java
index a897cbb..ac8d607 100644
--- a/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java
+++ b/core/net/src/main/java/org/onlab/onos/net/flow/impl/FlowRuleManager.java
@@ -454,7 +454,7 @@
private CompletedBatchOperation finalizeBatchOperation(boolean success,
List<FlowEntry> failed) {
- synchronized (overall) {
+ synchronized (this) {
if (!state.compareAndSet(BatchState.STARTED, BatchState.FINISHED)) {
if (state.get() == BatchState.FINISHED) {
return overall;
diff --git a/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java b/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java
index 50f1038..d611059 100644
--- a/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java
+++ b/core/net/src/main/java/org/onlab/onos/net/intent/impl/IntentManager.java
@@ -19,8 +19,11 @@
import java.util.Objects;
import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.ConcurrentMap;
+import java.util.concurrent.ExecutionException;
import java.util.concurrent.ExecutorService;
import java.util.concurrent.Future;
+import java.util.concurrent.TimeUnit;
+import java.util.concurrent.TimeoutException;
import org.apache.felix.scr.annotations.Activate;
import org.apache.felix.scr.annotations.Component;
@@ -516,9 +519,15 @@
public void run() {
for (Iterator<Future<CompletedBatchOperation>> i = futures.iterator(); i.hasNext();) {
Future<CompletedBatchOperation> future = i.next();
- if (future.isDone()) {
- // TODO: we may want to get the future here
+ try {
+ // TODO: we may want to get the future here and go back to the future.
+ future.get(100, TimeUnit.NANOSECONDS);
+
+
i.remove();
+
+ } catch (TimeoutException | InterruptedException | ExecutionException te) {
+ log.debug("Intallations of intent {} is still pending", intent);
}
}
if (futures.isEmpty()) {
diff --git a/providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/OpenFlowRuleProvider.java b/providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/OpenFlowRuleProvider.java
index 2da09fe..ac0bb61 100644
--- a/providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/OpenFlowRuleProvider.java
+++ b/providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/OpenFlowRuleProvider.java
@@ -430,9 +430,11 @@
public CompletedBatchOperation get(long timeout, TimeUnit unit)
throws InterruptedException, ExecutionException,
TimeoutException {
- countDownLatch.await(timeout, unit);
- this.state = BatchState.FINISHED;
- return new CompletedBatchOperation(ok.get(), offendingFlowMods);
+ if (countDownLatch.await(timeout, unit)) {
+ this.state = BatchState.FINISHED;
+ return new CompletedBatchOperation(ok.get(), offendingFlowMods);
+ }
+ throw new TimeoutException();
}
private void cleanUp() {