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