X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?p=controller.git;a=blobdiff_plain;f=opendaylight%2Fprotocol_plugins%2Fopenflow%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fcontroller%2Fprotocol_plugin%2Fopenflow%2Finternal%2FOFStatisticsManager.java;h=e5883d671740e1f0950b4264a2558d65d4ce4228;hp=3ab38cc41f6db686b273864801c238f3cb36eb11;hb=af3eaa839bf6f6c86495b24d2174eeb6624501c0;hpb=0d1d688ac55acc55c3909c52c2cdb940cfb3764f diff --git a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/OFStatisticsManager.java b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/OFStatisticsManager.java index 3ab38cc41f..e5883d6717 100644 --- a/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/OFStatisticsManager.java +++ b/opendaylight/protocol_plugins/openflow/src/main/java/org/opendaylight/controller/protocol_plugin/openflow/internal/OFStatisticsManager.java @@ -63,12 +63,11 @@ import org.slf4j.Logger; import org.slf4j.LoggerFactory; /** - * It periodically polls the different OF statistics from the OF switches and - * caches them for quick retrieval for the above layers' modules It also - * provides an API to directly query the switch about the statistics + * Periodically polls the different OF statistics from the OF switches, caches + * them, and publishes results towards SAL. It also provides an API to directly + * query the switch for any specific statistics. */ -public class OFStatisticsManager implements IOFStatisticsManager, -IInventoryShimExternalListener, CommandProvider { +public class OFStatisticsManager implements IOFStatisticsManager, IInventoryShimExternalListener, CommandProvider { private static final Logger log = LoggerFactory.getLogger(OFStatisticsManager.class); private static final int INITIAL_SIZE = 64; private static final long FLOW_STATS_PERIOD = 10000; @@ -87,7 +86,6 @@ IInventoryShimExternalListener, CommandProvider { private ConcurrentMap> descStatistics; private ConcurrentMap> portStatistics; private ConcurrentMap> tableStatistics; - private List dummyList; private ConcurrentMap statisticsTimerTicks; protected BlockingQueue pendingStatsRequests; protected BlockingQueue switchPortStatsUpdated; @@ -192,7 +190,6 @@ IInventoryShimExternalListener, CommandProvider { descStatistics = new ConcurrentHashMap>(); portStatistics = new ConcurrentHashMap>(); tableStatistics = new ConcurrentHashMap>(); - dummyList = new ArrayList(1); pendingStatsRequests = new LinkedBlockingQueue(getStatsQueueSize()); statisticsTimerTicks = new ConcurrentHashMap(INITIAL_SIZE); switchPortStatsUpdated = new LinkedBlockingQueue(INITIAL_SIZE); @@ -434,7 +431,7 @@ IInventoryShimExternalListener, CommandProvider { } private void printInfoMessage(String type, StatsRequest request) { - log.info("{} stats request not inserted for switch: {}. Queue size: {}. Collector state: {}.", + log.trace("{} stats request not inserted for switch: {}. Queue size: {}. Collector state: {}.", new Object[] {type, HexString.toHexString(request.switchId), pendingStatsRequests.size(), statisticsCollector.getState().toString() }); } @@ -523,7 +520,7 @@ IInventoryShimExternalListener, CommandProvider { List values = this.fetchStatisticsFromSwitch(switchId, statType, null); // If got a valid response update local cache and notify listeners - if (values != null && !values.isEmpty()) { + if (!values.isEmpty()) { switch (statType) { case FLOW: case VENDOR: @@ -590,7 +587,7 @@ IInventoryShimExternalListener, CommandProvider { @SuppressWarnings("unchecked") private List fetchStatisticsFromSwitch(Long switchId, OFStatisticsType statsType, Object target) { - List values = null; + List values = Collections.emptyList(); String type = null; ISwitch sw = controller.getSwitch(switchId); @@ -609,7 +606,7 @@ IInventoryShimExternalListener, CommandProvider { // Malformed request log.warn("Invalid target type for Flow stats request: {}", target.getClass()); - return null; + return Collections.emptyList(); } else { // Specific flow request match = (OFMatch) target; @@ -650,7 +647,7 @@ IInventoryShimExternalListener, CommandProvider { // Malformed request log.warn("Invalid target type for Port stats request: {}", target.getClass()); - return null; + return Collections.emptyList(); } else { // Specific port request targetPort = (Short) target; @@ -677,7 +674,7 @@ IInventoryShimExternalListener, CommandProvider { // Malformed request log.warn("Invalid table id for table stats request: {}", target.getClass()); - return null; + return Collections.emptyList(); } byte targetTable = (Byte) target; OFTableStatistics specificReq = new OFTableStatistics(); @@ -720,7 +717,7 @@ IInventoryShimExternalListener, CommandProvider { * Check on emptiness as interference between add and get is still * possible on the inner list (the concurrentMap entry's value) */ - return (list == null || list.isEmpty()) ? this.dummyList + return (list == null || list.isEmpty()) ? Collections.emptyList() : (list.get(0) instanceof OFVendorStatistics) ? this .v6StatsListToOFStatsList(list) : list; } @@ -734,7 +731,7 @@ IInventoryShimExternalListener, CommandProvider { * possible on the inner list (the concurrentMap entry's value) */ if (statsList == null || statsList.isEmpty()) { - return this.dummyList; + return Collections.emptyList(); } if (statsList.get(0) instanceof OFVendorStatistics) { @@ -751,7 +748,7 @@ IInventoryShimExternalListener, CommandProvider { for (OFStatistics stats : targetList) { V6StatsReply v6Stats = (V6StatsReply) stats; V6Match v6Match = v6Stats.getMatch(); - if (v6Stats.getPriority() == priority && v6Match.equals(targetMatch)) { + if (v6Stats.getPriority() == priority && targetMatch.equals(v6Match)) { List list = new ArrayList(); list.add(stats); return list; @@ -760,29 +757,29 @@ IInventoryShimExternalListener, CommandProvider { } else { for (OFStatistics stats : statsList) { OFFlowStatisticsReply flowStats = (OFFlowStatisticsReply) stats; - if (flowStats.getPriority() == priority && flowStats.getMatch().equals(ofMatch)) { + if (flowStats.getPriority() == priority && ofMatch.equals(flowStats.getMatch())) { List list = new ArrayList(); list.add(stats); return list; } } } - return this.dummyList; + return Collections.emptyList(); } /* * Converts the v6 vendor statistics to the OFStatistics */ - private List v6StatsListToOFStatsList( - List statistics) { + private List v6StatsListToOFStatsList(List statistics) { + if (statistics == null || statistics.isEmpty()) { + return Collections.emptyList(); + } List v6statistics = new ArrayList(); - if (statistics != null && !statistics.isEmpty()) { - for (OFStatistics stats : statistics) { - if (stats instanceof OFVendorStatistics) { - List r = getV6ReplyStatistics((OFVendorStatistics) stats); - if (r != null) { - v6statistics.addAll(r); - } + for (OFStatistics stats : statistics) { + if (stats instanceof OFVendorStatistics) { + List r = getV6ReplyStatistics((OFVendorStatistics) stats); + if (r != null) { + v6statistics.addAll(r); } } } @@ -793,8 +790,10 @@ IInventoryShimExternalListener, CommandProvider { OFVendorStatistics stat) { int length = stat.getLength(); List results = new ArrayList(); - if (length < 12) - return null; // Nicira Hdr is 12 bytes. We need atleast that much + if (length < 12) { + // Nicira Hdr is 12 bytes. We need at least that much + return Collections.emptyList(); + } ByteBuffer data = ByteBuffer.allocate(length); stat.writeTo(data); data.rewind(); @@ -806,7 +805,7 @@ IInventoryShimExternalListener, CommandProvider { int vendor = data.getInt(); // first 4 bytes is vendor id. if (vendor != V6StatsRequest.NICIRA_VENDOR_ID) { log.warn("Unexpected vendor id: 0x{}", Integer.toHexString(vendor)); - return null; + return Collections.emptyList(); } else { // go ahead by 8 bytes which is 8 bytes of 0 data.getLong(); // should be all 0's @@ -819,12 +818,14 @@ IInventoryShimExternalListener, CommandProvider { while (length > 0) { v6statsreply = new V6StatsReply(); min_len = v6statsreply.getLength(); - if (length < v6statsreply.getLength()) + if (length < v6statsreply.getLength()) { break; + } v6statsreply.setActionFactory(stat.getActionFactory()); v6statsreply.readFrom(data); - if (v6statsreply.getLength() < min_len) + if (v6statsreply.getLength() < min_len) { break; + } v6statsreply.setVendorId(vendor); log.trace("V6StatsReply: {}", v6statsreply); length -= v6statsreply.getLength(); @@ -846,17 +847,16 @@ IInventoryShimExternalListener, CommandProvider { } } - List list = this.fetchStatisticsFromSwitch(switchId, statType, - target); + List list = this.fetchStatisticsFromSwitch(switchId, statType, target); - return (list == null) ? null : - (statType == OFStatisticsType.VENDOR) ? v6StatsListToOFStatsList(list) : list; + return (statType == OFStatisticsType.VENDOR) ? v6StatsListToOFStatsList(list) : list; } @Override public List getOFDescStatistics(Long switchId) { - if (!descStatistics.containsKey(switchId)) - return this.dummyList; + if (!descStatistics.containsKey(switchId)) { + return Collections.emptyList(); + } return descStatistics.get(switchId); } @@ -864,7 +864,7 @@ IInventoryShimExternalListener, CommandProvider { @Override public List getOFPortStatistics(Long switchId) { if (!portStatistics.containsKey(switchId)) { - return this.dummyList; + return Collections.emptyList(); } return portStatistics.get(switchId); @@ -873,7 +873,7 @@ IInventoryShimExternalListener, CommandProvider { @Override public List getOFPortStatistics(Long switchId, short portId) { if (!portStatistics.containsKey(switchId)) { - return this.dummyList; + return Collections.emptyList(); } List list = new ArrayList(1); for (OFStatistics stats : portStatistics.get(switchId)) { @@ -888,7 +888,7 @@ IInventoryShimExternalListener, CommandProvider { @Override public List getOFTableStatistics(Long switchId) { if (!tableStatistics.containsKey(switchId)) { - return this.dummyList; + return Collections.emptyList(); } return tableStatistics.get(switchId); @@ -897,7 +897,7 @@ IInventoryShimExternalListener, CommandProvider { @Override public List getOFTableStatistics(Long switchId, Byte tableId) { if (!tableStatistics.containsKey(switchId)) { - return this.dummyList; + return Collections.emptyList(); } List list = new ArrayList(1);