Brian O'Connor
Committed by Gerrit Code Review

Serializing batch execution on per-instance basis for intents

Change-Id: Idda3f4a65e78567302d91ba0070e78d435eea8fd
...@@ -155,6 +155,9 @@ public class IntentManager ...@@ -155,6 +155,9 @@ public class IntentManager
155 155
156 @Override 156 @Override
157 public void execute(IntentOperations operations) { 157 public void execute(IntentOperations operations) {
158 + if (operations.operations().isEmpty()) {
159 + return;
160 + }
158 batchService.addIntentOperations(operations); 161 batchService.addIntentOperations(operations);
159 } 162 }
160 163
......
...@@ -15,7 +15,7 @@ ...@@ -15,7 +15,7 @@
15 */ 15 */
16 package org.onlab.onos.store.intent.impl; 16 package org.onlab.onos.store.intent.impl;
17 17
18 -import com.google.common.collect.ImmutableSet; 18 +import com.google.common.collect.Sets;
19 import org.apache.felix.scr.annotations.Activate; 19 import org.apache.felix.scr.annotations.Activate;
20 import org.apache.felix.scr.annotations.Component; 20 import org.apache.felix.scr.annotations.Component;
21 import org.apache.felix.scr.annotations.Deactivate; 21 import org.apache.felix.scr.annotations.Deactivate;
...@@ -25,7 +25,9 @@ import org.onlab.onos.net.intent.IntentBatchService; ...@@ -25,7 +25,9 @@ import org.onlab.onos.net.intent.IntentBatchService;
25 import org.onlab.onos.net.intent.IntentOperations; 25 import org.onlab.onos.net.intent.IntentOperations;
26 import org.slf4j.Logger; 26 import org.slf4j.Logger;
27 27
28 -import java.util.HashSet; 28 +import java.util.Collection;
29 +import java.util.LinkedList;
30 +import java.util.Queue;
29 import java.util.Set; 31 import java.util.Set;
30 32
31 import static com.google.common.base.Preconditions.checkNotNull; 33 import static com.google.common.base.Preconditions.checkNotNull;
...@@ -37,7 +39,8 @@ import static org.slf4j.LoggerFactory.getLogger; ...@@ -37,7 +39,8 @@ import static org.slf4j.LoggerFactory.getLogger;
37 public class DistributedIntentBatchQueue implements IntentBatchService { 39 public class DistributedIntentBatchQueue implements IntentBatchService {
38 40
39 private final Logger log = getLogger(getClass()); 41 private final Logger log = getLogger(getClass());
40 - private final Set<IntentOperations> pendingBatches = new HashSet<>(); 42 + private final Queue<IntentOperations> pendingBatches = new LinkedList<>();
43 + private final Set<IntentOperations> currentBatches = Sets.newHashSet();
41 private IntentBatchDelegate delegate; 44 private IntentBatchDelegate delegate;
42 45
43 @Activate 46 @Activate
...@@ -53,18 +56,35 @@ public class DistributedIntentBatchQueue implements IntentBatchService { ...@@ -53,18 +56,35 @@ public class DistributedIntentBatchQueue implements IntentBatchService {
53 @Override 56 @Override
54 public void addIntentOperations(IntentOperations operations) { 57 public void addIntentOperations(IntentOperations operations) {
55 checkState(delegate != null, "No delegate set"); 58 checkState(delegate != null, "No delegate set");
59 + synchronized (this) {
56 pendingBatches.add(operations); 60 pendingBatches.add(operations);
57 - delegate.execute(operations); 61 + if (currentBatches.isEmpty()) {
62 + IntentOperations work = pendingBatches.poll();
63 + currentBatches.add(work);
64 + delegate.execute(work);
65 + }
66 + }
58 } 67 }
59 68
60 @Override 69 @Override
61 public void removeIntentOperations(IntentOperations operations) { 70 public void removeIntentOperations(IntentOperations operations) {
62 - pendingBatches.remove(operations); 71 + // we allow at most one outstanding batch at a time
72 + synchronized (this) {
73 + checkState(currentBatches.remove(operations), "Operations not found in current ops.");
74 + checkState(currentBatches.isEmpty(), "More than one outstanding batch.");
75 + IntentOperations work = pendingBatches.poll();
76 + if (work != null) {
77 + currentBatches.add(work);
78 + delegate.execute(work);
79 + }
80 + }
63 } 81 }
64 82
65 @Override 83 @Override
66 public Set<IntentOperations> getIntentOperations() { 84 public Set<IntentOperations> getIntentOperations() {
67 - return ImmutableSet.copyOf(pendingBatches); 85 + Set<IntentOperations> set = Sets.newHashSet(currentBatches);
86 + set.addAll((Collection) pendingBatches);
87 + return set;
68 } 88 }
69 89
70 @Override 90 @Override
......