Bug7485 Make statistics poller parameters configurable. 29/50329/2
authorSai MarapaReddy <sai.marapareddy@gmail.com>
Wed, 4 Jan 2017 18:27:21 +0000 (20:27 +0200)
committerSai MarapaReddy <sai.marapareddy@gmail.com>
Thu, 12 Jan 2017 01:26:03 +0000 (01:26 +0000)
Currently the the time intervals used for polling the statistics
are harcoded. (basicTimerDelay, maximumTimerDelay).
This patch helps makes parameters more configurable by defining
current default values in yang. Using BluePrint extensions user
can now configure the parameters without changing the source code.

Change-Id: Ic2d694351ee968a6f360e7a218aa17e69c5e9035
Signed-off-by: Sai Marapareddy <sai.marapareddy@gmail.com>
openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/OpenFlowPluginProvider.java
openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/statistics/StatisticsManager.java
openflowplugin-api/src/main/yang/openflow-provider-config.yang
openflowplugin-blueprint-config/src/main/resources/initial/openflowplugin.cfg
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderFactoryImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java
openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImpl.java
openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImplTest.java

index a672ddb5a7049721a2dbbc6eb2267ed3518d51c9..b42c9d1a5dc7c9ab96cda02f4013914e09c5f652 100644 (file)
@@ -14,7 +14,6 @@ import org.opendaylight.controller.md.sal.binding.api.BindingService;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
 import org.opendaylight.controller.md.sal.binding.api.NotificationPublishService;
 import org.opendaylight.controller.md.sal.binding.api.NotificationService;
-import org.opendaylight.controller.md.sal.common.api.clustering.EntityOwnershipService;
 import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
 import org.opendaylight.openflowjava.protocol.spi.connection.SwitchConnectionProvider;
@@ -80,4 +79,8 @@ public interface OpenFlowPluginProvider extends AutoCloseable, BindingService {
     void setClusteringSingletonServicesProvider(ClusterSingletonServiceProvider singletonServicesProvider);
 
     void setSkipTableFeatures(boolean skipTableFeatures);
+
+    void setBasicTimerDelay(long basicTimerDelay);
+
+    void setMaximumTimerDelay(long maximumTimerDelay);
 }
index 0cb22a5160f891ead028016059dadab12465e6ec..b886a8bae83beb3778cb86c9f92d5f57edad33e6 100644 (file)
@@ -33,4 +33,8 @@ public interface StatisticsManager extends OFPManager {
 
     void setIsStatisticsPollingOn(boolean isStatisticsPollingOn);
 
+    void setBasicTimerDelay(final long basicTimerDelay);
+
+    void setMaximumTimerDelay(final long maximumTimerDelay);
+
 }
index 96556def3124678ad99661398c9c00f28600ae39..d9497d7811b9e03f02af4b47263cec3f4f04b4de 100644 (file)
@@ -95,5 +95,18 @@ module openflow-provider-config {
             type boolean;
             default "true";
         }
+
+        leaf basic-timer-delay {
+            description "initial delay used in polling the statistics, value is in milliseconds";
+            type non-zero-uint32-type;
+            default 3000;
+        }
+
+        leaf maximum-timer-delay {
+            description "maximum timer delay is the wait time to collect next statistics
+            used in polling the statistics, value is in milliseconds";
+            type non-zero-uint32-type;
+            default 900000;
+        }
     }
 }
\ No newline at end of file
index 4019a5e9e308cdb815b5471f2871d766d33ddd4f..bcf40e7dcfa52a347e595ae46bc3ffa6cf63caa4 100644 (file)
@@ -26,3 +26,10 @@ echo-reply-timeout=2000
 #can be changed on demand
 #Turned on by default. Default value is true
 is-statistics-polling-on=true
+#Default value of basic-timer-delay is 3000
+#basic timer delay is the initial delay used in polling the statistics, value is in milliseconds
+basic-timer-delay=3000
+#Default value of maximum-timer-delay is 900000
+#maximum timer delay is the wait time to collect next statistics
+#used in polling the statistics, value is in milliseconds
+maximum-timer-delay=900000
index 2a141403a3bf4270d1faf5529531afa4602ecb3e..bc770118636e9759ac67ec2a909aef052e702b41 100644 (file)
@@ -62,6 +62,8 @@ public class OpenFlowPluginProviderFactoryImpl implements OpenFlowPluginProvider
         openflowPluginProvider.setStatisticsPollingOn(providerConfig.isIsStatisticsPollingOn());
         openflowPluginProvider.setClusteringSingletonServicesProvider(singletonServiceProvider);
         openflowPluginProvider.setSkipTableFeatures(providerConfig.isSkipTableFeatures());
+        openflowPluginProvider.setBasicTimerDelay(providerConfig.getBasicTimerDelay().getValue());
+        openflowPluginProvider.setMaximumTimerDelay(providerConfig.getMaximumTimerDelay().getValue());
 
         openflowPluginProvider.initialize();
 
@@ -74,7 +76,9 @@ public class OpenFlowPluginProviderFactoryImpl implements OpenFlowPluginProvider
                 "ThreadPoolMinThreads:{}, " +
                 "ThreadPoolMaxThreads:{}, " +
                 "ThreadPoolTimeout:{}, " +
-                "NotificationFlowRemovedOff:{}",
+                "NotificationFlowRemovedOff:{}, " +
+                "BasicTimerDelay:{}, "+
+                "MaximumTimerDelay:{} ",
                 providerConfig.isIsStatisticsPollingOn(),
                 providerConfig.isSwitchFeaturesMandatory(),
                 providerConfig.getBarrierCountLimit().getValue(),
@@ -83,7 +87,9 @@ public class OpenFlowPluginProviderFactoryImpl implements OpenFlowPluginProvider
                 providerConfig.getThreadPoolMinThreads(),
                 providerConfig.getThreadPoolMaxThreads().getValue(),
                 providerConfig.getThreadPoolTimeout(),
-                providerConfig.isEnableFlowRemovedNotification());
+                providerConfig.isEnableFlowRemovedNotification(),
+                providerConfig.getBasicTimerDelay().getValue(),
+                providerConfig.getMaximumTimerDelay().getValue());
 
         return openflowPluginProvider;
     }
index 8d0e87fed8c8946c6e7b0c71894f8fcb77029cf0..08ccb34e2399e42eb3d6044dd6dae7cee41ed52d 100644 (file)
@@ -13,7 +13,6 @@ import com.google.common.base.Preconditions;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import com.google.common.util.concurrent.ListenableFuture;
-import io.netty.util.HashedWheelTimer;
 import java.lang.management.ManagementFactory;
 import java.util.ArrayList;
 import java.util.Collection;
@@ -59,6 +58,7 @@ import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorM
 import org.opendaylight.openflowplugin.openflow.md.core.session.OFSessionUtil;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
+import io.netty.util.HashedWheelTimer;
 
 public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenFlowPluginExtensionRegistratorProvider {
 
@@ -94,6 +94,8 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF
     private boolean isStatisticsRpcEnabled;
     private boolean isFlowRemovedNotificationOn = true;
     private boolean skipTableFeatures = true;
+    private long basicTimerDelay;
+    private long maximumTimerDelay;
 
     private final ThreadPoolExecutor threadPool;
     private ClusterSingletonServiceProvider singletonServicesProvider;
@@ -186,6 +188,16 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF
             this.skipTableFeatures = skipTableFeatures;
     }
 
+    @Override
+    public void setBasicTimerDelay(long basicTimerDelay) {
+        this.basicTimerDelay = basicTimerDelay;
+    }
+
+    @Override
+    public void setMaximumTimerDelay(long maximumTimerDelay) {
+        this.maximumTimerDelay = maximumTimerDelay;
+    }
+
     @Override
     public void setSwitchFeaturesMandatory(final boolean switchFeaturesMandatory) {
         this.switchFeaturesMandatory = switchFeaturesMandatory;
@@ -242,7 +254,8 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF
         ((ExtensionConverterProviderKeeper) deviceManager).setExtensionConverterProvider(extensionConverterManager);
 
         rpcManager = new RpcManagerImpl(rpcProviderRegistry, rpcRequestsQuota, extensionConverterManager, convertorManager, notificationPublishService);
-        statisticsManager = new StatisticsManagerImpl(rpcProviderRegistry, isStatisticsPollingOn, hashedWheelTimer, convertorManager);
+        statisticsManager = new StatisticsManagerImpl(rpcProviderRegistry, isStatisticsPollingOn, hashedWheelTimer,
+                convertorManager,basicTimerDelay,maximumTimerDelay);
 
         /* Initialization Phase ordering - OFP Device Context suite */
         // CM -> DM -> SM -> RPC -> Role -> DM
@@ -306,6 +319,14 @@ public class OpenFlowPluginProviderImpl implements OpenFlowPluginProvider, OpenF
         if(statisticsManager != null && props.containsKey("is-statistics-polling-on")){
             statisticsManager.setIsStatisticsPollingOn(Boolean.valueOf(props.get("is-statistics-polling-on").toString()));
         }
+
+        if(statisticsManager != null && props.containsKey("basic-timer-delay")){
+            statisticsManager.setBasicTimerDelay(Long.valueOf(props.get("basic-timer-delay").toString()));
+        }
+
+        if(statisticsManager != null && props.containsKey("maximum-timer-delay")){
+            statisticsManager.setMaximumTimerDelay(Long.valueOf(props.get("maximum-timer-delay").toString()));
+        }
     }
 
 
index 26f635d0c0d702db6744850cd26477deed5c6396..35a0d73778b3b4ab96f40a552cfc840500cbb7ec 100644 (file)
@@ -63,9 +63,9 @@ public class StatisticsManagerImpl implements StatisticsManager, StatisticsManag
 
     private final ConcurrentMap<DeviceInfo, StatisticsContext> contexts = new ConcurrentHashMap<>();
 
-    private static final long basicTimerDelay = 3000;
-    private static long currentTimerDelay = basicTimerDelay;
-    private static final long maximumTimerDelay = 900000; //wait max 15 minutes for next statistics
+    private static long basicTimerDelay;
+    private static long currentTimerDelay;
+    private static long maximumTimerDelay; //wait time for next statistics
 
     private StatisticsWorkMode workMode = StatisticsWorkMode.COLLECTALL;
     private final Semaphore workModeGuard = new Semaphore(1, true);
@@ -82,13 +82,18 @@ public class StatisticsManagerImpl implements StatisticsManager, StatisticsManag
     public StatisticsManagerImpl(final RpcProviderRegistry rpcProviderRegistry,
                                  final boolean isStatisticsPollingOn,
                                  final HashedWheelTimer hashedWheelTimer,
-                                 final ConvertorExecutor convertorExecutor) {
+                                 final ConvertorExecutor convertorExecutor,
+                                 final long basicTimerDelay,
+                                 final long maximumTimerDelay) {
         Preconditions.checkArgument(rpcProviderRegistry != null);
            this.converterExecutor = convertorExecutor;
         this.controlServiceRegistration = Preconditions.checkNotNull(
                 rpcProviderRegistry.addRpcImplementation(StatisticsManagerControlService.class, this)
         );
         this.isStatisticsPollingOn = isStatisticsPollingOn;
+        this.basicTimerDelay = basicTimerDelay;
+        this.currentTimerDelay = basicTimerDelay;
+        this.maximumTimerDelay = maximumTimerDelay;
         this.hashedWheelTimer = hashedWheelTimer;
     }
 
@@ -343,4 +348,14 @@ public class StatisticsManagerImpl implements StatisticsManager, StatisticsManag
         contexts.remove(deviceInfo);
         LOG.debug("Statistics context removed for node {}", deviceInfo.getLOGValue());
     }
+
+    @Override
+    public void setBasicTimerDelay(final long basicTimerDelay) {
+        this.basicTimerDelay = basicTimerDelay;
+    }
+
+    @Override
+    public void setMaximumTimerDelay(final long maximumTimerDelay) {
+        this.maximumTimerDelay = maximumTimerDelay;
+    }
 }
index 2ae19e9632ed5f0f85ff9a1aca59a8b099f525d6..65abd670d9027b382a4a232ae225872b6b3f6f38 100644 (file)
@@ -182,7 +182,10 @@ public class StatisticsManagerImplTest {
                 Matchers.<StatisticsManagerControlService>any())).thenReturn(serviceControlRegistration);
 
         final ConvertorManager convertorManager = ConvertorManagerFactory.createDefaultManager();
-        statisticsManager = new StatisticsManagerImpl(rpcProviderRegistry, false, new HashedWheelTimer(), convertorManager);
+        final long basicTimerDelay = 3000L;
+        final long maximumTimerDelay = 900000L;
+        statisticsManager = new StatisticsManagerImpl(rpcProviderRegistry, false, new HashedWheelTimer(),
+                convertorManager, basicTimerDelay, maximumTimerDelay);
         statisticsManager.setDeviceInitializationPhaseHandler(deviceInitializationPhaseHandler);
     }