Fix context chain closing
[openflowplugin.git] / openflowplugin-impl / src / main / java / org / opendaylight / openflowplugin / impl / device / DeviceManagerImpl.java
index c299772f6efcbd8f2f054afbcb63c1ab0f9bd4c5..407a5943d70e937e53f9d3053555b8d9424857b9 100644 (file)
@@ -7,14 +7,12 @@
  */
 package org.opendaylight.openflowplugin.impl.device;
 
-import com.google.common.collect.Iterators;
 import com.google.common.util.concurrent.CheckedFuture;
 import com.google.common.util.concurrent.FutureCallback;
 import com.google.common.util.concurrent.Futures;
 import io.netty.util.HashedWheelTimer;
 import io.netty.util.internal.ConcurrentSet;
 import java.util.Collections;
-import java.util.Iterator;
 import java.util.Optional;
 import java.util.Set;
 import java.util.concurrent.ConcurrentHashMap;
@@ -30,6 +28,7 @@ import org.opendaylight.controller.md.sal.binding.api.WriteTransaction;
 import org.opendaylight.controller.md.sal.common.api.data.LogicalDatastoreType;
 import org.opendaylight.controller.md.sal.common.api.data.TransactionCommitFailedException;
 import org.opendaylight.openflowjava.protocol.api.connection.OutboundQueueHandlerRegistration;
+import org.opendaylight.openflowplugin.api.openflow.OFPContext;
 import org.opendaylight.openflowplugin.api.openflow.connection.ConnectionContext;
 import org.opendaylight.openflowplugin.api.openflow.connection.OutboundQueueProvider;
 import org.opendaylight.openflowplugin.api.openflow.device.DeviceContext;
@@ -44,6 +43,7 @@ import org.opendaylight.openflowplugin.impl.device.initialization.DeviceInitiali
 import org.opendaylight.openflowplugin.impl.device.listener.OpenflowProtocolListenerFullImpl;
 import org.opendaylight.openflowplugin.impl.services.sal.SalRoleServiceImpl;
 import org.opendaylight.openflowplugin.openflow.md.core.sal.convertor.ConvertorExecutor;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRef;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeRemovedBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeUpdatedBuilder;
@@ -75,7 +75,7 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi
     private TranslatorLibrary translatorLibrary;
 
     private final ConcurrentMap<DeviceInfo, DeviceContext> deviceContexts = new ConcurrentHashMap<>();
-    private final Set<DeviceInfo> notificationCreateNodeSend = new ConcurrentSet<>();
+    private final Set<KeyedInstanceIdentifier<Node, NodeKey>> notificationCreateNodeSend = new ConcurrentSet<>();
 
     private long barrierIntervalNanos;
     private int barrierCountLimit;
@@ -130,13 +130,8 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi
 
     @Override
     public void close() {
-        for (final Iterator<DeviceContext> iterator = Iterators.consumingIterator(deviceContexts.values().iterator());
-                iterator.hasNext();) {
-            final DeviceContext deviceCtx = iterator.next();
-            deviceCtx.shutdownConnection();
-            deviceCtx.shuttingDownDataStoreTransactions();
-        }
-
+        deviceContexts.values().forEach(OFPContext::close);
+        deviceContexts.clear();
         Optional.ofNullable(spyPool).ifPresent(ScheduledThreadPoolExecutor::shutdownNow);
         spyPool = null;
 
@@ -193,7 +188,7 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi
     }
 
     @Override
-    public CheckedFuture<Void, TransactionCommitFailedException> removeDeviceFromOperationalDS(final KeyedInstanceIdentifier<Node, NodeKey> ii) {
+    public CheckedFuture<Void, TransactionCommitFailedException> removeDeviceFromOperationalDS(@Nonnull final KeyedInstanceIdentifier<Node, NodeKey> ii) {
         final WriteTransaction delWtx = dataBroker.newWriteOnlyTransaction();
         delWtx.delete(LogicalDatastoreType.OPERATIONAL, ii);
         final CheckedFuture<Void, TransactionCommitFailedException> delFuture = delWtx.submit();
@@ -215,11 +210,6 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi
         return delFuture;
     }
 
-    @Override
-    public CheckedFuture<Void, TransactionCommitFailedException> removeDeviceFromOperationalDS(final DeviceInfo deviceInfo) {
-        return this.removeDeviceFromOperationalDS(deviceInfo.getNodeInstanceIdentifier());
-    }
-
     public DeviceContext createContext(@Nonnull final ConnectionContext connectionContext) {
 
         LOG.info("ConnectionEvent: Device connected to controller, Device:{}, NodeId:{}",
@@ -286,18 +276,6 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi
         }
     }
 
-    @Override
-    public void sendNodeRemovedNotification(@Nonnull final DeviceInfo deviceInfo) {
-        notificationCreateNodeSend.remove(deviceInfo);
-        NodeRemovedBuilder builder = new NodeRemovedBuilder();
-        builder.setNodeRef(new NodeRef(deviceInfo.getNodeInstanceIdentifier()));
-        if (LOG.isDebugEnabled()) {
-            LOG.debug("Publishing node removed notification for {}", deviceInfo.getLOGValue());
-        }
-        notificationPublishService.offerNotification(builder.build());
-    }
-
-
     @Override
     public void onDeviceRemoved(final DeviceInfo deviceInfo) {
         deviceContexts.remove(deviceInfo);
@@ -310,15 +288,24 @@ public class DeviceManagerImpl implements DeviceManager, ExtensionConverterProvi
     }
 
     @Override
-    public void sendNodeAddedNotification(@Nonnull final DeviceInfo deviceInfo) {
-        if (!notificationCreateNodeSend.contains(deviceInfo)) {
-            notificationCreateNodeSend.add(deviceInfo);
+    public void sendNodeRemovedNotification(@Nonnull final KeyedInstanceIdentifier<Node, NodeKey> instanceIdentifier) {
+        if (notificationCreateNodeSend.remove(instanceIdentifier)) {
+            NodeRemovedBuilder builder = new NodeRemovedBuilder();
+            builder.setNodeRef(new NodeRef(instanceIdentifier));
+            LOG.info("Publishing node removed notification for {}", instanceIdentifier.firstKeyOf(Node.class).getId());
+            notificationPublishService.offerNotification(builder.build());
+        }
+    }
+
+    @Override
+    public void sendNodeAddedNotification(@Nonnull final KeyedInstanceIdentifier<Node, NodeKey> instanceIdentifier) {
+        if (!notificationCreateNodeSend.contains(instanceIdentifier)) {
+            notificationCreateNodeSend.add(instanceIdentifier);
+            final NodeId id = instanceIdentifier.firstKeyOf(Node.class).getId();
             NodeUpdatedBuilder builder = new NodeUpdatedBuilder();
-            builder.setId(deviceInfo.getNodeId());
-            builder.setNodeRef(new NodeRef(deviceInfo.getNodeInstanceIdentifier()));
-            if (LOG.isDebugEnabled()) {
-                LOG.debug("Publishing node added notification for {}", deviceInfo.getLOGValue());
-            }
+            builder.setId(id);
+            builder.setNodeRef(new NodeRef(instanceIdentifier));
+            LOG.info("Publishing node added notification for {}", id);
             notificationPublishService.offerNotification(builder.build());
         }
     }