Bug 5404 - He plugin: Meter stats not reported the first time switch connects to... 05/35905/1
authorAnil Vishnoi <vishnoianil@gmail.com>
Tue, 8 Mar 2016 03:31:07 +0000 (19:31 -0800)
committerAnil Vishnoi <vishnoianil@gmail.com>
Tue, 8 Mar 2016 05:35:25 +0000 (05:35 +0000)
Change-Id: I970ed9bd02fd20054d552e3a6127f9766cd8ab92
Signed-off-by: Anil Vishnoi <vishnoianil@gmail.com>
(cherry picked from commit 60fd94868c75a9d49eb968f73a1ed337a38ed727)

applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/StatPermCollector.java
applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/StatisticsManager.java
applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitGroup.java
applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitMeter.java
applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNodeRegistrationImpl.java
applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatPermCollectorImpl.java
applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatisticsManagerImpl.java

index 1f4432b5ec769d3b3aa3958cc7fc6353e7f90711..113cad97abcbe2031a84e066d8723100aa1dd1ef 100644 (file)
@@ -67,7 +67,13 @@ public interface StatPermCollector extends Runnable, AutoCloseable {
          * so we have to try get statistics for it and wait for response
          * Error or response package with results.
          */
-        METER_STATS
+        METER_STATS,
+
+        //Custom flags for meter feature stats
+        METER_FEATURE_STATS,
+
+        //Custom flags for group feature stats
+        GROUP_FEATURE_STATS
     }
 
     /**
@@ -98,6 +104,15 @@ public interface StatPermCollector extends Runnable, AutoCloseable {
      */
     boolean registerAdditionalNodeFeature(InstanceIdentifier<Node> nodeIdent, StatCapabTypes statCapab);
 
+    /**
+     * Method remove stats {@link StatCapabTypes} from Node identified by
+     * nodeIdent -&gt; InstanceIdentifier&lt;Node&gt;
+     *
+     * @param nodeIdent
+     * @return true/false if the {@link StatCapabTypes} remove successful
+     */
+    boolean unregisterNodeStats(InstanceIdentifier<Node> nodeIdent, StatCapabTypes statCapab);
+
     /**
      * Method return true only and only if {@link StatPermCollector} contain
      * valid node registration in its internal {@link Node} map.
index 640e5dd227825e5e3bcfe5d9bd4c6508d3c4e590..109920614a6552af3b46822e62e2faa6cac19754 100644 (file)
@@ -208,6 +208,16 @@ public interface StatisticsManager extends AutoCloseable, TransactionChainListen
       */
      void registerAdditionalNodeFeature(InstanceIdentifier<Node> nodeIdent, StatCapabTypes statCapab);
 
+    /**
+     * Method wraps {@link StatPermCollector}.unregisterNodeStats to provide
+     * possibility to unregister Node stats type {@link StatCapabTypes} from
+     * statistics collecting.
+     *
+     * @param nodeIdent
+     * @param statCapab
+     */
+    void unregisterNodeStats(InstanceIdentifier<Node> nodeIdent, StatCapabTypes statCapab);
+
     /**
      * Method provides access to Device RPC methods by wrapped
      * internal method. In next {@link StatRpcMsgManager} is registered all
index a274e6b16256cc72cc7de1ee9b89c53133b12bd1..71fb54f31ab608a9c23b8c43a87f62738ae358dc 100644 (file)
@@ -178,11 +178,13 @@ public class StatListenCommitGroup extends StatAbstractListenCommit<Group, Opend
                     return;
                 }
 
-                if(!nodeRegistrationManager.isFlowCapableNodeOwner(nodeId)) { return; }
-
                 final InstanceIdentifier<Node> nodeIdent = InstanceIdentifier
                         .create(Nodes.class).child(Node.class, new NodeKey(nodeId));
 
+                manager.registerAdditionalNodeFeature(nodeIdent, StatCapabTypes.GROUP_STATS);
+
+                if(!nodeRegistrationManager.isFlowCapableNodeOwner(nodeId)) { return; }
+
                 final List<? extends TransactionAware> cacheNotifs = txContainer.get().getNotifications();
                 for (final TransactionAware notif : cacheNotifs) {
                     if ( ! (notif instanceof GroupFeaturesUpdated)) {
@@ -203,7 +205,9 @@ public class StatListenCommitGroup extends StatAbstractListenCommit<Group, Opend
                     if (node.isPresent()) {
                         tx.merge(LogicalDatastoreType.OPERATIONAL, nodeGroupFeatureIdent, new NodeGroupFeaturesBuilder().build(), true);
                         tx.put(LogicalDatastoreType.OPERATIONAL, groupFeatureIdent, stats);
-                        manager.registerAdditionalNodeFeature(nodeIdent, StatCapabTypes.GROUP_STATS);
+                        manager.unregisterNodeStats(nodeIdent, StatCapabTypes.GROUP_FEATURE_STATS);
+                    } else {
+                        LOG.debug("Node {} is NOT present in the operational data store",nodeId);
                     }
                 }
             }
index 0674bc9a53ad66528322cf8bce699c312a3f8a7e..3e97bc050d77633d6b47c0e583d2a89c00e2726d 100644 (file)
@@ -31,6 +31,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.me
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionAware;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev150304.TransactionId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.NodeKey;
@@ -131,7 +132,6 @@ public class StatListenCommitMeter extends StatAbstractListenCommit<Meter, Opend
                 }
 
                 if(!nodeRegistrationManager.isFlowCapableNodeOwner(nodeId)) { return; }
-
                 /* Prepare List actual Meters and not updated Meters will be removed */
                 final List<Meter> existMeters = fNode.get().getMeter() != null
                         ? fNode.get().getMeter() : Collections.<Meter> emptyList();
@@ -177,11 +177,16 @@ public class StatListenCommitMeter extends StatAbstractListenCommit<Meter, Opend
                     return;
                 }
 
-                if(!nodeRegistrationManager.isFlowCapableNodeOwner(nodeId)) { return; }
-
                 final InstanceIdentifier<Node> nodeIdent = InstanceIdentifier
                         .create(Nodes.class).child(Node.class, new NodeKey(nodeId));
 
+                //Register meter feature irrespective of whether this instance is
+                //master instance of the device or not. In cluster mode, all instances
+                // should have knowledge if meter is supported by the device.
+                manager.registerAdditionalNodeFeature(nodeIdent, StatCapabTypes.METER_STATS);
+
+                if(!nodeRegistrationManager.isFlowCapableNodeOwner(nodeId)) { return; }
+
                 final List<? extends TransactionAware> cacheNotifs = txContainer.get().getNotifications();
                 for (final TransactionAware notif : cacheNotifs) {
                     if ( ! (notif instanceof MeterFeaturesUpdated)) {
@@ -202,7 +207,9 @@ public class StatListenCommitMeter extends StatAbstractListenCommit<Meter, Opend
                     if (node.isPresent()) {
                         tx.merge(LogicalDatastoreType.OPERATIONAL, nodeMeterFeatureIdent, new NodeMeterFeaturesBuilder().build(), true);
                         tx.put(LogicalDatastoreType.OPERATIONAL, meterFeatureIdent, stats);
-                        manager.registerAdditionalNodeFeature(nodeIdent, StatCapabTypes.METER_STATS);
+                        manager.unregisterNodeStats(nodeIdent, StatCapabTypes.METER_FEATURE_STATS);
+                    } else {
+                        LOG.debug("Node {} is NOT present in the operational data store",nodeId);
                     }
                 }
             }
index e71f3d1ecb56a415b28766336a3b80e8598d8a4a..0b91579b5edc914988b65b7970d2e5dcf0729779 100644 (file)
@@ -137,6 +137,10 @@ public class StatNodeRegistrationImpl implements StatNodeRegistration,EntityOwne
                 statCapabTypes.add(StatCapabTypes.QUEUE_STATS);
             }
         }
+
+        statCapabTypes.add(StatCapabTypes.GROUP_FEATURE_STATS);
+        statCapabTypes.add(StatCapabTypes.METER_FEATURE_STATS);
+
         maxCapTables = data.getMaxTables();
 
         final Optional<Short> maxTables = Optional.<Short> of(maxCapTables);
@@ -218,23 +222,22 @@ public class StatNodeRegistrationImpl implements StatNodeRegistration,EntityOwne
             NodeId nodeId = InstanceIdentifier.keyOf(nodeIdent).getId();
             boolean ownershipState = preConfigurationCheck(nodeId);
             setNodeOwnership(nodeId, ownershipState);
-            if(ownershipState) {
-                LOG.info("onNodeUpdated: Send group/meter feature request to the device {}",nodeIdent);
-                manager.getRpcMsgManager().getGroupFeaturesStat(nodeRef);
-                manager.getRpcMsgManager().getMeterFeaturesStat(nodeRef);
-            }
+            LOG.info("onNodeUpdated: Send group/meter feature request to the device {}",nodeIdent);
+            manager.getRpcMsgManager().getGroupFeaturesStat(nodeRef);
+            manager.getRpcMsgManager().getMeterFeaturesStat(nodeRef);
         }
     }
 
     @Override
     public boolean isFlowCapableNodeOwner(NodeId node) {
         if(this.nodeOwnershipState.containsKey(node)){
-            return this.nodeOwnershipState.get(node).booleanValue();
+            boolean state = this.nodeOwnershipState.get(node).booleanValue();
+            LOG.debug("Is Node {} owned by this instance : {}",node, state);
+            return state;
         }
         return false;
     }
 
-
     @Override
     public void ownershipChanged(EntityOwnershipChange ownershipChange) {
 
@@ -248,6 +251,7 @@ public class StatNodeRegistrationImpl implements StatNodeRegistration,EntityOwne
     }
 
     private void setNodeOwnership(NodeId node, boolean ownership) {
+        LOG.debug("Set {} ownership for Node {}",ownership?"Master":"Slave",node);
         this.nodeOwnershipState.put(node,ownership);
     }
 
index 59c128748241d6b7999d71fcbc42b78272980e69..34eae4b88799dcbb385ed9fe135db0e4763e3b0c 100644 (file)
@@ -190,6 +190,33 @@ public class StatPermCollectorImpl implements StatPermCollector {
         return true;
     }
 
+    @Override
+    public boolean unregisterNodeStats(final InstanceIdentifier<Node> ident,
+                                                 final StatCapabTypes statCapab) {
+        if (isNodeIdentValidForUse(ident)) {
+            if ( ! statNodeHolder.containsKey(ident)) {
+                return false;
+            }
+            final StatNodeInfoHolder statNode = statNodeHolder.get(ident);
+            if ( statNode.getStatMarkers().contains(statCapab)) {
+                synchronized (statNodeHolderLock) {
+                    if ( statNode.getStatMarkers().contains(statCapab)) {
+                        final List<StatCapabTypes> statCapabForEdit = new ArrayList<>(statNode.getStatMarkers());
+                        statCapabForEdit.remove(statCapab);
+                        final StatNodeInfoHolder nodeInfoHolder = new StatNodeInfoHolder(statNode.getNodeRef(),
+                                Collections.unmodifiableList(statCapabForEdit), statNode.getMaxTables());
+
+                        final Map<InstanceIdentifier<Node>, StatNodeInfoHolder> statNodes =
+                                new HashMap<>(statNodeHolder);
+                        statNodes.put(ident, nodeInfoHolder);
+                        statNodeHolder = Collections.unmodifiableMap(statNodes);
+                    }
+                }
+            }
+        }
+        return true;
+    }
+
     @Override
     public void collectNextStatistics(final TransactionId xid) {
         if (checkTransactionId(xid) && wakeMe) {
@@ -317,6 +344,14 @@ public class StatPermCollectorImpl implements StatPermCollector {
                             manager.getRpcMsgManager().getAggregateFlowStat(actualNodeRef, tableId);
                         }*/
                         break;
+                    case METER_FEATURE_STATS:
+                        LOG.trace("STAT-MANAGER-collecting METER-FEATURE-STATS for NodeRef {}", actualNodeRef);
+                        manager.getRpcMsgManager().getMeterFeaturesStat(actualNodeRef);
+                        break;
+                    case GROUP_FEATURE_STATS:
+                        LOG.trace("STAT-MANAGER-collecting GROUP-FEATURE-STATS for NodeRef {}", actualNodeRef);
+                        manager.getRpcMsgManager().getGroupFeaturesStat(actualNodeRef);
+                        break;
                     default:
                         /* Exception for programmers in implementation cycle */
                         throw new IllegalStateException("Not implemented ASK for " + statMarker);
index 7994f67837149a804e38705b068b36a217a1ede1..afca1d2ed5eeabe95a92a5bb8289146d8560a8a7 100644 (file)
@@ -347,6 +347,17 @@ public class StatisticsManagerImpl implements StatisticsManager, Runnable {
        LOG.debug("Node {} has not been extended for feature {}!", nodeIdent, statCapab);
    }
 
+    @Override
+    public void unregisterNodeStats(final InstanceIdentifier<Node> nodeIdent,
+                                              final StatCapabTypes statCapab) {
+        for (final StatPermCollector collector : statCollectors) {
+            if (collector.unregisterNodeStats(nodeIdent, statCapab)) {
+                return;
+            }
+        }
+        LOG.debug("Stats type {} is not removed from the node {}!", statCapab,nodeIdent );
+    }
+
    /* Getter internal Statistic Manager Job Classes */
    @Override
    public StatRpcMsgManager getRpcMsgManager() {