diff --git a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java index 384b8210176916581386be5a3d5efa6657919fd4..075e18c996e40ebbba659e1e522df58d06608759 100755 --- a/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java +++ b/src/main/java/net/floodlightcontroller/devicemanager/internal/DeviceManagerImpl.java @@ -638,7 +638,7 @@ IFlowReconcileListener, IInfoProvider, IHAListener { Runnable ecr = new Runnable() { @Override public void run() { - cleanupEntities(false); + cleanupEntities(false, null); entityCleanupTask.reschedule(ENTITY_CLEANUP_INTERVAL, TimeUnit.SECONDS); } @@ -1281,12 +1281,16 @@ IFlowReconcileListener, IInfoProvider, IHAListener { * @param reclassify if true, begin an asynchronous task to reclassify the * flushed entities */ - private void flushEntityCache (IEntityClass entityClass, - boolean reclassify) { + private void flushEntityCache (IEntityClass entityClass, boolean reclassify, + Set<String> entityClassChanged) { if (reclassify) return; // TODO if (entityClass == null) { - cleanupEntities(true); + + /* + * XXX This can be running at the same time by timer thread. + */ + cleanupEntities(true, entityClassChanged); } else { // TODO } @@ -1301,14 +1305,15 @@ IFlowReconcileListener, IInfoProvider, IHAListener { /* * Flush the entire device entity cache for now. */ - flushEntityCache(null, false); + flushEntityCache(null, false, entityClassNames); return; } /** * Clean up expired entities/devices */ - protected void cleanupEntities(boolean forceExpiry) { + protected void cleanupEntities(boolean forceCleanup, + Set<String> specificEntities) { Calendar c = Calendar.getInstance(); c.add(Calendar.MILLISECOND, -ENTITY_TIMEOUT); Date cutoff = c.getTime(); @@ -1323,14 +1328,23 @@ IFlowReconcileListener, IInfoProvider, IHAListener { while (diter.hasNext()) { Device d = diter.next(); + /* + * If we are cleaning entities for a specific set of devices, + * skip if not applicable. + */ + if (specificEntities != null && d.getEntityClass() != null && + !specificEntities.contains(d.getEntityClass().getName())) { + continue; + } + while (true) { deviceUpdates.clear(); toRemove.clear(); toKeep.clear(); for (Entity e : d.getEntities()) { - if (forceExpiry || - (e.getLastSeenTimestamp() != null && - 0 > e.getLastSeenTimestamp().compareTo(cutoff))) { + if (forceCleanup || + (e.getLastSeenTimestamp() != null && + 0 > e.getLastSeenTimestamp().compareTo(cutoff))) { // individual entity needs to be removed toRemove.add(e); } else {