Shutdown closing of resources 74/7974/3
authorJan Srnicek <jsrnicek@cisco.com>
Thu, 10 Aug 2017 12:39:30 +0000 (14:39 +0200)
committerMarek Gradzki <mgradzki@cisco.com>
Mon, 14 Aug 2017 07:01:06 +0000 (07:01 +0000)
Change-Id: If57a5414153cb983138872c7a1ded7c7066b1b6d
Signed-off-by: Jan Srnicek <jsrnicek@cisco.com>
infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BGPExtensionConsumerContextProvider.java
infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/BgpRIBProvider.java
infra/northbound/bgp/src/main/java/io/fd/honeycomb/infra/bgp/RIBExtensionConsumerContextProvider.java
infra/northbound/netconf/src/main/java/io/fd/honeycomb/northbound/netconf/NetconfNotificationMapperProvider.java
infra/translate-utils/src/main/java/io/fd/honeycomb/translate/util/JsonUtils.java

index 106a882..1bb0c5a 100644 (file)
@@ -18,6 +18,7 @@ package io.fd.honeycomb.infra.bgp;
 
 import com.google.inject.Inject;
 import io.fd.honeycomb.binding.init.ProviderTrait;
+import io.fd.honeycomb.data.init.ShutdownHandler;
 import java.util.ArrayList;
 import java.util.Set;
 import org.opendaylight.protocol.bgp.parser.spi.BGPExtensionConsumerContext;
@@ -34,6 +35,9 @@ final class BGPExtensionConsumerContextProvider extends ProviderTrait<BGPExtensi
     @Inject
     private Set<BGPExtensionProviderActivator> activators;
 
+    @Inject
+    private ShutdownHandler shutdownHandler;
+
     @Override
     protected BGPExtensionConsumerContext create() {
         final BGPExtensionProviderContext ctx = new SimpleBGPExtensionProviderContext();
@@ -41,6 +45,7 @@ final class BGPExtensionConsumerContextProvider extends ProviderTrait<BGPExtensi
             new SimpleBGPExtensionProviderContextActivator(ctx, new ArrayList<>(activators));
         LOG.debug("Starting BGPExtensionConsumerContext with activators: {}", activators);
         activator.start();
+        shutdownHandler.register("bgp-extension-context-activator", activator);
         return ctx;
     }
 }
index a258088..60d4783 100644 (file)
@@ -21,6 +21,7 @@ import static org.opendaylight.protocol.bgp.rib.impl.config.OpenConfigMappingUti
 import com.google.common.collect.ImmutableList;
 import com.google.inject.Inject;
 import io.fd.honeycomb.binding.init.ProviderTrait;
+import io.fd.honeycomb.data.init.ShutdownHandler;
 import java.util.List;
 import java.util.Map;
 import java.util.stream.Collectors;
@@ -70,6 +71,8 @@ final class BgpRIBProvider extends ProviderTrait<RIB> {
     private BGPTableTypeRegistryConsumer tableTypeRegistry;
     @Inject
     private SchemaService schemaService;
+    @Inject
+    private ShutdownHandler shutdownHandler;
 
     @Override
     protected RIB create() {
@@ -79,48 +82,49 @@ final class BgpRIBProvider extends ProviderTrait<RIB> {
         LOG.debug("Creating BGP RIB: routerId={}, asNumber={}", routerId, asNumber);
         // TODO configure other BGP Multiprotocol extensions:
         final List<AfiSafi> afiSafi = ImmutableList.of(
-            new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
-            .addAugmentation(AfiSafi2.class,
-                new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled())
-                    .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build())
-            .build(),
-            new AfiSafiBuilder().setAfiSafiName(IPV4LABELLEDUNICAST.class)
-                .addAugmentation(AfiSafi2.class,
-                    new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled())
-                        .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build())
-                .build()
-            );
+                new AfiSafiBuilder().setAfiSafiName(IPV4UNICAST.class)
+                        .addAugmentation(AfiSafi2.class,
+                                new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled())
+                                        .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build())
+                        .build(),
+                new AfiSafiBuilder().setAfiSafiName(IPV4LABELLEDUNICAST.class)
+                        .addAugmentation(AfiSafi2.class,
+                                new AfiSafi2Builder().setReceive(cfg.isBgpMultiplePathsEnabled())
+                                        .setSendMax(cfg.bgpSendMaxMaths.get().shortValue()).build())
+                        .build()
+        );
         final Map<TablesKey, PathSelectionMode> pathSelectionModes =
-            OpenConfigMappingUtil.toPathSelectionMode(afiSafi, tableTypeRegistry)
-            .entrySet().stream().collect(Collectors.toMap(entry ->
-                new TablesKey(entry.getKey().getAfi(), entry.getKey().getSafi()), Map.Entry::getValue));
+                OpenConfigMappingUtil.toPathSelectionMode(afiSafi, tableTypeRegistry)
+                        .entrySet().stream().collect(Collectors.toMap(entry ->
+                        new TablesKey(entry.getKey().getAfi(), entry.getKey().getSafi()), Map.Entry::getValue));
         // based on org.opendaylight.protocol.bgp.rib.impl.config.RibImpl.createRib
+        final PingPongDataBroker pingPongDataBroker = new PingPongDataBroker(domBroker);
         final RIBImpl rib =
-            new RIBImpl(new NoopClusterSingletonServiceProvider(), new RibId(cfg.bgpProtocolInstanceName.get()),
-                asNumber, new BgpId(routerId), clusterId, extensions, dispatcher, codec,
-                new PingPongDataBroker(domBroker), toTableTypes(afiSafi, tableTypeRegistry), pathSelectionModes,
-                extensions.getClassLoadingStrategy(), null);
+                new RIBImpl(new NoopClusterSingletonServiceProvider(), new RibId(cfg.bgpProtocolInstanceName.get()),
+                        asNumber, new BgpId(routerId), clusterId, extensions, dispatcher, codec,
+                        pingPongDataBroker, toTableTypes(afiSafi, tableTypeRegistry), pathSelectionModes,
+                        extensions.getClassLoadingStrategy(), null);
 
         // required for proper RIB's CodecRegistry initialization (based on RIBImpl.start)
         schemaService.registerSchemaContextListener(rib);
-
+        shutdownHandler.register("ping-pong-data-broker", pingPongDataBroker);
         LOG.debug("BGP RIB created successfully: {}", rib);
         return rib;
     }
 
     /**
-     * HC does not support clustering, but BGP uses {@link ClusterSingletonServiceProvider}
-     * to initialize {@link RIBImpl}. Therefore we provide this dummy implementation.
+     * HC does not support clustering, but BGP uses {@link ClusterSingletonServiceProvider} to initialize {@link
+     * RIBImpl}. Therefore we provide this dummy implementation.
      */
     private static final class NoopClusterSingletonServiceProvider implements ClusterSingletonServiceProvider {
         private static final Logger LOG = LoggerFactory.getLogger(NoopClusterSingletonServiceProvider.class);
 
         private static final ClusterSingletonServiceRegistration REGISTRATION =
-            () -> LOG.debug("Closing ClusterSingletonServiceRegistration");
+                () -> LOG.debug("Closing ClusterSingletonServiceRegistration");
 
         @Override
         public ClusterSingletonServiceRegistration registerClusterSingletonService(
-            final ClusterSingletonService clusterSingletonService) {
+                final ClusterSingletonService clusterSingletonService) {
             clusterSingletonService.instantiateServiceInstance();
             return REGISTRATION;
         }
index 696726a..07ab869 100644 (file)
@@ -18,6 +18,7 @@ package io.fd.honeycomb.infra.bgp;
 
 import com.google.inject.Inject;
 import io.fd.honeycomb.binding.init.ProviderTrait;
+import io.fd.honeycomb.data.init.ShutdownHandler;
 import java.util.ArrayList;
 import java.util.Set;
 import org.opendaylight.protocol.bgp.rib.spi.RIBExtensionConsumerContext;
@@ -32,6 +33,8 @@ public class RIBExtensionConsumerContextProvider extends ProviderTrait<RIBExtens
     private static final Logger LOG = LoggerFactory.getLogger(RIBExtensionConsumerContextProvider.class);
     @Inject
     private Set<RIBExtensionProviderActivator> activators;
+    @Inject
+    private ShutdownHandler shutdownHandler;
 
     @Override
     protected RIBExtensionConsumerContext create() {
@@ -40,6 +43,7 @@ public class RIBExtensionConsumerContextProvider extends ProviderTrait<RIBExtens
             new SimpleRIBExtensionProviderContextActivator(ctx, new ArrayList<>(activators));
         LOG.debug("Starting RIBExtensionConsumerContext with activators: {}", activators);
         activator.start();
+        shutdownHandler.register("rib-extension-consumer-context-activator", activator);
         return ctx;
     }
 }
index d097e34..e402f04 100644 (file)
@@ -19,6 +19,7 @@ package io.fd.honeycomb.northbound.netconf;
 import com.google.inject.Inject;
 import com.google.inject.name.Named;
 import io.fd.honeycomb.binding.init.ProviderTrait;
+import io.fd.honeycomb.data.init.ShutdownHandler;
 import org.opendaylight.controller.config.yang.netconf.mdsal.notification.CapabilityChangeNotificationProducer;
 import org.opendaylight.controller.config.yang.netconf.mdsal.notification.NotificationToMdsalWriter;
 import org.opendaylight.controller.md.sal.binding.api.DataBroker;
@@ -54,6 +55,8 @@ public class NetconfNotificationMapperProvider extends ProviderTrait<NetconfOper
     private DataBroker dataBroker;
     @Inject
     private NetconfOperationServiceFactoryListener aggregator;
+    @Inject
+    private ShutdownHandler shutdownHandler;
 
     @Override
     protected NetconfNotificationOperationServiceFactory create() {
@@ -68,6 +71,9 @@ public class NetconfNotificationMapperProvider extends ProviderTrait<NetconfOper
         LOG.trace("Providing NetconfNotificationOperationServiceFactory");
         NetconfNotificationOperationServiceFactory netconfNotificationOperationServiceFactory =
             new NetconfNotificationOperationServiceFactory(notificationRegistry, aggregator);
-            return netconfNotificationOperationServiceFactory;
+
+        shutdownHandler.register("netconf-notification-service-factory", netconfNotificationOperationServiceFactory);
+        shutdownHandler.register("notification-to-mdsal-writer", writer);
+        return netconfNotificationOperationServiceFactory;
     }
 }
index 332bf67..324efc2 100644 (file)
@@ -19,6 +19,12 @@ package io.fd.honeycomb.translate.util;
 import com.google.common.base.Charsets;
 import com.google.gson.stream.JsonReader;
 import com.google.gson.stream.JsonWriter;
+import java.io.IOException;
+import java.io.InputStream;
+import java.io.InputStreamReader;
+import java.io.OutputStream;
+import java.io.OutputStreamWriter;
+import javax.annotation.Nonnull;
 import org.opendaylight.yangtools.yang.data.api.YangInstanceIdentifier;
 import org.opendaylight.yangtools.yang.data.api.schema.ContainerNode;
 import org.opendaylight.yangtools.yang.data.api.schema.DataContainerChild;
@@ -39,9 +45,6 @@ import org.opendaylight.yangtools.yang.model.api.SchemaPath;
 import org.slf4j.Logger;
 import org.slf4j.LoggerFactory;
 
-import javax.annotation.Nonnull;
-import java.io.*;
-
 public final class JsonUtils {
 
     private static final Logger LOG = LoggerFactory.getLogger(JsonUtils.class);
@@ -66,6 +69,8 @@ public final class JsonUtils {
         writeChildren(normalizedNodeWriter,(ContainerNode) rootData);
         jsonWriter.endObject();
         jsonWriter.flush();
+        normalizedNodeWriter.close();
+        jsonWriter.close();
     }
 
     /**
@@ -87,9 +92,9 @@ public final class JsonUtils {
                                          @Nonnull final SchemaNode parentSchema) {
         final DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, ContainerNode> builder =
             Builders.containerBuilder().withNodeIdentifier(new YangInstanceIdentifier.NodeIdentifier(schemaContext.getQName()));
-        final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(builder);
 
-        try (final JsonParserStream jsonParser = JsonParserStream.create(writer, schemaContext, parentSchema)) {
+        try (final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(builder);
+             final JsonParserStream jsonParser = JsonParserStream.create(writer, schemaContext, parentSchema)) {
             final JsonReader reader = new JsonReader(new InputStreamReader(stream, Charsets.UTF_8));
             jsonParser.parse(reader);
         } catch (IOException e) {
@@ -105,9 +110,9 @@ public final class JsonUtils {
                                                        @Nonnull final YangInstanceIdentifier.NodeIdentifier nodeIdentifier) {
         final DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifier, ContainerNode> builder =
                 Builders.containerBuilder().withNodeIdentifier(nodeIdentifier);
-        final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(builder);
 
-        try (final JsonParserStream jsonParser = JsonParserStream.create(writer, schemaContext, parentSchema)) {
+        try (final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(builder);
+             final JsonParserStream jsonParser = JsonParserStream.create(writer, schemaContext, parentSchema)) {
             final JsonReader reader = new JsonReader(new InputStreamReader(stream, Charsets.UTF_8));
             jsonParser.parse(reader);
         } catch (IOException e) {
@@ -124,9 +129,8 @@ public final class JsonUtils {
         final DataContainerNodeAttrBuilder<YangInstanceIdentifier.NodeIdentifierWithPredicates, MapEntryNode> mapEntryBuilder = Builders.mapEntryBuilder()
                 .withNodeIdentifier(nodeIdentifier);
 
-
-        final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(mapEntryBuilder);
-        try (final JsonParserStream jsonParser = JsonParserStream.create(writer, schemaContext, parentSchema)) {
+        try (final NormalizedNodeStreamWriter writer = ImmutableNormalizedNodeStreamWriter.from(mapEntryBuilder);
+             final JsonParserStream jsonParser = JsonParserStream.create(writer, schemaContext, parentSchema)) {
             final JsonReader reader = new JsonReader(new InputStreamReader(stream, Charsets.UTF_8));
             jsonParser.parse(reader);
         } catch (IOException e) {