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=e3a1ffec96cc28d26b0dcc247763aeef1c06184d;hb=4142ab5dce3021e6f6551aada26c7523cd134844;hpb=d4b6addab23cf24f20cd7969a7f1d800fda2bac1 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 e3a1ffec96..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; @@ -98,7 +96,7 @@ IInventoryShimExternalListener, CommandProvider { private ConcurrentMap switchSupportsVendorExtStats; // Per port sampled (every portStatsPeriod) transmit rate private Map> txRates; - private Set statisticsListeners; + private Set statisticsListeners = new CopyOnWriteArraySet(); /** * The object containing the latest factoredSamples tx rate samples for a @@ -192,18 +190,16 @@ 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); switchSupportsVendorExtStats = new ConcurrentHashMap(INITIAL_SIZE); txRates = new HashMap>(INITIAL_SIZE); - statisticsListeners = new CopyOnWriteArraySet(); configStatsPollIntervals(); // Initialize managed timers - statisticsTimer = new Timer(); + statisticsTimer = new Timer("Statistics Timer Ticks"); statisticsTimerTask = new TimerTask() { @Override public void run() { @@ -222,6 +218,7 @@ IInventoryShimExternalListener, CommandProvider { } catch (InterruptedException e) { log.warn("Flow Statistics Collector thread " + "interrupted", e); + return; } } } @@ -237,6 +234,7 @@ IInventoryShimExternalListener, CommandProvider { updatePortsTxRate(switchId); } catch (InterruptedException e) { log.warn("TX Rate Updater thread interrupted", e); + return; } } } @@ -250,6 +248,7 @@ IInventoryShimExternalListener, CommandProvider { * */ void destroy() { + statisticsListeners.clear(); } /** @@ -432,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() }); } @@ -521,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: @@ -588,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); @@ -607,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; @@ -648,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; @@ -675,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(); @@ -718,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; } @@ -732,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) { @@ -749,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; @@ -758,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); } } } @@ -791,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(); @@ -804,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 @@ -817,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(); @@ -844,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); } @@ -862,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); @@ -871,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)) { @@ -886,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); @@ -895,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);