X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fstatistics%2FStatisticsContextImpl.java;h=64d50ebb9439e52d92d83b4eec0fad99011f1800;hb=84e9a29a401256b949527776c345153aaab2b6d1;hp=eafdc7a4aaf53c144ca115520458f5b870accd3f;hpb=f9171764796b7be953be63305c193dcf9bfd81f9;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsContextImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsContextImpl.java index eafdc7a4aa..64d50ebb94 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsContextImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsContextImpl.java @@ -9,7 +9,6 @@ package org.opendaylight.openflowplugin.impl.statistics; import com.google.common.annotations.VisibleForTesting; -import com.google.common.base.Optional; import com.google.common.base.Preconditions; import com.google.common.collect.ImmutableList; import com.google.common.collect.Iterators; @@ -18,17 +17,9 @@ import com.google.common.util.concurrent.Futures; import com.google.common.util.concurrent.ListenableFuture; import com.google.common.util.concurrent.SettableFuture; import io.netty.util.Timeout; -import java.util.ArrayList; -import java.util.Collection; -import java.util.HashSet; -import java.util.Iterator; -import java.util.List; -import javax.annotation.CheckForNull; -import javax.annotation.Nonnull; -import javax.annotation.Nullable; -import javax.annotation.concurrent.GuardedBy; import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext; import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext; +import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo; import org.opendaylight.openflowplugin.api.openflow.device.DeviceState; import org.opendaylight.openflowplugin.api.openflow.device.RequestContext; import org.opendaylight.openflowplugin.api.openflow.lifecycle.LifecycleConductor; @@ -39,12 +30,22 @@ import org.opendaylight.openflowplugin.impl.rpc.listener.ItemLifecycleListenerIm import org.opendaylight.openflowplugin.impl.services.RequestContextUtil; import org.opendaylight.openflowplugin.impl.statistics.services.dedicated.StatisticsGatheringOnTheFlyService; import org.opendaylight.openflowplugin.impl.statistics.services.dedicated.StatisticsGatheringService; -import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId; import org.opendaylight.yang.gen.v1.urn.opendaylight.openflow.common.types.rev130731.MultipartType; import org.slf4j.Logger; import org.slf4j.LoggerFactory; -public class StatisticsContextImpl implements StatisticsContext { +import javax.annotation.CheckForNull; +import javax.annotation.Nonnull; +import javax.annotation.Nullable; +import javax.annotation.concurrent.GuardedBy; +import java.util.ArrayList; +import java.util.Collection; +import java.util.HashSet; +import java.util.Iterator; +import java.util.List; +import java.util.Optional; + +class StatisticsContextImpl implements StatisticsContext { private static final Logger LOG = LoggerFactory.getLogger(StatisticsContextImpl.class); private static final String CONNECTION_CLOSED = "Connection closed."; @@ -63,12 +64,10 @@ public class StatisticsContextImpl implements StatisticsContext { private StatisticsGatheringOnTheFlyService statisticsGatheringOnTheFlyService; private Timeout pollTimeout; - private final LifecycleConductor conductor; private volatile boolean schedulingEnabled; - public StatisticsContextImpl(@CheckForNull final NodeId nodeId, final boolean shuttingDownStatisticsPolling, final LifecycleConductor lifecycleConductor) { - this.conductor = lifecycleConductor; - this.deviceContext = Preconditions.checkNotNull(conductor.getDeviceContext(nodeId)); + StatisticsContextImpl(@CheckForNull final DeviceInfo deviceInfo, final boolean shuttingDownStatisticsPolling, final LifecycleConductor lifecycleConductor) { + this.deviceContext = Preconditions.checkNotNull(lifecycleConductor.getDeviceContext(deviceInfo)); this.devState = Preconditions.checkNotNull(deviceContext.getDeviceState()); this.shuttingDownStatisticsPolling = shuttingDownStatisticsPolling; emptyFuture = Futures.immediateFuture(false); @@ -76,7 +75,6 @@ public class StatisticsContextImpl implements StatisticsContext { statisticsGatheringOnTheFlyService = new StatisticsGatheringOnTheFlyService(this, deviceContext); itemLifeCycleListener = new ItemLifecycleListenerImpl(deviceContext); statListForCollectingInitialization(); - this.deviceContext.setStatisticsContext(StatisticsContextImpl.this); } @Override @@ -107,10 +105,20 @@ public class StatisticsContextImpl implements StatisticsContext { } } + + @Override + public ListenableFuture initialGatherDynamicData() { + return gatherDynamicData(true); + } + @Override - public ListenableFuture gatherDynamicData() { + public ListenableFuture gatherDynamicData(){ + return gatherDynamicData(false); + } + + private ListenableFuture gatherDynamicData(final boolean initial) { if (shuttingDownStatisticsPolling) { - LOG.debug("Statistics for device {} is not enabled.", deviceContext.getDeviceState().getNodeId()); + LOG.debug("Statistics for device {} is not enabled.", deviceContext.getDeviceInfo().getNodeId()); return Futures.immediateFuture(Boolean.TRUE); } final ListenableFuture errorResultFuture = deviceConnectionCheck(); @@ -124,7 +132,7 @@ public class StatisticsContextImpl implements StatisticsContext { // write start timestamp to state snapshot container StatisticsGatheringUtils.markDeviceStateSnapshotStart(deviceContext); - statChainFuture(statIterator, settableStatResultFuture); + statChainFuture(statIterator, settableStatResultFuture, initial); // write end timestamp to state snapshot container Futures.addCallback(settableStatResultFuture, new FutureCallback() { @@ -141,10 +149,10 @@ public class StatisticsContextImpl implements StatisticsContext { } } - private ListenableFuture chooseStat(final MultipartType multipartType){ + private ListenableFuture chooseStat(final MultipartType multipartType, final boolean initial){ switch (multipartType) { case OFPMPFLOW: - return collectFlowStatistics(multipartType); + return collectFlowStatistics(multipartType, initial); case OFPMPTABLE: return collectTableStatistics(multipartType); case OFPMPPORTSTATS: @@ -207,31 +215,31 @@ public class StatisticsContextImpl implements StatisticsContext { @Override public Optional getPollTimeout() { - return Optional.fromNullable(pollTimeout); + return Optional.ofNullable(pollTimeout); } - private void statChainFuture(final Iterator iterator, final SettableFuture resultFuture) { + private void statChainFuture(final Iterator iterator, final SettableFuture resultFuture, final boolean initial) { if (ConnectionContext.CONNECTION_STATE.RIP.equals(deviceContext.getPrimaryConnectionContext().getConnectionState())) { final String errMsg = String.format("Device connection is closed for Node : %s.", - deviceContext.getDeviceState().getNodeId()); + deviceContext.getDeviceInfo().getNodeId()); LOG.debug(errMsg); resultFuture.setException(new IllegalStateException(errMsg)); return; } if ( ! iterator.hasNext()) { resultFuture.set(Boolean.TRUE); - LOG.debug("Stats collection successfully finished for node {}", deviceContext.getDeviceState().getNodeId()); + LOG.debug("Stats collection successfully finished for node {}", deviceContext.getDeviceInfo().getNodeId()); return; } final MultipartType nextType = iterator.next(); - LOG.debug("Stats iterating to next type for node {} of type {}", deviceContext.getDeviceState().getNodeId(), nextType); + LOG.debug("Stats iterating to next type for node {} of type {}", deviceContext.getDeviceInfo().getNodeId(), nextType); - final ListenableFuture deviceStatisticsCollectionFuture = chooseStat(nextType); + final ListenableFuture deviceStatisticsCollectionFuture = chooseStat(nextType, initial); Futures.addCallback(deviceStatisticsCollectionFuture, new FutureCallback() { @Override public void onSuccess(final Boolean result) { - statChainFuture(iterator, resultFuture); + statChainFuture(iterator, resultFuture, initial); } @Override public void onFailure(@Nonnull final Throwable t) { @@ -249,7 +257,7 @@ public class StatisticsContextImpl implements StatisticsContext { @VisibleForTesting ListenableFuture deviceConnectionCheck() { if (!ConnectionContext.CONNECTION_STATE.WORKING.equals(deviceContext.getPrimaryConnectionContext().getConnectionState())) { - ListenableFuture resultingFuture = SettableFuture.create(); + ListenableFuture resultingFuture; switch (deviceContext.getPrimaryConnectionContext().getConnectionState()) { case RIP: final String errMsg = String.format("Device connection doesn't exist anymore. Primary connection status : %s", @@ -265,44 +273,85 @@ public class StatisticsContextImpl implements StatisticsContext { return null; } - private ListenableFuture collectFlowStatistics(final MultipartType multipartType) { + //TODO: Refactor twice sending deviceContext into gatheringStatistics + private ListenableFuture collectFlowStatistics(final MultipartType multipartType, final boolean initial) { return devState.isFlowStatisticsAvailable() ? StatisticsGatheringUtils.gatherStatistics( - statisticsGatheringOnTheFlyService, deviceContext, /*MultipartType.OFPMPFLOW*/ multipartType) : emptyFuture; + statisticsGatheringOnTheFlyService, + deviceContext.getDeviceInfo(), + /*MultipartType.OFPMPFLOW*/ multipartType, + deviceContext, + deviceContext, + initial) : emptyFuture; } private ListenableFuture collectTableStatistics(final MultipartType multipartType) { return devState.isTableStatisticsAvailable() ? StatisticsGatheringUtils.gatherStatistics( - statisticsGatheringService, deviceContext, /*MultipartType.OFPMPTABLE*/ multipartType) : emptyFuture; + statisticsGatheringService, + deviceContext.getDeviceInfo(), + /*MultipartType.OFPMPTABLE*/ multipartType, + deviceContext, + deviceContext, + false) : emptyFuture; } private ListenableFuture collectPortStatistics(final MultipartType multipartType) { return devState.isPortStatisticsAvailable() ? StatisticsGatheringUtils.gatherStatistics( - statisticsGatheringService, deviceContext, /*MultipartType.OFPMPPORTSTATS*/ multipartType) : emptyFuture; + statisticsGatheringService, + deviceContext.getDeviceInfo(), + /*MultipartType.OFPMPPORTSTATS*/ multipartType, + deviceContext, + deviceContext, + false) : emptyFuture; } private ListenableFuture collectQueueStatistics(final MultipartType multipartType) { - return devState.isQueueStatisticsAvailable() ? StatisticsGatheringUtils.gatherStatistics( - statisticsGatheringService, deviceContext, /*MultipartType.OFPMPQUEUE*/ multipartType) : emptyFuture; + return !devState.isQueueStatisticsAvailable() ? emptyFuture : StatisticsGatheringUtils.gatherStatistics( + statisticsGatheringService, + deviceContext.getDeviceInfo(), + /*MultipartType.OFPMPQUEUE*/ multipartType, + deviceContext, + deviceContext, + false); } private ListenableFuture collectGroupDescStatistics(final MultipartType multipartType) { return devState.isGroupAvailable() ? StatisticsGatheringUtils.gatherStatistics( - statisticsGatheringService, deviceContext, /*MultipartType.OFPMPGROUPDESC*/ multipartType) : emptyFuture; + statisticsGatheringService, + deviceContext.getDeviceInfo(), + /*MultipartType.OFPMPGROUPDESC*/ multipartType, + deviceContext, + deviceContext, + false) : emptyFuture; } private ListenableFuture collectGroupStatistics(final MultipartType multipartType) { return devState.isGroupAvailable() ? StatisticsGatheringUtils.gatherStatistics( - statisticsGatheringService, deviceContext, /*MultipartType.OFPMPGROUP*/ multipartType) : emptyFuture; + statisticsGatheringService, + deviceContext.getDeviceInfo(), + /*MultipartType.OFPMPGROUP*/ multipartType, + deviceContext, + deviceContext, + false) : emptyFuture; } private ListenableFuture collectMeterConfigStatistics(final MultipartType multipartType) { return devState.isMetersAvailable() ? StatisticsGatheringUtils.gatherStatistics( - statisticsGatheringService, deviceContext, /*MultipartType.OFPMPMETERCONFIG*/ multipartType) : emptyFuture; + statisticsGatheringService, + deviceContext.getDeviceInfo(), + /*MultipartType.OFPMPMETERCONFIG*/ multipartType, + deviceContext, + deviceContext, + false) : emptyFuture; } private ListenableFuture collectMeterStatistics(final MultipartType multipartType) { return devState.isMetersAvailable() ? StatisticsGatheringUtils.gatherStatistics( - statisticsGatheringService, deviceContext, /*MultipartType.OFPMPMETER*/ multipartType) : emptyFuture; + statisticsGatheringService, + deviceContext.getDeviceInfo(), + /*MultipartType.OFPMPMETER*/ multipartType, + deviceContext, + deviceContext, + false) : emptyFuture; } @VisibleForTesting @@ -321,9 +370,4 @@ public class StatisticsContextImpl implements StatisticsContext { return itemLifeCycleListener; } - - @Override - public DeviceContext getDeviceContext() { - return deviceContext; - } }