Avoid Collection modification while iterating them
Change-Id: I3a1694182e232b67e907046ffd2aca64f0a76120
diff --git a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
index 9acf727..07ab8af 100644
--- a/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
+++ b/src/main/java/net/onrc/onos/ofcontroller/networkgraph/NetworkGraphImpl.java
@@ -87,6 +87,7 @@
/**
* Run the thread.
*/
+ @Override
public void run() {
Collection<EventEntry<TopologyEvent>> collection =
new LinkedList<EventEntry<TopologyEvent>>();
@@ -359,7 +360,7 @@
//PortEvent rmEvent = new PortEvent(p.getSwitch().getDpid(), p.getNumber());
// calling Discovery removePort() API to wipe from DB, etc.
//removePortEvent(rmEvent);
-
+
// We can't remove ports here because this will trigger a remove
// from the switch's port list, which we are currently iterating
// over.
@@ -398,13 +399,18 @@
}
// Prep: Remove Link and Device Attachment
+ ArrayList<DeviceEvent> deviceEvts = new ArrayList<>();
for (Device device : port.getDevices()) {
log.debug("Removing Device {} on Port {}", device, portEvt);
DeviceEvent devEvt = new DeviceEvent(device.getMacAddress());
devEvt.addAttachmentPoint(new SwitchPort(port.getSwitch().getDpid(), port.getNumber()));
+ deviceEvts.add(devEvt);
+ }
+ for (DeviceEvent devEvt : deviceEvts) {
// calling Discovery API to wipe from DB, etc.
removeDeviceEvent(devEvt);
}
+
Set<Link> links = new HashSet<>();
links.add(port.getOutgoingLink());
links.add(port.getIncomingLink());
@@ -435,15 +441,18 @@
}
// Prep: remove Device attachment on both Ports
+ ArrayList<DeviceEvent> deviceEvents = new ArrayList<>();
for (Device device : srcPort.getDevices()) {
DeviceEvent devEvt = new DeviceEvent(device.getMacAddress());
devEvt.addAttachmentPoint(new SwitchPort(srcPort.getSwitch().getDpid(), srcPort.getNumber()));
- // calling Discovery API to wipe from DB, etc.
- removeDeviceEvent(devEvt);
+ deviceEvents.add(devEvt);
}
for (Device device : dstPort.getDevices()) {
DeviceEvent devEvt = new DeviceEvent(device.getMacAddress());
devEvt.addAttachmentPoint(new SwitchPort(dstPort.getSwitch().getDpid(), dstPort.getNumber()));
+ deviceEvents.add(devEvt);
+ }
+ for (DeviceEvent devEvt : deviceEvents) {
// calling Discovery API to wipe from DB, etc.
removeDeviceEvent(devEvt);
}