From 59502c16c59882ca1c372a4559123ac489472cb8 Mon Sep 17 00:00:00 2001 From: Sandeep Hebbani <sandeep.hebbani@bigswitch.com> Date: Sun, 9 Sep 2012 01:31:36 -0700 Subject: [PATCH] Changes to classState map to use IEntityClass name as key now. Also debug logs sprayed around some methods for more visibility if required while debugging. --- .../internal/DeviceManagerImpl.java | 111 ++++++++++++------ .../devicemanager/internal/Entity.java | 4 +- 2 files changed, 77 insertions(+), 38 deletions(-) diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java index c7661b8cd..effb5ac67 100755 --- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java +++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java @@ -140,7 +140,7 @@ IFlowReconcileListener, IInfoProvider, IHAListener { * This map contains state for each of the {@ref IEntityClass} * that exist */ - protected ConcurrentHashMap<IEntityClass, ClassState> classStateMap; + protected ConcurrentHashMap<String, ClassState> classStateMap; /** * This is the list of indices we want on a per-class basis @@ -668,7 +668,7 @@ IFlowReconcileListener, IInfoProvider, IHAListener { deviceMap = new ConcurrentHashMap<Long, Device>(); classStateMap = - new ConcurrentHashMap<IEntityClass, ClassState>(); + new ConcurrentHashMap<String, ClassState>(); apComparator = new AttachmentPointComparator(); floodlightProvider.addOFMessageListener(OFType.PACKET_IN, this); @@ -1012,6 +1012,8 @@ IFlowReconcileListener, IInfoProvider, IHAListener { * @return The {@link Device} object if found */ protected Device learnDeviceByEntity(Entity entity) { + if (logger.isDebugEnabled()) + logger.debug("In learn device by entity for - " + entity); ArrayList<Long> deleteQueue = null; LinkedList<DeviceUpdate> deviceUpdates = null; Device device = null; @@ -1029,26 +1031,45 @@ IFlowReconcileListener, IInfoProvider, IHAListener { IEntityClass entityClass = null; if (deviceKey == null) { + if (logger.isDebugEnabled()) + logger.debug("In learn dev by entity, PIndex not present for -" + + entity); // If the entity does not exist in the primary entity index, // use the entity classifier for find the classes for the // entity. Look up the entity in the returned class' // class entity index. entityClass = entityClassifier.classifyEntity(entity); + if (logger.isDebugEnabled()) + logger.debug("In learn dev by entity, class for entity -" + + entityClass); if (entityClass == null) { // could not classify entity. No device return null; } + if (logger.isDebugEnabled()) + logger.debug("In learn dev by entity, class for entity -" + + entityClass.getName()); ClassState classState = getClassState(entityClass); if (classState.classIndex != null) { deviceKey = classState.classIndex.findByEntity(entity); + if (logger.isDebugEnabled()) + logger.debug("In learn dev by entity, devicekey in class- " + + entityClass.getName() + " is -" + deviceKey); + } else { + if (logger.isDebugEnabled()) + logger.debug("In learn dev by entity, classState classIndex" + + " is NULL for class -" + entityClass); } } if (deviceKey != null) { // If the primary or secondary index contains the entity // use resulting device key to look up the device in the // device map, and use the referenced Device below. + if (logger.isDebugEnabled()) + logger.debug("In learn dev by entity, device key -" + + deviceKey.toString()); device = deviceMap.get(deviceKey); if (device == null) throw new IllegalStateException("Corrupted device index"); @@ -1185,6 +1206,9 @@ IFlowReconcileListener, IInfoProvider, IHAListener { } processUpdates(deviceUpdates); + if (logger.isDebugEnabled()) + logger.debug("In learn dev by entity, done and returning for entity -" + + entity); return device; } @@ -1323,11 +1347,11 @@ IFlowReconcileListener, IInfoProvider, IHAListener { * @return */ private ClassState getClassState(IEntityClass clazz) { - ClassState classState = classStateMap.get(clazz); + ClassState classState = classStateMap.get(clazz.getName()); if (classState != null) return classState; classState = new ClassState(clazz); - ClassState r = classStateMap.putIfAbsent(clazz, classState); + ClassState r = classStateMap.putIfAbsent(clazz.getName(), classState); if (r != null) { // concurrent add return r; @@ -1577,9 +1601,11 @@ IFlowReconcileListener, IInfoProvider, IHAListener { newPossibleAPs.add(aP); } } - for (AttachmentPoint oldAP : device.attachmentPoints) { - if (newPossibleAPs.contains(oldAP)) { - newAPs.add(oldAP); + if (device.attachmentPoints != null) { + for (AttachmentPoint oldAP : device.attachmentPoints) { + if (newPossibleAPs.contains(oldAP)) { + newAPs.add(oldAP); + } } } if (newAPs.isEmpty()) @@ -1647,6 +1673,11 @@ IFlowReconcileListener, IInfoProvider, IHAListener { protected boolean reclassifyDevice(Device device) { // first classify all entities of this device + if (device == null) { + logger.debug("In reclassify for null device"); + return false; + } + logger.debug("In reclassify for device - " + device.toString()); LinkedList<DeviceUpdate> deviceUpdates = new LinkedList<DeviceUpdate>(); @@ -1655,66 +1686,74 @@ IFlowReconcileListener, IInfoProvider, IHAListener { for (Entity entity : device.getEntities()) { IEntityClass entityClass = this.entityClassifier.classifyEntity(entity); - if (entityClass == null && device.getEntityClass() == null) { - entitiesRetained.add(entity); + if (entityClass == null || device.getEntityClass() == null) { + if (logger.isDebugEnabled()) + logger.debug("In reclassify, to remove entity - " + entity); + entitiesRemoved.add(entity); continue; } - if (entityClass != null && device.getEntityClass() != null) { - if (entityClass.getName(). - equals(device.getEntityClass().getName())) { - entitiesRetained.add(entity); - } else { - entitiesRemoved.add(entity); - } + if (entityClass.getName(). + equals(device.getEntityClass().getName())) { + if (logger.isDebugEnabled()) + logger.debug("In reclassify, to retain entity - " + entity); + entitiesRetained.add(entity); continue; } + if (logger.isDebugEnabled()) + logger.debug("In reclassify, to remove entity - " + entity); entitiesRemoved.add(entity); } if (entitiesRemoved.isEmpty()) { // no change in classification, so NOP + if (logger.isDebugEnabled()) + logger.debug("In reclassify NOP for device - " + device.toString()); return false; } for (Entity entity : entitiesRemoved) { // remove this entity from this device + if (logger.isDebugEnabled()) + logger.debug("In reclassify, remove entity - " + entity); this.removeEntity(entity, device.getEntityClass(), device.getDeviceKey(), entitiesRetained); Device newDevice = this.learnDeviceByEntity(entity); - if (newDevice != null) - deviceUpdates.add(new DeviceUpdate(newDevice, - DeviceUpdate.Change.ADD, - null)); - + if (newDevice == null) { + if (logger.isDebugEnabled()) + logger.info("In reclassify, learn device by entity failed for " + + entity); + } } if (entitiesRetained.isEmpty()) { - this.deleteDevice(device); - - deviceUpdates.add(new DeviceUpdate(device, - DeviceUpdate.Change.DELETE, null - )); + if (logger.isDebugEnabled()) + logger.debug("In reclassify, delete device - " + device.toString()); + if (!deviceMap.remove(device.getDeviceKey(), device)) { + if (logger.isDebugEnabled()) + logger.info("device map does not have this device -" + + device.toString()); + } else { + deviceUpdates.add(new DeviceUpdate(device, + DeviceUpdate.Change.DELETE, null)); + } } else { EnumSet<DeviceField> changedFields = EnumSet.noneOf(DeviceField.class); Device modDevice = null; modDevice = allocateDevice(device, entitiesRetained); // Add the new device to the primary map with a simple put - deviceMap.put(device.getDeviceKey(), modDevice); - - // update indices - while (true) { - if (updateIndices(modDevice, device.getDeviceKey())) { - break; - } - // TODO - } + if (deviceMap.replace(device.getDeviceKey(), device, modDevice) == + false) + if (logger.isDebugEnabled()) + logger.debug("In reclassify, failed to replace device map with" + + " mod device for old device - " + device.toString()); for (Entity entity : entitiesRemoved) { EnumSet<DeviceField> changes = findChangedFields(modDevice, entity); for (DeviceField change : changes) { - logger.debug("change - " + change); + if (logger.isDebugEnabled()) + logger.debug("change - " + change); } changedFields.addAll(changes); } diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/Entity.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/Entity.java index 5904a6108..36c5471fb 100644 --- a/src/main/java/net/floodlightcontroller/devicemanager/internal/Entity.java +++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/Entity.java @@ -228,9 +228,9 @@ public class Entity implements Comparable<Entity> { builder.append(", switchPort="); builder.append(switchPort); builder.append(", lastSeenTimestamp="); - builder.append(lastSeenTimestamp.getTime()); + builder.append(lastSeenTimestamp == null? "null" : lastSeenTimestamp.getTime()); builder.append(", activeSince="); - builder.append(activeSince.getTime()); + builder.append(activeSince == null? "null" : activeSince.getTime()); builder.append("]"); return builder.toString(); } -- GitLab