import java.util.concurrent.Future;
import java.util.concurrent.Semaphore;
import java.util.concurrent.TimeUnit;
-import javax.annotation.CheckForNull;
import javax.annotation.Nonnull;
import org.opendaylight.controller.sal.binding.api.BindingAwareBroker;
import org.opendaylight.controller.sal.binding.api.RpcProviderRegistry;
import org.opendaylight.openflowplugin.api.openflow.OFPContext;
-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.handlers.DeviceInitializationPhaseHandler;
import org.opendaylight.openflowplugin.api.openflow.device.handlers.DeviceTerminationPhaseHandler;
import org.opendaylight.openflowplugin.api.openflow.lifecycle.LifecycleConductor;
+import org.opendaylight.openflowplugin.api.openflow.lifecycle.LifecycleService;
import org.opendaylight.openflowplugin.api.openflow.rpc.ItemLifeCycleSource;
import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsContext;
import org.opendaylight.openflowplugin.api.openflow.statistics.StatisticsManager;
+import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.sm.control.rev150812.ChangeStatisticsWorkModeInput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.sm.control.rev150812.GetStatisticsWorkModeOutput;
import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.openflowplugin.sm.control.rev150812.GetStatisticsWorkModeOutputBuilder;
private static final Logger LOG = LoggerFactory.getLogger(StatisticsManagerImpl.class);
private static final long DEFAULT_STATS_TIMEOUT_SEC = 50L;
+ private final ConvertorExecutor convertorExecutor;
private DeviceInitializationPhaseHandler deviceInitPhaseHandler;
private DeviceTerminationPhaseHandler deviceTerminPhaseHandler;
private StatisticsWorkMode workMode = StatisticsWorkMode.COLLECTALL;
private final Semaphore workModeGuard = new Semaphore(1, true);
- private boolean shuttingDownStatisticsPolling;
+ private boolean isStatisticsPollingEnabled;
private BindingAwareBroker.RpcRegistration<StatisticsManagerControlService> controlServiceRegistration;
private final LifecycleConductor conductor;
deviceInitPhaseHandler = handler;
}
- public StatisticsManagerImpl(@CheckForNull final RpcProviderRegistry rpcProviderRegistry,
- final boolean shuttingDownStatisticsPolling,
- final LifecycleConductor lifecycleConductor) {
+ public StatisticsManagerImpl(final RpcProviderRegistry rpcProviderRegistry,
+ final boolean isStatisticsPollingEnabled,
+ final LifecycleConductor lifecycleConductor,
+ final ConvertorExecutor convertorExecutor) {
Preconditions.checkArgument(rpcProviderRegistry != null);
+ this.convertorExecutor = convertorExecutor;
this.controlServiceRegistration = Preconditions.checkNotNull(rpcProviderRegistry.addRpcImplementation(
StatisticsManagerControlService.class, this));
- this.shuttingDownStatisticsPolling = shuttingDownStatisticsPolling;
+ this.isStatisticsPollingEnabled = isStatisticsPollingEnabled;
this.conductor = lifecycleConductor;
}
@Override
- public void onDeviceContextLevelUp(final DeviceInfo deviceInfo) throws Exception {
+ public void onDeviceContextLevelUp(final DeviceInfo deviceInfo, final LifecycleService lifecycleService) throws Exception {
- final DeviceContext deviceContext = Preconditions.checkNotNull(conductor.getDeviceContext(deviceInfo));
-
- final StatisticsContext statisticsContext = new StatisticsContextImpl(deviceInfo, shuttingDownStatisticsPolling, conductor);
+ final StatisticsContext statisticsContext = new StatisticsContextImpl(deviceInfo, isStatisticsPollingEnabled, conductor, convertorExecutor, this);
Verify.verify(contexts.putIfAbsent(deviceInfo, statisticsContext) == null, "StatisticsCtx still not closed for Node {}", deviceInfo.getNodeId());
-
- deviceInitPhaseHandler.onDeviceContextLevelUp(deviceInfo);
+ lifecycleService.setStatContext(statisticsContext);
+ deviceInitPhaseHandler.onDeviceContextLevelUp(deviceInfo, lifecycleService);
}
@VisibleForTesting
final DeviceInfo deviceInfo) {
if (!statisticsContext.isSchedulingEnabled()) {
- LOG.debug("Disabling statistics scheduling for device: {}", deviceInfo.getNodeId());
- return;
- }
-
- if (!deviceState.isValid()) {
- LOG.debug("Session is not valid for device: {}", deviceInfo.getNodeId());
- return;
- }
-
- if (!deviceState.isStatisticsPollingEnabled()) {
- LOG.debug("Statistics polling is currently disabled for device: {}", deviceInfo.getNodeId());
- scheduleNextPolling(deviceState, deviceInfo, statisticsContext, timeCounter);
+ LOG.debug("Disabled statistics scheduling for device: {}", deviceInfo.getNodeId().getValue());
return;
}
LOG.trace("Statistics gathering for single node was not successful.. ", throwable);
calculateTimerDelay(timeCounter);
if (throwable instanceof CancellationException) {
- /** This often happens when something wrong with akka or DS, so closing connection will help to restart device **/
+ /* This often happens when something wrong with akka or DS, so closing connection will help to restart device **/
conductor.closeConnection(deviceInfo);
} else {
scheduleNextPolling(deviceState, deviceInfo, statisticsContext, timeCounter);
final StatisticsContext statisticsContext,
final TimeCounter timeCounter) {
LOG.debug("SCHEDULING NEXT STATISTICS POLLING for device: {}", deviceInfo.getNodeId());
- if (!shuttingDownStatisticsPolling) {
+ if (!isStatisticsPollingEnabled) {
final Timeout pollTimeout = conductor.newTimeout(timeout -> pollStatistics(deviceState, statisticsContext, timeCounter, deviceInfo), currentTimerDelay, TimeUnit.MILLISECONDS);
statisticsContext.setPollTimeout(pollTimeout);
}
if (workModeGuard.tryAcquire()) {
final StatisticsWorkMode targetWorkMode = input.getMode();
if (!workMode.equals(targetWorkMode)) {
- shuttingDownStatisticsPolling = StatisticsWorkMode.FULLYDISABLED.equals(targetWorkMode);
+ isStatisticsPollingEnabled = StatisticsWorkMode.FULLYDISABLED.equals(targetWorkMode);
// iterate through stats-ctx: propagate mode
for (Map.Entry<DeviceInfo, StatisticsContext> entry : contexts.entrySet()) {
switch (targetWorkMode) {
@Override
public void startScheduling(final DeviceInfo deviceInfo) {
- if (shuttingDownStatisticsPolling) {
+ if (isStatisticsPollingEnabled) {
LOG.info("Statistics are shut down for device: {}", deviceInfo.getNodeId());
return;
}