Jonathan Hart
Committed by Gerrit Code Review

BgpRouter: Batch flow updates

Change-Id: If472e8e93140bce7fbb01c1a2f1847de421108c9
...@@ -69,9 +69,11 @@ import org.slf4j.LoggerFactory; ...@@ -69,9 +69,11 @@ import org.slf4j.LoggerFactory;
69 69
70 import java.util.Collection; 70 import java.util.Collection;
71 import java.util.Collections; 71 import java.util.Collections;
72 +import java.util.HashMap;
72 import java.util.HashSet; 73 import java.util.HashSet;
73 import java.util.Map; 74 import java.util.Map;
74 import java.util.Set; 75 import java.util.Set;
76 +import java.util.stream.Collectors;
75 77
76 /** 78 /**
77 * BgpRouter component. 79 * BgpRouter component.
...@@ -189,6 +191,8 @@ public class BgpRouter { ...@@ -189,6 +191,8 @@ public class BgpRouter {
189 } 191 }
190 192
191 private void updateFibEntry(Collection<FibUpdate> updates) { 193 private void updateFibEntry(Collection<FibUpdate> updates) {
194 + Map<FibEntry, Group> toInstall = new HashMap<>(updates.size());
195 +
192 for (FibUpdate update : updates) { 196 for (FibUpdate update : updates) {
193 FibEntry entry = update.entry(); 197 FibEntry entry = update.entry();
194 198
...@@ -206,17 +210,30 @@ public class BgpRouter { ...@@ -206,17 +210,30 @@ public class BgpRouter {
206 } 210 }
207 } 211 }
208 212
209 - installFlow(update.entry(), group); 213 + toInstall.put(update.entry(), group);
210 } 214 }
215 +
216 + installFlows(toInstall);
211 } 217 }
212 218
213 - private void installFlow(FibEntry entry, Group group) { 219 + private void installFlows(Map<FibEntry, Group> entriesToInstall) {
214 - FlowRule flowRule = generateRibFlowRule(entry.prefix(), group); 220 + FlowRuleOperations.Builder builder = FlowRuleOperations.builder();
221 +
222 + for (Map.Entry<FibEntry, Group> entry : entriesToInstall.entrySet()) {
223 + FibEntry fibEntry = entry.getKey();
224 + Group group = entry.getValue();
225 +
226 + FlowRule flowRule = generateRibFlowRule(fibEntry.prefix(), group);
227 +
228 + builder.add(flowRule);
229 + }
215 230
216 - flowService.applyFlowRules(flowRule); 231 + flowService.apply(builder.build());
217 } 232 }
218 233
219 private synchronized void deleteFibEntry(Collection<FibUpdate> withdraws) { 234 private synchronized void deleteFibEntry(Collection<FibUpdate> withdraws) {
235 + FlowRuleOperations.Builder builder = FlowRuleOperations.builder();
236 +
220 for (FibUpdate update : withdraws) { 237 for (FibUpdate update : withdraws) {
221 FibEntry entry = update.entry(); 238 FibEntry entry = update.entry();
222 239
...@@ -228,8 +245,10 @@ public class BgpRouter { ...@@ -228,8 +245,10 @@ public class BgpRouter {
228 245
229 FlowRule flowRule = generateRibFlowRule(entry.prefix(), group); 246 FlowRule flowRule = generateRibFlowRule(entry.prefix(), group);
230 247
231 - flowService.removeFlowRules(flowRule); 248 + builder.remove(flowRule);
232 } 249 }
250 +
251 + flowService.apply(builder.build());
233 } 252 }
234 253
235 private FlowRule generateRibFlowRule(IpPrefix prefix, Group group) { 254 private FlowRule generateRibFlowRule(IpPrefix prefix, Group group) {
...@@ -332,7 +351,7 @@ public class BgpRouter { ...@@ -332,7 +351,7 @@ public class BgpRouter {
332 private Map<PortNumber, VlanId> portVlanPair = Maps.newHashMap(); 351 private Map<PortNumber, VlanId> portVlanPair = Maps.newHashMap();
333 352
334 public void provision(boolean install, Set<Interface> intfs) { 353 public void provision(boolean install, Set<Interface> intfs) {
335 - getIntefaceConfig(intfs); 354 + getInterfaceConfig(intfs);
336 processTableZero(install); 355 processTableZero(install);
337 processTableOne(install); 356 processTableOne(install);
338 processTableTwo(install); 357 processTableTwo(install);
...@@ -342,7 +361,7 @@ public class BgpRouter { ...@@ -342,7 +361,7 @@ public class BgpRouter {
342 processTableNine(install); 361 processTableNine(install);
343 } 362 }
344 363
345 - private void getIntefaceConfig(Set<Interface> intfs) { 364 + private void getInterfaceConfig(Set<Interface> intfs) {
346 log.info("Processing {} router interfaces", intfs.size()); 365 log.info("Processing {} router interfaces", intfs.size());
347 for (Interface intf : intfs) { 366 for (Interface intf : intfs) {
348 intfIps.addAll(intf.ipAddresses()); 367 intfIps.addAll(intf.ipAddresses());
...@@ -665,8 +684,14 @@ public class BgpRouter { ...@@ -665,8 +684,14 @@ public class BgpRouter {
665 if (event.type() == GroupEvent.Type.GROUP_ADDED || 684 if (event.type() == GroupEvent.Type.GROUP_ADDED ||
666 event.type() == GroupEvent.Type.GROUP_UPDATED) { 685 event.type() == GroupEvent.Type.GROUP_UPDATED) {
667 synchronized (pendingUpdates) { 686 synchronized (pendingUpdates) {
668 - pendingUpdates.removeAll(group.appCookie()) 687 +
669 - .forEach((entry) -> installFlow(entry, group)); 688 + Map<FibEntry, Group> entriesToInstall =
689 + pendingUpdates.removeAll(group.appCookie())
690 + .stream()
691 + .collect(Collectors
692 + .toMap(e -> e, e -> group));
693 +
694 + installFlows(entriesToInstall);
670 } 695 }
671 } 696 }
672 } 697 }
......