BUG-3580: statistics teardown improvement 11/22211/1
authorMartin Bobak <mbobak@cisco.com>
Thu, 4 Jun 2015 14:03:34 +0000 (16:03 +0200)
committermichal rehak <mirehak@cisco.com>
Tue, 9 Jun 2015 15:29:16 +0000 (15:29 +0000)
 - statistics context cancels next scheduled statistics poll

Change-Id: I3a4c1fb63d32f8ecc660da38455284bb142a62c6
Signed-off-by: Martin Bobak <mbobak@cisco.com>
(cherry picked from commit c8b1875c9f8dcb4f5a4db29b33285990abb1149b)

openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/statistics/StatisticsContext.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsContextImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImpl.java

index a9f818259176b16a0b93bcba3f6c4babd402e68a..29f775f12894a396a742a23148875b2d70816326 100644 (file)
@@ -9,6 +9,7 @@
 package org.opendaylight.openflowplugin.api.openflow.statistics;
 
 import com.google.common.util.concurrent.ListenableFuture;
+import io.netty.util.Timeout;
 import org.opendaylight.openflowplugin.api.openflow.device.RequestContextStack;
 
 /**
@@ -18,4 +19,8 @@ public interface StatisticsContext extends RequestContextStack, AutoCloseable {
 
     ListenableFuture<Boolean> gatherDynamicData();
 
+    /**
+     * @param pollTimeout handle to nearest scheduled statistics poll
+     */
+    void setPollTimeout(Timeout pollTimeout);
 }
index b831668fba6200ab1a7c55cdc2157b9fecc03abf..f54ef5480f5c568d68b98b927a7de5576dc3b644 100644 (file)
@@ -14,6 +14,7 @@ import com.google.common.util.concurrent.FutureCallback;
 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;
@@ -48,6 +49,7 @@ public class StatisticsContextImpl implements StatisticsContext {
 
     private final StatisticsGatheringService statisticsGatheringService;
     private final StatisticsGatheringOnTheFlyService statisticsGatheringOnTheFlyService;
+    private Timeout pollTimeout;
 
     public StatisticsContextImpl(@CheckForNull final DeviceContext deviceContext) {
         this.deviceContext = Preconditions.checkNotNull(deviceContext);
@@ -133,6 +135,14 @@ public class StatisticsContextImpl implements StatisticsContext {
         for (final RequestContext<?> requestContext : requestContexts) {
             RequestContextUtil.closeRequestContextWithRpcError(requestContext, CONNECTION_CLOSED);
         }
+        if (null != pollTimeout && !pollTimeout.isExpired()) {
+            pollTimeout.cancel();
+        }
+    }
+
+    @Override
+    public void setPollTimeout(Timeout pollTimeout) {
+        this.pollTimeout = pollTimeout;
     }
 
     void statChainFuture(final Iterator<MultipartType> iterator, final SettableFuture<Boolean> resultFuture) {
index 9ab662d529b5df1cd60d9f4dce2558d643c25a74..20ff898d378b0af9fcf9d709545fd002254f5dce 100644 (file)
@@ -37,7 +37,6 @@ public class StatisticsManagerImpl implements StatisticsManager {
 
     private final ConcurrentHashMap<DeviceContext, StatisticsContext> contexts = new ConcurrentHashMap<>();
 
-
     private static final long basicTimerDelay = 3000;
     private static long currentTimerDelay = basicTimerDelay;
     private static long maximumTimerDelay = 900000; //wait max 15 minutes for next statistics
@@ -61,7 +60,7 @@ public class StatisticsManagerImpl implements StatisticsManager {
         Futures.addCallback(weHaveDynamicData, new FutureCallback<Boolean>() {
             @Override
             public void onSuccess(final Boolean statisticsGathered) {
-                if (statisticsGathered.booleanValue()) {
+                if (statisticsGathered) {
                     //there are some statistics on device worth gathering
                     contexts.put(deviceContext, statisticsContext);
                     final TimeCounter timeCounter = new TimeCounter();
@@ -121,12 +120,13 @@ public class StatisticsManagerImpl implements StatisticsManager {
                                      final StatisticsContext statisticsContext,
                                      final TimeCounter timeCounter) {
         if (null != hashedWheelTimer) {
-            hashedWheelTimer.newTimeout(new TimerTask() {
+            Timeout pollTimeout = hashedWheelTimer.newTimeout(new TimerTask() {
                 @Override
                 public void run(final Timeout timeout) throws Exception {
                     pollStatistics(deviceContext, statisticsContext, timeCounter);
                 }
             }, currentTimerDelay, TimeUnit.MILLISECONDS);
+            statisticsContext.setPollTimeout(pollTimeout);
         }
     }