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 <avishnoi@in.ibm.com>
}
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<I> 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();
return false;
return true;
}
+
+ @Override
+ public String toString() {
+ return "FlowStatsEntry [tableId=" + tableId + ", flow=" + flow + "]";
+ }
}
}
return flowCookieMap;
}
+
+ @Override
+ protected FlowStatsEntry createInvariantKey(final FlowStatsEntry item) {
+ FlowBuilder newFlow = new FlowBuilder();
+ newFlow.setId(item.getFlow().getId());
+ newFlow.setKey(item.getFlow().getKey());
+ newFlow.fieldsFrom(item.getFlow());
+ return new FlowStatsEntry(item.getTableId(),newFlow.build());
+ }
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.GetFlowTablesStatisticsInputBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.OpendaylightFlowTableStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.and.statistics.map.FlowTableAndStatisticsMapBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.statistics.FlowTableStatistics;
import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.table.statistics.rev131215.flow.table.statistics.FlowTableStatisticsBuilder;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
requestHelper(flowTableStatsService.getFlowTablesStatistics(input.build()));
}
}
+
+ @Override
+ protected FlowTableAndStatisticsMap createInvariantKey(FlowTableAndStatisticsMap item) {
+ FlowTableAndStatisticsMapBuilder flowTableAndStatisticsMapBuilder = new FlowTableAndStatisticsMapBuilder();
+ flowTableAndStatisticsMapBuilder.setTableId(item.getTableId());
+ flowTableAndStatisticsMapBuilder.setKey(item.getKey());
+ return flowTableAndStatisticsMapBuilder.build();
+ }
}
super.start(dbs);
}
+
+ @Override
+ protected GroupDescStats createInvariantKey(GroupDescStats item) {
+ // No invariant data exist in the group description stats.
+ return item;
+ }
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.OpendaylightGroupStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.statistics.rev131111.group.statistics.GroupStatisticsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.group.statistics.reply.GroupStatsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.Group;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.group.types.rev131018.groups.GroupKey;
super.start(dbs);
}
+
+ @Override
+ protected GroupStats createInvariantKey(GroupStats item) {
+ GroupStatsBuilder groupStatsBuilder = new GroupStatsBuilder();
+ groupStatsBuilder.setKey(item.getKey());
+ groupStatsBuilder.setGroupId(item.getGroupId());
+ return groupStatsBuilder.build();
+ }
}
super.start(dbs);
}
+
+ @Override
+ protected MeterConfigStats createInvariantKey(MeterConfigStats item) {
+ // No invariant data exist in the meter config stats.
+ return item;
+ }
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.OpendaylightMeterStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.statistics.rev131111.nodes.node.meter.MeterStatisticsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStats;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.meter.types.rev130918.meter.statistics.reply.MeterStatsBuilder;
import org.opendaylight.yangtools.yang.binding.DataObject;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
super.start(dbs);
}
+
+ @Override
+ protected MeterStats createInvariantKey(MeterStats item) {
+ MeterStatsBuilder meterStatsBuilder = new MeterStatsBuilder();
+ meterStatsBuilder.setKey(item.getKey());
+ meterStatsBuilder.setMeterId(item.getMeterId());
+ return meterStatsBuilder.build();
+ }
}
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.OpendaylightPortStatisticsService;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.flow.capable.node.connector.statistics.FlowCapableNodeConnectorStatisticsBuilder;
import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMap;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.port.statistics.rev131214.node.connector.statistics.and.port.number.map.NodeConnectorStatisticsAndPortNumberMapBuilder;
import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
import org.slf4j.Logger;
import org.slf4j.LoggerFactory;
requestHelper(portStatsService.getAllNodeConnectorsStatistics(input.build()));
}
}
+
+ @Override
+ protected NodeConnectorStatisticsAndPortNumberMap createInvariantKey(NodeConnectorStatisticsAndPortNumberMap item) {
+ NodeConnectorStatisticsAndPortNumberMapBuilder ncStatsBuilder = new NodeConnectorStatisticsAndPortNumberMapBuilder();
+ ncStatsBuilder.setNodeConnectorId(item.getNodeConnectorId());
+ ncStatsBuilder.setKey(item.getKey());
+ return ncStatsBuilder.build();
+ }
}
super.start(dbs);
}
+
+ @Override
+ protected QueueStatsEntry createInvariantKey(QueueStatsEntry item) {
+ // No invariant data exist in the group description stats.
+ return item;
+ }
}