Merge "Bug 6110: Fixed bugs in statistics manager due to race condition." into stable...
[openflowplugin.git] / applications / statistics-manager / src / main / java / org / opendaylight / openflowplugin / applications / statistics / manager / impl / StatListenCommitQueue.java
index 3c93dfab32f93eb062f6298941a7e871cdd88199..cdfb8ced88426d026dc5d0cb24235efcb193e2f5 100644 (file)
@@ -8,24 +8,31 @@
 
 package org.opendaylight.openflowplugin.applications.statistics.manager.impl;
 
+import com.google.common.base.Optional;
+import com.google.common.base.Preconditions;
+
+import java.util.Collection;
 import java.util.Collections;
 import java.util.HashMap;
 import java.util.List;
 import java.util.Map;
 import java.util.Map.Entry;
 
+import java.util.UUID;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
+import org.opendaylight.controller.md.sal.binding.api.DataTreeModification;
 import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.ReadFailedException;
 import org.opendaylight.controller.sal.binding.api.NotificationProviderService;
-import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager;
+import org.opendaylight.openflowplugin.applications.statistics.manager.StatNodeRegistration;
 import org.opendaylight.openflowplugin.applications.statistics.manager.StatRpcMsgManager.TransactionCacheContainer;
+import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager;
 import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager.StatDataStoreOperation;
 import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager.StatDataStoreOperation.StatsManagerOperationType;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeConnector;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionAware;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.transaction.rev131103.TransactionId;
+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.flow.types.port.rev130925.queues.Queue;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.QueueBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.types.port.rev130925.queues.QueueKey;
@@ -46,9 +53,6 @@ import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import com.google.common.base.Optional;
-import com.google.common.base.Preconditions;
-
 /**
  * statistics-manager
  * org.opendaylight.openflowplugin.applications.statistics.manager.impl
@@ -64,11 +68,12 @@ import com.google.common.base.Preconditions;
 public class StatListenCommitQueue extends StatAbstractListenCommit<Queue, OpendaylightQueueStatisticsListener>
                                         implements OpendaylightQueueStatisticsListener {
 
-    private final static Logger LOG = LoggerFactory.getLogger(StatListenCommitQueue.class);
+    private static final Logger LOG = LoggerFactory.getLogger(StatListenCommitQueue.class);
 
     public StatListenCommitQueue(final StatisticsManager manager, final DataBroker db,
-            final NotificationProviderService nps) {
-        super(manager, db, nps, Queue.class);
+            final NotificationProviderService nps,
+                                 final StatNodeRegistration nrm) {
+        super(manager, db, nps, Queue.class,nrm);
     }
 
     @Override
@@ -82,6 +87,11 @@ public class StatListenCommitQueue extends StatAbstractListenCommit<Queue, Opend
             .augmentation(FlowCapableNodeConnector.class).child(Queue.class);
     }
 
+    @Override
+    protected void processDataChange(Collection<DataTreeModification<Queue>> changes) {
+        //NO-OP
+    }
+
     @Override
     public void onQueueStatisticsUpdate(final QueueStatisticsUpdate notification) {
         final TransactionId transId = notification.getTransactionId();
@@ -121,15 +131,20 @@ public class StatListenCommitQueue extends StatAbstractListenCommit<Queue, Opend
                 if ( ! isTransactionCacheContainerValid(txContainer)) {
                     return;
                 }
+
+                if(!nodeRegistrationManager.isFlowCapableNodeOwner(nodeId)) { return; }
+
                 /* Prepare List actual Queues and not updated Queues will be removed */
                 final List<NodeConnector> existConnectors = fNode.get().getNodeConnector() != null
                         ? fNode.get().getNodeConnector() : Collections.<NodeConnector> emptyList();
                 final Map<QueueKey, NodeConnectorKey> existQueueKeys = new HashMap<>();
                 for (final NodeConnector connect : existConnectors) {
-                    final List<Queue> listQueues = connect.getAugmentation(FlowCapableNodeConnector.class).getQueue();
-                    if (listQueues != null) {
-                        for (final Queue queue : listQueues) {
-                            existQueueKeys.put(queue.getKey(), connect.getKey());
+                    if(connect.getAugmentation(FlowCapableNodeConnector.class) != null){
+                        final List<Queue> listQueues = connect.getAugmentation(FlowCapableNodeConnector.class).getQueue();
+                        if (listQueues != null) {
+                            for (final Queue queue : listQueues) {
+                                existQueueKeys.put(queue.getKey(), connect.getKey());
+                            }
                         }
                     }
                 }
@@ -140,6 +155,11 @@ public class StatListenCommitQueue extends StatAbstractListenCommit<Queue, Opend
                 /* Notification for continue collecting statistics */
                 notifyToCollectNextStatistics(nodeIdent, transId);
             }
+
+            @Override
+            public UUID generatedUUIDForNode() {
+                return manager.getGeneratedUUIDForNode(getNodeIdentifier());
+            }
         });
     }