diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java index 459f77c942edc69b3c36a614cb30985618ef02b6..2945e83afb3dc1095eab63d3a92730af9733f4f3 100755 --- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java +++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java @@ -623,6 +623,7 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe protected static Logger log = LoggerFactory.getLogger(DeviceManagerImpl.class); + protected boolean topoChanged = false; protected Set<IDeviceManagerAware> deviceManagerAware; protected LinkedList<Update> updates; protected ReentrantReadWriteLock lock; @@ -817,6 +818,19 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe public Command processPacketInMessage(IOFSwitch sw, OFPacketIn pi, FloodlightContext cntx) { + /** + * DeviceManager's internal structure needs to be cleaned up upon + * topology change. + * Make sure it is done before processing more packetIns. + */ + while (topoChanged) { + try { + this.devMgrMaps.wait(); + } catch (InterruptedException e) { + log.error ("DeviceManagerImpl: Interrupt exception: {}", e); + } + } + Ethernet eth = IFloodlightProviderService.bcStore.get( cntx, IFloodlightProviderService.CONTEXT_PI_PAYLOAD); /** If a broadcast or multicast packetIn comes from a port that's not allowed by higher @@ -1575,7 +1589,9 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe */ @Override public void topologyChanged() { - deviceUpdateTask.reschedule(10, TimeUnit.MILLISECONDS); + // Halt packetIn processing to handle topoChange event. + topoChanged = true; + deviceUpdateTask.reschedule(1, TimeUnit.MILLISECONDS); } protected boolean isNewer(DeviceAttachmentPoint dap1, @@ -2148,6 +2164,8 @@ public class DeviceManagerImpl implements IDeviceManagerService, IOFMessageListe "Floodlight exiting"); System.exit(1); } + devMgrMaps.notify(); + topoChanged = false; } }