package org.opendaylight.openflowplugin.impl.statistics;
import com.google.common.annotations.VisibleForTesting;
+import com.google.common.base.Function;
import com.google.common.base.Preconditions;
import com.google.common.collect.ImmutableList;
import com.google.common.collect.Iterators;
import javax.annotation.concurrent.GuardedBy;
import org.opendaylight.mdsal.common.api.TransactionChainClosedException;
import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier;
+import org.opendaylight.openflowplugin.api.ConnectionException;
import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
import org.opendaylight.openflowplugin.api.openflow.device.DeviceInfo;
statisticsGatheringOnTheFlyService = new StatisticsGatheringOnTheFlyService(this, deviceContext, convertorExecutor);
itemLifeCycleListener = new ItemLifecycleListenerImpl(deviceContext);
statListForCollectingInitialization();
- setState(CONTEXT_STATE.INITIALIZATION);
+ this.state = CONTEXT_STATE.INITIALIZATION;
this.deviceInfo = deviceInfo;
this.myManager = myManager;
this.lastDataGathering = null;
public void close() {
if (CONTEXT_STATE.TERMINATION.equals(getState())) {
if (LOG.isDebugEnabled()) {
- LOG.debug("Statistics context is already in state TERMINATION.");
+ LOG.debug("StatisticsContext for node {} is already in TERMINATION state.", getDeviceInfo().getLOGValue());
}
} else {
- stopGatheringData();
- setState(CONTEXT_STATE.TERMINATION);
- schedulingEnabled = false;
+ try {
+ stopClusterServices().get();
+ } catch (Exception e) {
+ LOG.debug("Failed to close StatisticsContext for node {} with exception: ", getDeviceInfo().getLOGValue(), e);
+ }
+
+ this.state = CONTEXT_STATE.TERMINATION;
+
for (final Iterator<RequestContext<?>> iterator = Iterators.consumingIterator(requestContexts.iterator());
iterator.hasNext(); ) {
RequestContextUtil.closeRequestContextWithRpcError(iterator.next(), CONNECTION_CLOSED);
}
+
if (null != pollTimeout && !pollTimeout.isExpired()) {
pollTimeout.cancel();
}
final String errMsg = String.format("Device connection is closed for Node : %s.",
getDeviceInfo().getNodeId());
LOG.debug(errMsg);
- resultFuture.setException(new IllegalStateException(errMsg));
+ resultFuture.setException(new ConnectionException(errMsg));
return;
}
if ( ! iterator.hasNext()) {
return this.state;
}
- @Override
- public void setState(CONTEXT_STATE state) {
- this.state = state;
- }
-
@Override
public ServiceGroupIdentifier getServiceIdentifier() {
return this.deviceInfo.getServiceIdentifier();
}
@Override
- public ListenableFuture<Void> stopClusterServices(boolean deviceDisconnected) {
- stopGatheringData();
- myManager.stopScheduling(deviceInfo);
- return Futures.immediateFuture(null);
+ public ListenableFuture<Void> stopClusterServices() {
+ if (CONTEXT_STATE.TERMINATION.equals(getState())) {
+ return Futures.immediateCancelledFuture();
+ }
+
+ return Futures.transform(Futures.immediateFuture(null), new Function<Object, Void>() {
+ @Nullable
+ @Override
+ public Void apply(@Nullable Object input) {
+ schedulingEnabled = false;
+ stopGatheringData();
+ return null;
+ }
+ });
}
@Override
if (LOG.isDebugEnabled()) {
LOG.debug("Stop the running statistics gathering for node {}", this.deviceInfo.getLOGValue());
}
- this.lastDataGathering.cancel(true);
+
+ lastDataGathering.cancel(true);
}
}
@Override
public boolean onContextInstantiateService(final ConnectionContext connectionContext) {
-
if (connectionContext.getConnectionState().equals(ConnectionContext.CONNECTION_STATE.RIP)) {
LOG.warn("Connection on device {} was interrupted, will stop starting master services.", deviceInfo.getLOGValue());
return false;