diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java index 404e19745182ddf87deee2c899c313f46f4e85d8..dbed04cbbfa7e948e954c8c37adec8febd583ea1 100755 --- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java +++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java @@ -809,6 +809,7 @@ public class DeviceManagerImpl implements IDeviceManager, IOFMessageListener, } // Also, if this address is currently mapped to a different device, fix it. + // This should be rare, so it is OK to do update the storage from here. // // NOTE: the mapping is observed, and the decision is made based on that, outside a lock. // So the state may change by the time we get to do the map update. But that is OK since @@ -818,10 +819,12 @@ public class DeviceManagerImpl implements IDeviceManager, IOFMessageListener, (deviceByNwaddr.getDataLayerAddressAsLong() != device.getDataLayerAddressAsLong())) { updateNeworkAddressMap = true; Device dCopy = new Device(deviceByNwaddr); + DeviceNetworkAddress naOld = dCopy.getNetworkAddress(nwSrc); Map<Integer, DeviceNetworkAddress> namap = dCopy.getNetworkAddressesMap(); if (namap.containsKey(nwSrc)) namap.remove(nwSrc); dCopy.setNetworkAddresses(namap.values()); this.devMgrMaps.updateMaps(dCopy); + if (naOld !=null) removeNetworkAddressFromStorage(dCopy, naOld); } }