you must call get on futures
Change-Id: I2ed3a9b2250f2a1c6e2e68e35cec50e691702099
Showing
4 changed files
with
40 additions
and
6 deletions
1 | +package org.onlab.onos.net.flow; | ||
2 | + | ||
3 | +import java.util.List; | ||
4 | + | ||
5 | +/** | ||
6 | + * Interface capturing the result of a batch operation. | ||
7 | + * | ||
8 | + */ | ||
9 | +public interface BatchOperationResult<T> { | ||
10 | + | ||
11 | + /** | ||
12 | + * Returns whether the operation was successful. | ||
13 | + * @return true if successful, false otherwise | ||
14 | + */ | ||
15 | + boolean isSuccess(); | ||
16 | + | ||
17 | + /** | ||
18 | + * Obtains a list of items which failed. | ||
19 | + * @return a list of failures | ||
20 | + */ | ||
21 | + List<T> failedItems(); | ||
22 | + | ||
23 | +} |
... | @@ -454,7 +454,7 @@ public class FlowRuleManager | ... | @@ -454,7 +454,7 @@ public class FlowRuleManager |
454 | 454 | ||
455 | private CompletedBatchOperation finalizeBatchOperation(boolean success, | 455 | private CompletedBatchOperation finalizeBatchOperation(boolean success, |
456 | List<FlowEntry> failed) { | 456 | List<FlowEntry> failed) { |
457 | - synchronized (overall) { | 457 | + synchronized (this) { |
458 | if (!state.compareAndSet(BatchState.STARTED, BatchState.FINISHED)) { | 458 | if (!state.compareAndSet(BatchState.STARTED, BatchState.FINISHED)) { |
459 | if (state.get() == BatchState.FINISHED) { | 459 | if (state.get() == BatchState.FINISHED) { |
460 | return overall; | 460 | return overall; | ... | ... |
... | @@ -19,8 +19,11 @@ import java.util.Map; | ... | @@ -19,8 +19,11 @@ import java.util.Map; |
19 | import java.util.Objects; | 19 | import java.util.Objects; |
20 | import java.util.concurrent.ConcurrentHashMap; | 20 | import java.util.concurrent.ConcurrentHashMap; |
21 | import java.util.concurrent.ConcurrentMap; | 21 | import java.util.concurrent.ConcurrentMap; |
22 | +import java.util.concurrent.ExecutionException; | ||
22 | import java.util.concurrent.ExecutorService; | 23 | import java.util.concurrent.ExecutorService; |
23 | import java.util.concurrent.Future; | 24 | import java.util.concurrent.Future; |
25 | +import java.util.concurrent.TimeUnit; | ||
26 | +import java.util.concurrent.TimeoutException; | ||
24 | 27 | ||
25 | import org.apache.felix.scr.annotations.Activate; | 28 | import org.apache.felix.scr.annotations.Activate; |
26 | import org.apache.felix.scr.annotations.Component; | 29 | import org.apache.felix.scr.annotations.Component; |
... | @@ -516,9 +519,15 @@ public class IntentManager | ... | @@ -516,9 +519,15 @@ public class IntentManager |
516 | public void run() { | 519 | public void run() { |
517 | for (Iterator<Future<CompletedBatchOperation>> i = futures.iterator(); i.hasNext();) { | 520 | for (Iterator<Future<CompletedBatchOperation>> i = futures.iterator(); i.hasNext();) { |
518 | Future<CompletedBatchOperation> future = i.next(); | 521 | Future<CompletedBatchOperation> future = i.next(); |
519 | - if (future.isDone()) { | 522 | + try { |
520 | - // TODO: we may want to get the future here | 523 | + // TODO: we may want to get the future here and go back to the future. |
524 | + future.get(100, TimeUnit.NANOSECONDS); | ||
525 | + | ||
526 | + | ||
521 | i.remove(); | 527 | i.remove(); |
528 | + | ||
529 | + } catch (TimeoutException | InterruptedException | ExecutionException te) { | ||
530 | + log.debug("Intallations of intent {} is still pending", intent); | ||
522 | } | 531 | } |
523 | } | 532 | } |
524 | if (futures.isEmpty()) { | 533 | if (futures.isEmpty()) { | ... | ... |
providers/openflow/flow/src/main/java/org/onlab/onos/provider/of/flow/impl/OpenFlowRuleProvider.java
... | @@ -430,9 +430,11 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr | ... | @@ -430,9 +430,11 @@ public class OpenFlowRuleProvider extends AbstractProvider implements FlowRulePr |
430 | public CompletedBatchOperation get(long timeout, TimeUnit unit) | 430 | public CompletedBatchOperation get(long timeout, TimeUnit unit) |
431 | throws InterruptedException, ExecutionException, | 431 | throws InterruptedException, ExecutionException, |
432 | TimeoutException { | 432 | TimeoutException { |
433 | - countDownLatch.await(timeout, unit); | 433 | + if (countDownLatch.await(timeout, unit)) { |
434 | - this.state = BatchState.FINISHED; | 434 | + this.state = BatchState.FINISHED; |
435 | - return new CompletedBatchOperation(ok.get(), offendingFlowMods); | 435 | + return new CompletedBatchOperation(ok.get(), offendingFlowMods); |
436 | + } | ||
437 | + throw new TimeoutException(); | ||
436 | } | 438 | } |
437 | 439 | ||
438 | private void cleanUp() { | 440 | private void cleanUp() { | ... | ... |
-
Please register or login to post a comment