From 7d65e998390d6bc7d8885634e165502c5198f2ce Mon Sep 17 00:00:00 2001 From: Sai MarapaReddy Date: Wed, 4 Jan 2017 20:27:21 +0200 Subject: [PATCH] Bug7485 Make statistics poller parameters configurable. 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 --- .../api/openflow/OpenFlowPluginProvider.java | 5 +++- .../statistics/StatisticsManager.java | 4 +++ .../main/yang/openflow-provider-config.yang | 13 ++++++++++ .../main/resources/initial/openflowplugin.cfg | 7 ++++++ .../OpenFlowPluginProviderFactoryImpl.java | 10 ++++++-- .../impl/OpenFlowPluginProviderImpl.java | 25 +++++++++++++++++-- .../statistics/StatisticsManagerImpl.java | 23 ++++++++++++++--- .../statistics/StatisticsManagerImplTest.java | 5 +++- 8 files changed, 82 insertions(+), 10 deletions(-) diff --git a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/OpenFlowPluginProvider.java b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/OpenFlowPluginProvider.java index a672ddb5a7..b42c9d1a5d 100644 --- a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/OpenFlowPluginProvider.java +++ b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/OpenFlowPluginProvider.java @@ -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); } diff --git a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/statistics/StatisticsManager.java b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/statistics/StatisticsManager.java index 0cb22a5160..b886a8bae8 100644 --- a/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/statistics/StatisticsManager.java +++ b/openflowplugin-api/src/main/java/org/opendaylight/openflowplugin/api/openflow/statistics/StatisticsManager.java @@ -33,4 +33,8 @@ public interface StatisticsManager extends OFPManager { void setIsStatisticsPollingOn(boolean isStatisticsPollingOn); + void setBasicTimerDelay(final long basicTimerDelay); + + void setMaximumTimerDelay(final long maximumTimerDelay); + } diff --git a/openflowplugin-api/src/main/yang/openflow-provider-config.yang b/openflowplugin-api/src/main/yang/openflow-provider-config.yang index 96556def31..d9497d7811 100644 --- a/openflowplugin-api/src/main/yang/openflow-provider-config.yang +++ b/openflowplugin-api/src/main/yang/openflow-provider-config.yang @@ -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 diff --git a/openflowplugin-blueprint-config/src/main/resources/initial/openflowplugin.cfg b/openflowplugin-blueprint-config/src/main/resources/initial/openflowplugin.cfg index 4019a5e9e3..bcf40e7dcf 100644 --- a/openflowplugin-blueprint-config/src/main/resources/initial/openflowplugin.cfg +++ b/openflowplugin-blueprint-config/src/main/resources/initial/openflowplugin.cfg @@ -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 diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderFactoryImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderFactoryImpl.java index 2a141403a3..bc77011863 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderFactoryImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderFactoryImpl.java @@ -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; } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java index 8d0e87fed8..08ccb34e23 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/OpenFlowPluginProviderImpl.java @@ -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())); + } } diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImpl.java index 26f635d0c0..35a0d73778 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImpl.java @@ -63,9 +63,9 @@ public class StatisticsManagerImpl implements StatisticsManager, StatisticsManag private final ConcurrentMap 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; + } } diff --git a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImplTest.java b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImplTest.java index 2ae19e9632..65abd670d9 100644 --- a/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImplTest.java +++ b/openflowplugin-impl/src/test/java/org/opendaylight/openflowplugin/impl/statistics/StatisticsManagerImplTest.java @@ -182,7 +182,10 @@ public class StatisticsManagerImplTest { Matchers.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); } -- 2.36.6