From 156ff6a6f01d07dacbbc807f7b0deff41ac7ee2d Mon Sep 17 00:00:00 2001 From: Anil Vishnoi Date: Thu, 21 Aug 2014 19:00:36 +0530 Subject: [PATCH] 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 --- .../md/statistics/manager/AbstractStatsTracker.java | 5 +++-- .../controller/md/statistics/manager/FlowStatsEntry.java | 5 +++++ .../md/statistics/manager/FlowStatsTracker.java | 9 +++++++++ .../md/statistics/manager/FlowTableStatsTracker.java | 9 +++++++++ .../md/statistics/manager/GroupDescStatsTracker.java | 6 ++++++ .../md/statistics/manager/GroupStatsTracker.java | 9 +++++++++ .../md/statistics/manager/MeterConfigStatsTracker.java | 6 ++++++ .../md/statistics/manager/MeterStatsTracker.java | 9 +++++++++ .../md/statistics/manager/NodeConnectorStatsTracker.java | 9 +++++++++ .../md/statistics/manager/QueueStatsTracker.java | 6 ++++++ 10 files changed, 71 insertions(+), 2 deletions(-) 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