From 11c57c751eb8c0be5af54cb2a4361f262aef32cd Mon Sep 17 00:00:00 2001 From: Anil Vishnoi Date: Mon, 25 Jan 2016 23:20:58 -0800 Subject: [PATCH] Fixed following issues 1) Statistics collector to stop writing when device is not connected and rpc's are deregistered 2) Stop send default slave role 3) Disable aggregate statistics (working on better implementation) Change-Id: I3cb9e347e0cbe3f18222380c784ef4edc724b449 Signed-off-by: Anil Vishnoi (cherry picked from commit 5c3f50ee20b4899f763e42fa4d640717106dc0c0) --- .../manager/StatNodeRegistration.java | 8 +++ .../impl/StatAbstractListenCommit.java | 10 ++- .../impl/StatAbstractNotifyCommit.java | 7 ++- .../manager/impl/StatListenCommitFlow.java | 11 +++- .../manager/impl/StatListenCommitGroup.java | 14 ++++- .../manager/impl/StatListenCommitMeter.java | 13 +++- .../manager/impl/StatListenCommitQueue.java | 19 ++++-- .../impl/StatNodeRegistrationImpl.java | 62 +++++++++++++++---- .../manager/impl/StatNotifyCommitPort.java | 9 ++- .../manager/impl/StatNotifyCommitTable.java | 9 ++- .../manager/impl/StatPermCollectorImpl.java | 20 +----- .../manager/impl/StatisticsManagerImpl.java | 15 ++--- .../impl/StatAbstractListenCommitTest.java | 7 ++- .../impl/StatListenCommitFlowTest.java | 6 +- .../md/core/ConnectionConductorImpl.java | 1 - .../md/core/role/OfEntityManager.java | 4 +- .../openflow/md/util/RoleUtil.java | 4 +- 17 files changed, 160 insertions(+), 59 deletions(-) diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/StatNodeRegistration.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/StatNodeRegistration.java index 178befea06..4defa148c6 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/StatNodeRegistration.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/StatNodeRegistration.java @@ -9,6 +9,7 @@ package org.opendaylight.openflowplugin.applications.statistics.manager; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.flow.node.SwitchFeatures; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.OpendaylightInventoryListener; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -47,4 +48,11 @@ public interface StatNodeRegistration extends OpendaylightInventoryListener, Aut * @param keyIdent */ void disconnectFlowCapableNode(InstanceIdentifier keyIdent); + + /** + * Method returns if *this* instance of the stats-manager is owner of the node + * @param node Given Node + * @return true if owner, else false + */ + boolean isFlowCapableNodeOwner(NodeId node); } diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatAbstractListenCommit.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatAbstractListenCommit.java index 66f5660c7d..0b95b2b9b4 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatAbstractListenCommit.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatAbstractListenCommit.java @@ -21,7 +21,9 @@ 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.StatListeningCommiter; +import org.opendaylight.openflowplugin.applications.statistics.manager.StatNodeRegistration; import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager; +import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.DataObject; @@ -55,18 +57,21 @@ public abstract class StatAbstractListenCommit clazz) { - super(manager,nps); + final NotificationProviderService nps, final Class clazz, final StatNodeRegistration nodeRegistrationManager) { + super(manager,nps, nodeRegistrationManager); this.clazz = Preconditions.checkNotNull(clazz, "Referenced Class can not be null"); Preconditions.checkArgument(db != null, "DataBroker can not be null!"); listenerRegistration = db.registerDataChangeListener(LogicalDatastoreType.CONFIGURATION, getWildCardedRegistrationPath(), this, DataChangeScope.BASE); this.dataBroker = db; + this.nodeRegistrationManager = nodeRegistrationManager; } /** @@ -160,5 +165,6 @@ public abstract class StatAbstractListenCommit i protected final StatisticsManager manager; private ListenerRegistration notifyListenerRegistration; + protected final StatNodeRegistration nodeRegistrationManager; + public StatAbstractNotifyCommit(final StatisticsManager manager, - final NotificationProviderService nps) { + final NotificationProviderService nps, + final StatNodeRegistration nodeRegistrationManager) { Preconditions.checkArgument(nps != null, "NotificationProviderService can not be null!"); this.manager = Preconditions.checkNotNull(manager, "StatisticManager can not be null!"); notifyListenerRegistration = nps.registerNotificationListener(getStatNotificationListener()); + this.nodeRegistrationManager = nodeRegistrationManager; } @Override diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitFlow.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitFlow.java index 5fce2b9f76..63f08c79dd 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitFlow.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitFlow.java @@ -25,6 +25,7 @@ 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.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; @@ -92,8 +93,9 @@ public class StatListenCommitFlow extends StatAbstractListenCommit cacheNotifs = txContainer.get().getNotifications(); for (final TransactionAware notif : cacheNotifs) { @@ -191,6 +196,8 @@ public class StatListenCommitFlow extends StatAbstractListenCommit flowStats = new ArrayList(10); final InstanceIdentifier nodeIdent = InstanceIdentifier.create(Nodes.class) .child(Node.class, new NodeKey(nodeId)); diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitGroup.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitGroup.java index f30984ffab..a274e6b162 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitGroup.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitGroup.java @@ -18,6 +18,7 @@ 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.StatNodeRegistration; import org.opendaylight.openflowplugin.applications.statistics.manager.StatPermCollector.StatCapabTypes; import org.opendaylight.openflowplugin.applications.statistics.manager.StatRpcMsgManager.TransactionCacheContainer; import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager; @@ -76,8 +77,9 @@ public class StatListenCommitGroup extends StatAbstractListenCommit existGroups = fNode.get().getGroup() != null ? fNode.get().getGroup() : Collections. emptyList(); @@ -173,6 +178,8 @@ public class StatListenCommitGroup extends StatAbstractListenCommit nodeIdent = InstanceIdentifier .create(Nodes.class).child(Node.class, new NodeKey(nodeId)); @@ -246,6 +253,9 @@ public class StatListenCommitGroup extends StatAbstractListenCommit cacheNotifs = txContainer.get().getNotifications(); Optional notifGroup = Optional.absent(); diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitMeter.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitMeter.java index e0a8ec3267..0674bc9a53 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitMeter.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitMeter.java @@ -18,6 +18,7 @@ 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.StatNodeRegistration; import org.opendaylight.openflowplugin.applications.statistics.manager.StatPermCollector.StatCapabTypes; import org.opendaylight.openflowplugin.applications.statistics.manager.StatRpcMsgManager.TransactionCacheContainer; import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager; @@ -74,8 +75,9 @@ public class StatListenCommitMeter extends StatAbstractListenCommit existMeters = fNode.get().getMeter() != null ? fNode.get().getMeter() : Collections. emptyList(); @@ -172,6 +177,8 @@ public class StatListenCommitMeter extends StatAbstractListenCommit nodeIdent = InstanceIdentifier .create(Nodes.class).child(Node.class, new NodeKey(nodeId)); @@ -245,6 +252,8 @@ public class StatListenCommitMeter extends StatAbstractListenCommit cacheNotifs = txContainer.get().getNotifications(); Optional notifMeter = Optional.absent(); diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitQueue.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitQueue.java index af8cb213f5..db980dc1ee 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitQueue.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitQueue.java @@ -22,6 +22,7 @@ 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.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; @@ -67,8 +68,9 @@ public class StatListenCommitQueue extends StatAbstractListenCommit existConnectors = fNode.get().getNodeConnector() != null ? fNode.get().getNodeConnector() : Collections. emptyList(); final Map existQueueKeys = new HashMap<>(); for (final NodeConnector connect : existConnectors) { - final List 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 listQueues = connect.getAugmentation(FlowCapableNodeConnector.class).getQueue(); + if (listQueues != null) { + for (final Queue queue : listQueues) { + existQueueKeys.put(queue.getKey(), connect.getKey()); + } } } } diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNodeRegistrationImpl.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNodeRegistrationImpl.java index 3e650d9489..e71f3d1ecb 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNodeRegistrationImpl.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNodeRegistrationImpl.java @@ -10,9 +10,14 @@ package org.opendaylight.openflowplugin.applications.statistics.manager.impl; import com.google.common.base.Optional; import com.google.common.base.Preconditions; + +import java.math.BigInteger; import java.util.ArrayList; import java.util.Collections; import java.util.List; +import java.util.Map; +import java.util.concurrent.ConcurrentHashMap; + import org.opendaylight.controller.md.sal.binding.api.DataBroker; import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.controller.md.sal.common.api.clustering.Entity; @@ -42,6 +47,9 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpd import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node; import org.opendaylight.yangtools.concepts.ListenerRegistration; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; +import org.opendaylight.yangtools.yang.common.QName; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier; +import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier.NodeIdentifierWithPredicates; import org.slf4j.Logger; import org.slf4j.LoggerFactory; @@ -57,10 +65,16 @@ public class StatNodeRegistrationImpl implements StatNodeRegistration,EntityOwne private static final Logger LOG = LoggerFactory.getLogger(StatNodeRegistrationImpl.class); + private static final QName ENTITY_QNAME = + org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.controller.md.sal.core.general.entity.rev150820.Entity.QNAME; + private static final QName ENTITY_NAME = QName.create(ENTITY_QNAME, "name"); + private final StatisticsManager manager; private ListenerRegistration notifListenerRegistration; //private DataBroker db; private EntityOwnershipListenerRegistration ofListenerRegistration = null; + private final Map nodeOwnershipState = new ConcurrentHashMap(); + public StatNodeRegistrationImpl(final StatisticsManager manager, final DataBroker db, final NotificationProviderService notificationService) { @@ -138,10 +152,9 @@ public class StatNodeRegistrationImpl implements StatNodeRegistration,EntityOwne manager.disconnectedNodeUnregistration(nodeIdent); } - private boolean preConfigurationCheck(final InstanceIdentifier nodeIdent) { - Preconditions.checkNotNull(nodeIdent, "Node Instance Identifier can not be null!"); - NodeId nodeId = InstanceIdentifier.keyOf(nodeIdent).getId(); - final Entity entity = new Entity("openflow", nodeId.getValue()); + private boolean preConfigurationCheck(final NodeId nodeId) { + Preconditions.checkNotNull(nodeId, "Node Instance Identifier can not be null!"); + final Entity entity = getEntity(nodeId); EntityOwnershipService ownershipService = manager.getOwnershipService(); if(ownershipService == null) { LOG.error("preConfigurationCheck: EntityOwnershipService is null"); @@ -179,6 +192,7 @@ public class StatNodeRegistrationImpl implements StatNodeRegistration,EntityOwne nodeRefIdent.firstIdentifierOf(Node.class); if (nodeIdent != null) { LOG.debug("Received onNodeRemoved for node:{} ", nodeIdent); + removeOwnership(InstanceIdentifier.keyOf(nodeIdent).getId()); disconnectFlowCapableNode(nodeIdent); } } @@ -201,7 +215,10 @@ public class StatNodeRegistrationImpl implements StatNodeRegistration,EntityOwne connectFlowCapableNode(swichFeaturesIdent, switchFeatures, nodeIdent); //Send group/meter request to get addition details not present in switch feature response. - if(preConfigurationCheck(nodeIdent)) { + 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); @@ -209,14 +226,37 @@ public class StatNodeRegistrationImpl implements StatNodeRegistration,EntityOwne } } + @Override + public boolean isFlowCapableNodeOwner(NodeId node) { + if(this.nodeOwnershipState.containsKey(node)){ + return this.nodeOwnershipState.get(node).booleanValue(); + } + return false; + } + + @Override public void ownershipChanged(EntityOwnershipChange ownershipChange) { - //I believe the only scenario we need to handle here is - // isOwner=false && hasOwner=false. E.g switch is connected to only - // one controller and that goes down, all other controller will get - // notification about ownership change with the flag set as above. - // In this scenario, topology manager should remove the node from - // operational data store, so no explict action is required here. + + YangInstanceIdentifier yId = ownershipChange.getEntity().getId(); + NodeIdentifierWithPredicates niWPredicates = (NodeIdentifierWithPredicates)yId.getLastPathArgument(); + Map keyValMap = niWPredicates.getKeyValues(); + String nodeIdStr = (String)(keyValMap.get(ENTITY_NAME)); + BigInteger dpId = new BigInteger(nodeIdStr.split(":")[1]); + NodeId nodeId = new NodeId(nodeIdStr); + setNodeOwnership(nodeId, ownershipChange.isOwner()); + } + + private void setNodeOwnership(NodeId node, boolean ownership) { + this.nodeOwnershipState.put(node,ownership); + } + + private void removeOwnership(NodeId node) { + this.nodeOwnershipState.remove(node); + } + + private Entity getEntity(NodeId nodeId) { + return new Entity("openflow", nodeId.getValue()); } } diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNotifyCommitPort.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNotifyCommitPort.java index 61a8dc03ca..77e00c9422 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNotifyCommitPort.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNotifyCommitPort.java @@ -16,6 +16,7 @@ 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.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; @@ -60,8 +61,9 @@ public class StatNotifyCommitPort extends StatAbstractNotifyCommit portStats = new ArrayList(10); final List cachedNotifs = txContainer.get().getNotifications(); diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNotifyCommitTable.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNotifyCommitTable.java index d5bd27e230..0bfeaaa4b0 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNotifyCommitTable.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatNotifyCommitTable.java @@ -16,6 +16,7 @@ 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.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; @@ -61,8 +62,9 @@ public class StatNotifyCommitTable extends StatAbstractNotifyCommit cachedNotifs = txContainer.get().getNotifications(); for (final TransactionAware notif : cachedNotifs) { if (notif instanceof FlowTableStatisticsUpdate) { diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatPermCollectorImpl.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatPermCollectorImpl.java index a740c21c4b..59c1287482 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatPermCollectorImpl.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatPermCollectorImpl.java @@ -311,11 +311,11 @@ public class StatPermCollectorImpl implements StatPermCollector { LOG.trace("STAT-MANAGER-collecting FLOW-STATS-ALL_FLOWS for NodeRef {}", actualNodeRef); setActualTransactionId(manager.getRpcMsgManager().getAllFlowsStat(actualNodeRef).get()); waitingForNotification(); - LOG.trace("STAT-MANAGER-collecting FLOW-AGGREGATE-STATS for NodeRef {}", actualNodeRef); + /*LOG.trace("STAT-MANAGER-collecting FLOW-AGGREGATE-STATS for NodeRef {}", actualNodeRef); for (short i = 0; i < maxTables; i++) { final TableId tableId = new TableId(i); manager.getRpcMsgManager().getAggregateFlowStat(actualNodeRef, tableId); - } + }*/ break; default: /* Exception for programmers in implementation cycle */ @@ -330,21 +330,7 @@ public class StatPermCollectorImpl implements StatPermCollector { } private boolean isThisInstanceNodeOwner(NodeId nodeId) { - final Entity deviceEntity = new Entity("openflow",nodeId.getValue()); - if(manager.getOwnershipService().isCandidateRegistered(deviceEntity)) { - Optional deviceOwnershipState = manager.getOwnershipService() - .getOwnershipState(deviceEntity); - - if(deviceOwnershipState.isPresent()) { - return deviceOwnershipState.get().isOwner(); - } else { - LOG.error("Node {} is connected to the controller but ownership state is missing."); - } - } else { - LOG.warn("Node {} is connected to the controller but it did not" + - "registered for the device ownership.",nodeId); - } - return false; + return manager.getNodeRegistrator().isFlowCapableNodeOwner(nodeId); } private class StatNodeInfoHolder { diff --git a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatisticsManagerImpl.java b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatisticsManagerImpl.java index dca8dfab76..7994f67837 100644 --- a/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatisticsManagerImpl.java +++ b/applications/statistics-manager/src/main/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatisticsManagerImpl.java @@ -79,7 +79,7 @@ public class StatisticsManagerImpl implements StatisticsManager, Runnable { private AtomicInteger numNodesBeingCollected = new AtomicInteger(0); - private final DataBroker dataBroker; + private final DataBroker dataBroker; private final ExecutorService statRpcMsgManagerExecutor; private final ExecutorService statDataStoreOperationServ; private EntityOwnershipService ownershipService; @@ -117,12 +117,12 @@ public class StatisticsManagerImpl implements StatisticsManager, Runnable { rpcMsgManager = new StatRpcMsgManagerImpl(this, rpcRegistry, statManagerConfig.getMaxNodesForCollector()); statCollectors = Collections.emptyList(); nodeRegistrator = new StatNodeRegistrationImpl(this, dataBroker, notifService); - flowListeningCommiter = new StatListenCommitFlow(this, dataBroker, notifService); - meterListeningCommiter = new StatListenCommitMeter(this, dataBroker, notifService); - groupListeningCommiter = new StatListenCommitGroup(this, dataBroker, notifService); - tableNotifCommiter = new StatNotifyCommitTable(this, notifService); - portNotifyCommiter = new StatNotifyCommitPort(this, notifService); - queueNotifyCommiter = new StatListenCommitQueue(this, dataBroker, notifService); + flowListeningCommiter = new StatListenCommitFlow(this, dataBroker, notifService, nodeRegistrator); + meterListeningCommiter = new StatListenCommitMeter(this, dataBroker, notifService, nodeRegistrator); + groupListeningCommiter = new StatListenCommitGroup(this, dataBroker, notifService, nodeRegistrator); + tableNotifCommiter = new StatNotifyCommitTable(this, notifService, nodeRegistrator); + portNotifyCommiter = new StatNotifyCommitPort(this, notifService, nodeRegistrator); + queueNotifyCommiter = new StatListenCommitQueue(this, dataBroker, notifService, nodeRegistrator); statRpcMsgManagerExecutor.execute(rpcMsgManager); statDataStoreOperationServ.execute(this); @@ -413,5 +413,6 @@ public class StatisticsManagerImpl implements StatisticsManager, Runnable { public EntityOwnershipService getOwnershipService() { return this.ownershipService; } + } diff --git a/applications/statistics-manager/src/test/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatAbstractListenCommitTest.java b/applications/statistics-manager/src/test/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatAbstractListenCommitTest.java index cbddfbf1cf..195dbcee75 100644 --- a/applications/statistics-manager/src/test/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatAbstractListenCommitTest.java +++ b/applications/statistics-manager/src/test/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatAbstractListenCommitTest.java @@ -30,6 +30,7 @@ import org.opendaylight.controller.md.sal.common.api.data.AsyncDataChangeEvent; 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.StatNodeRegistration; import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager; import org.opendaylight.yangtools.yang.binding.DataObject; import org.opendaylight.yangtools.yang.binding.InstanceIdentifier; @@ -54,6 +55,10 @@ public class StatAbstractListenCommitTest { @Mock private NotificationListener mockNotificationListener; + @Mock + private StatNodeRegistration statsNodeRegistration; + + @SuppressWarnings("rawtypes") private StatAbstractListenCommit statCommit; @@ -63,7 +68,7 @@ public class StatAbstractListenCommitTest { MockitoAnnotations.initMocks(this); statCommit = new StatAbstractListenCommit(mockStatisticsManager, mockDataBroker, - mockNotificationProviderService, DataObject.class) { + mockNotificationProviderService, DataObject.class, statsNodeRegistration) { @Override protected InstanceIdentifier getWildCardedRegistrationPath() { return InstanceIdentifier.create(DataObject.class); diff --git a/applications/statistics-manager/src/test/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitFlowTest.java b/applications/statistics-manager/src/test/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitFlowTest.java index 9d0a5ef574..c70130cb3c 100644 --- a/applications/statistics-manager/src/test/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitFlowTest.java +++ b/applications/statistics-manager/src/test/java/org/opendaylight/openflowplugin/applications/statistics/manager/impl/StatListenCommitFlowTest.java @@ -26,6 +26,7 @@ import org.opendaylight.controller.md.sal.binding.api.ReadOnlyTransaction; import org.opendaylight.controller.md.sal.binding.api.ReadWriteTransaction; import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType; import org.opendaylight.controller.sal.binding.api.NotificationProviderService; +import org.opendaylight.openflowplugin.applications.statistics.manager.StatNodeRegistration; import org.opendaylight.openflowplugin.applications.statistics.manager.StatisticsManager; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNode; import org.opendaylight.yang.gen.v1.urn.opendaylight.flow.inventory.rev130819.FlowCapableNodeBuilder; @@ -72,6 +73,9 @@ public class StatListenCommitFlowTest { @Mock private DataBroker mockDataBroker; + @Mock + private StatNodeRegistration statsNodeRegistration; + private StatListenCommitFlow statCommitFlow; private TableKey tableKey = new TableKey((short) 12); @@ -79,7 +83,7 @@ public class StatListenCommitFlowTest { public void init() { MockitoAnnotations.initMocks(this); statCommitFlow = new StatListenCommitFlow(mockStatisticsManager, mockDataBroker, - mockNotificationProviderService); + mockNotificationProviderService, statsNodeRegistration); } @Test diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/ConnectionConductorImpl.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/ConnectionConductorImpl.java index d6852e12d7..e9ad1e3d1b 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/ConnectionConductorImpl.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/ConnectionConductorImpl.java @@ -492,7 +492,6 @@ public class ConnectionConductorImpl implements OpenflowProtocolListener, hsPool.purge(); conductorState = CONDUCTOR_STATE.WORKING; QueueKeeperFactory.plugQueue(queueProcessor, queue); - OFSessionUtil.setRole(sessionContext); } /** diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/role/OfEntityManager.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/role/OfEntityManager.java index 5d5c6f8733..9e66ef9682 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/role/OfEntityManager.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/core/role/OfEntityManager.java @@ -9,6 +9,7 @@ package org.opendaylight.openflowplugin.openflow.md.core.role; import java.math.BigInteger; +import java.util.concurrent.LinkedBlockingQueue; import java.util.concurrent.TimeUnit; import org.opendaylight.controller.md.sal.common.api.clustering.CandidateAlreadyRegisteredException; import com.google.common.base.Optional; @@ -68,7 +69,7 @@ public class OfEntityManager implements TransactionChainListener{ entsession = new ConcurrentHashMap<>(); entRegistrationMap = new ConcurrentHashMap<>(); ThreadPoolLoggingExecutor delegate = new ThreadPoolLoggingExecutor( - 1, 5, 0, TimeUnit.MILLISECONDS, new ArrayBlockingQueue(5), "ofEntity"); + 20, 20, 0, TimeUnit.MILLISECONDS, new LinkedBlockingQueue(), "ofEntity"); pool = MoreExecutors.listeningDecorator(delegate); } @@ -215,6 +216,7 @@ public class OfEntityManager implements TransactionChainListener{ LOG.info("onDeviceOwnershipChanged: Set controller as a SLAVE controller because " + "it's not the OWNER of the {}", entity); entsession.get(entity).getOfSwitch().setEntityOwnership(newRole==OfpRole.BECOMEMASTER); + setSlaveRole(sessionContext); sendNodeAddedNotification(entsession.get(entity)); if(ownershipChange.wasOwner()) { deregisterRoutedRPCForSwitch(entsession.get(entity)); diff --git a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/RoleUtil.java b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/RoleUtil.java index 8c9b49a6dd..f335f11ebd 100644 --- a/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/RoleUtil.java +++ b/openflowplugin/src/main/java/org/opendaylight/openflowplugin/openflow/md/util/RoleUtil.java @@ -123,7 +123,9 @@ public final class RoleUtil { Futures.addCallback(JdkFutureAdapters.listenInPoolThread(roleReply), new FutureCallback>() { @Override public void onSuccess(RpcResult input) { - result.set(input.getResult().getGenerationId()); + if(input != null && input.getResult() != null) { + result.set(input.getResult().getGenerationId()); + } } @Override public void onFailure(Throwable t) { -- 2.36.6