From: Anil Vishnoi Date: Thu, 21 Aug 2014 13:30:36 +0000 (+0530) Subject: Bug 1593 - Flow Statistics manager is updating store with incorrect key X-Git-Tag: release/helium~167^2 X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=commitdiff_plain;ds=sidebyside;h=refs%2Fchanges%2F35%2F10135%2F4;p=controller.git Bug 1593 - Flow Statistics manager is updating store with incorrect key Statistics manager cache the metadata related to stats data of all the entities (flow,group, meter,queue) like when was their respective stats were updated in operational data store. If statistics manager see that stats are not being updated from last two stats fetch cycle, it consider it stale and remove it. Object that it uses as keys for hash map cache contains some variant data (counters/durations) that varies in every stats fetch cycle. It creats duplicate entry in the cache for the same entity. After two fetch cycle statistics manager find old entry stale and removes it, but in actual that's not the case. This exception is thrown when it tries to remove the stats related to next duplicate entry (which was already removed ). Fixed it by using invariant key for caching the metadata to avoid the duplication. Change-Id: Iad5823ab70938a66fd3d024dc921b74e0852c204 Signed-off-by: Anil Vishnoi --- diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractStatsTracker.java index e23ad0acdb..838aeb7dc3 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/AbstractStatsTracker.java @@ -97,14 +97,15 @@ abstract class AbstractStatsTracker { } protected abstract void cleanupSingleStat(DataModificationTransaction trans, K item); protected abstract K updateSingleStat(DataModificationTransaction trans, I item); + protected abstract K createInvariantKey(K item); public abstract void request(); public final synchronized void updateStats(List list) { final DataModificationTransaction trans = startTransaction(); - for (final I item : list) { - trackedItems.put(updateSingleStat(trans, item), requestCounter); + K key = updateSingleStat(trans, item); + trackedItems.put(createInvariantKey(key), requestCounter); } trans.commit(); diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsEntry.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsEntry.java index b5b39d94d2..c43c1ebaca 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsEntry.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsEntry.java @@ -56,4 +56,9 @@ final class FlowStatsEntry { return false; return true; } + + @Override + public String toString() { + return "FlowStatsEntry [tableId=" + tableId + ", flow=" + flow + "]"; + } } diff --git a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsTracker.java b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsTracker.java index e92d0bd625..d540f115c3 100644 --- a/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsTracker.java +++ b/opendaylight/md-sal/statistics-manager/src/main/java/org/opendaylight/controller/md/statistics/manager/FlowStatsTracker.java @@ -301,4 +301,13 @@ final class FlowStatsTracker extends AbstractListeningStatsTracker