X-Git-Url: https://git.opendaylight.org/gerrit/gitweb?a=blobdiff_plain;ds=sidebyside;f=openflowplugin-impl%2Fsrc%2Fmain%2Fjava%2Forg%2Fopendaylight%2Fopenflowplugin%2Fimpl%2Fconnection%2FConnectionContextImpl.java;h=e0ff00efe0424d2feb40d49fb8a5de559688e098;hb=9899c3134d7cc24e9c8d57b34d9c19b111e00e33;hp=c21a973948fc09a4a2ab0cceb2fd86834e09b534;hpb=33e363eb5cb1a0588c53e6bfd9fad28a2561318a;p=openflowplugin.git diff --git a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/connection/ConnectionContextImpl.java b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/connection/ConnectionContextImpl.java index c21a973948..e0ff00efe0 100644 --- a/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/connection/ConnectionContextImpl.java +++ b/openflowplugin-impl/src/main/java/org/opendaylight/openflowplugin/impl/connection/ConnectionContextImpl.java @@ -11,12 +11,14 @@ package org.opendaylight.openflowplugin.impl.connection; import com.google.common.base.Preconditions; import java.math.BigInteger; import java.net.InetSocketAddress; +import java.util.Objects; import java.util.concurrent.Callable; import java.util.concurrent.ExecutionException; import java.util.concurrent.Executors; import java.util.concurrent.Future; import java.util.concurrent.TimeUnit; import java.util.concurrent.TimeoutException; +import org.opendaylight.mdsal.singleton.common.api.ServiceGroupIdentifier; import org.opendaylight.openflowjava.protocol.api.connection.ConnectionAdapter; import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueue; import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandlerRegistration; @@ -71,6 +73,7 @@ public class ConnectionContextImpl implements ConnectionContext { @Override public void setOutboundQueueProvider(final OutboundQueueProvider outboundQueueProvider) { this.outboundQueueProvider = outboundQueueProvider; + ((DeviceInfoImpl)this.deviceInfo).setOutboundQueueProvider(this.outboundQueueProvider); } @Override @@ -105,35 +108,19 @@ public class ConnectionContextImpl implements ConnectionContext { @Override public void closeConnection(final boolean propagate) { - if (null == nodeId){ + if (Objects.isNull(nodeId)){ SessionStatistics.countEvent(connectionAdapter.getRemoteAddress().toString(), SessionStatistics.ConnectionStatus.CONNECTION_DISCONNECTED_BY_OFP); } else { SessionStatistics.countEvent(nodeId.toString(), SessionStatistics.ConnectionStatus.CONNECTION_DISCONNECTED_BY_OFP); } - final BigInteger datapathId = featuresReply != null ? featuresReply.getDatapathId() : BigInteger.ZERO; - LOG.debug("Actively closing connection: {}, datapathId:{}.", - connectionAdapter.getRemoteAddress(), datapathId); - connectionState = ConnectionContext.CONNECTION_STATE.RIP; - - Future future = Executors.newSingleThreadExecutor().submit(new Callable() { - @Override - public Void call() throws Exception { - unregisterOutboundQueue(); - return null; - } - }); - try { - LOG.debug("Waiting 1s for unregistering outbound queue."); - future.get(1, TimeUnit.SECONDS); - LOG.info("Unregistering outbound queue successful."); - } catch (InterruptedException e) { - LOG.warn("Unregistering outbound queue was interrupted for node {}", nodeId); - } catch (ExecutionException e) { - LOG.warn("Unregistering outbound queue throws exception for node {}", nodeId, e); - } catch (TimeoutException e) { - LOG.warn("Unregistering outbound queue took longer than 1 seconds for node {}", nodeId); + final BigInteger datapathId = Objects.nonNull(featuresReply) ? featuresReply.getDatapathId() : BigInteger.ZERO; + if (LOG.isDebugEnabled()) { + LOG.debug("Actively closing connection: {}, datapathId: {}", + connectionAdapter.getRemoteAddress(), datapathId); } + connectionState = ConnectionContext.CONNECTION_STATE.RIP; + unregisterOutboundQueue(); closeHandshakeContext(); if (getConnectionAdapter().isAlive()) { @@ -141,15 +128,12 @@ public class ConnectionContextImpl implements ConnectionContext { } if (propagate) { - LOG.debug("Propagating device disconnect for node {}", nodeId); propagateDeviceDisconnectedEvent(); - } else { - LOG.debug("Close connection without propagating for node {}", nodeId); } } private void closeHandshakeContext() { - LOG.debug("Trying closing handshake context for node {}", nodeId); + LOG.debug("Trying closing handshake context for node {}", getSafeNodeIdForLOG()); if (handshakeContext != null) { try { handshakeContext.close(); @@ -163,12 +147,14 @@ public class ConnectionContextImpl implements ConnectionContext { @Override public void onConnectionClosed() { + + connectionState = ConnectionContext.CONNECTION_STATE.RIP; + if (null == nodeId){ SessionStatistics.countEvent(connectionAdapter.getRemoteAddress().toString(), SessionStatistics.ConnectionStatus.CONNECTION_DISCONNECTED_BY_DEVICE); } else { SessionStatistics.countEvent(nodeId.toString(), SessionStatistics.ConnectionStatus.CONNECTION_DISCONNECTED_BY_DEVICE); } - connectionState = ConnectionContext.CONNECTION_STATE.RIP; final InetSocketAddress remoteAddress = connectionAdapter.getRemoteAddress(); final Short auxiliaryId; @@ -189,21 +175,34 @@ public class ConnectionContextImpl implements ConnectionContext { } private void propagateDeviceDisconnectedEvent() { - if (null != deviceDisconnectedHandler) { + if (Objects.nonNull(deviceDisconnectedHandler)) { final BigInteger datapathId = featuresReply != null ? featuresReply.getDatapathId() : BigInteger.ZERO; - LOG.debug("Propagating connection closed event: {}, datapathId:{}.", - connectionAdapter.getRemoteAddress(), datapathId); + if (LOG.isDebugEnabled()) { + LOG.debug("Propagating connection closed event: {}, datapathId:{}.", + connectionAdapter.getRemoteAddress(), datapathId); + } deviceDisconnectedHandler.onDeviceDisconnected(this); } } + /** + * This method returns safe nodeId for logging + * @return string value od nodeId or string "null" + */ + @Override + public String getSafeNodeIdForLOG() { + return Objects.nonNull(nodeId) ? nodeId.getValue() : "null"; + } + @Override public void setOutboundQueueHandleRegistration(OutboundQueueHandlerRegistration outboundQueueHandlerRegistration) { this.outboundQueueHandlerRegistration = outboundQueueHandlerRegistration; } private void unregisterOutboundQueue() { - LOG.debug("Trying unregister outbound queue handler registration for node {}", nodeId); + if (LOG.isDebugEnabled()) { + LOG.debug("Trying unregister outbound queue handler registration for node {}", nodeId); + } if (outboundQueueHandlerRegistration != null) { outboundQueueHandlerRegistration.close(); outboundQueueHandlerRegistration = null; @@ -238,7 +237,8 @@ public class ConnectionContextImpl implements ConnectionContext { nodeId, DeviceStateUtil.createNodeInstanceIdentifier(nodeId), featuresReply.getVersion(), - featuresReply.getDatapathId()); + featuresReply.getDatapathId(), + outboundQueueProvider); } @Override @@ -246,23 +246,59 @@ public class ConnectionContextImpl implements ConnectionContext { this.handshakeContext = handshakeContext; } + @Override + public boolean equals(Object o) { + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } + + ConnectionContextImpl that = (ConnectionContextImpl) o; + + if (!connectionAdapter.equals(that.connectionAdapter)) { + return false; + } + + if (featuresReply != null ? !featuresReply.equals(that.featuresReply) : that.featuresReply != null) { + return false; + } + + return nodeId != null ? nodeId.equals(that.nodeId) : that.nodeId == null; + + } + + @Override + public int hashCode() { + int result = connectionAdapter.hashCode(); + result = 31 * result + (featuresReply != null ? featuresReply.hashCode() : 0); + result = 31 * result + (nodeId != null ? nodeId.hashCode() : 0); + return result; + } private class DeviceInfoImpl implements DeviceInfo { - final private NodeId nodeId; - final private KeyedInstanceIdentifier nodeII; - final private Short version; - final private BigInteger datapathId; + private final NodeId nodeId; + private final KeyedInstanceIdentifier nodeII; + private final Short version; + private final BigInteger datapathId; + private final ServiceGroupIdentifier serviceGroupIdentifier; + private OutboundQueue outboundQueueProvider; DeviceInfoImpl( final NodeId nodeId, final KeyedInstanceIdentifier nodeII, final Short version, - final BigInteger datapathId) { + final BigInteger datapathId, + final OutboundQueue outboundQueueProvider) { this.nodeId = nodeId; this.nodeII = nodeII; this.version = version; this.datapathId = datapathId; + this.outboundQueueProvider = outboundQueueProvider; + this.serviceGroupIdentifier = ServiceGroupIdentifier.create(this.nodeId.getValue()); } @Override @@ -276,7 +312,7 @@ public class ConnectionContextImpl implements ConnectionContext { } @Override - public Short getVersion() { + public short getVersion() { return version; } @@ -285,17 +321,27 @@ public class ConnectionContextImpl implements ConnectionContext { return datapathId; } + @Override + public ServiceGroupIdentifier getServiceIdentifier() { + return this.serviceGroupIdentifier; + } + @Override public boolean equals(Object o) { - if (this == o) return true; - if (o == null || getClass() != o.getClass()) return false; + if (this == o) { + return true; + } + + if (o == null || getClass() != o.getClass()) { + return false; + } DeviceInfoImpl that = (DeviceInfoImpl) o; - if (!nodeId.equals(that.nodeId)) return false; - if (!nodeII.equals(that.nodeII)) return false; - if (!version.equals(that.version)) return false; - return datapathId.equals(that.datapathId); + return (nodeId.equals(that.nodeId) && + nodeII.equals(that.nodeII) && + version.equals(that.version) && + datapathId.equals(that.datapathId)); } @@ -307,5 +353,14 @@ public class ConnectionContextImpl implements ConnectionContext { result = 31 * result + datapathId.hashCode(); return result; } + + public void setOutboundQueueProvider(final OutboundQueue outboundQueueProvider) { + this.outboundQueueProvider = outboundQueueProvider; + } + + @Override + public Long reserveXidForDeviceMessage() { + return outboundQueueProvider.reserveEntry(); + } } }