Fix Netty replication components 76/95476/1
authorRobert Varga <robert.varga@pantheon.tech>
Sun, 28 Mar 2021 19:53:22 +0000 (21:53 +0200)
committerRobert Varga <nite@hq.sk>
Tue, 30 Mar 2021 07:13:01 +0000 (07:13 +0000)
We should have a public no-arg constructor, fix that. Also fix general
lifecycle issues in deregistration paths.

JIRA: MDSAL-662
Change-Id: I928f1f5486b6edc8a62ed006431b7c5f06ddf986
Signed-off-by: Robert Varga <robert.varga@pantheon.tech>
(cherry picked from commit 0b8c3f4342ac24a60230826e17fa25b82fc92ebe)

replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/AbstractBootstrapSupport.java
replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/NettyReplicationSink.java
replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/NettyReplicationSource.java
replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/NoOpRegistration.java [new file with mode: 0644]
replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/OSGiBootstrapSupportProvider.java

index a77a78c99f63daf2e5a93c2b4b56ddc6aff860e2..41bde80a256dda700e0ae00fa5db1b72d306b8ce 100644 (file)
@@ -46,7 +46,7 @@ public abstract class AbstractBootstrapSupport implements AutoCloseable, Bootstr
     }
 
     @Override
-    public  final ServerBootstrap newServerBootstrap() {
+    public final ServerBootstrap newServerBootstrap() {
         return new ServerBootstrap().group(bossGroup, workerGroup).channel(serverChannelClass);
     }
 
index 94d9005fa136559444ad00443993fdf7f7925fc4..e2967c369cdb88630d67a8b1d971a2b66067055c 100644 (file)
@@ -15,10 +15,10 @@ import java.net.UnknownHostException;
 import java.time.Duration;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
-import org.opendaylight.yangtools.concepts.AbstractRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.osgi.service.metatype.annotations.Designate;
@@ -61,15 +61,10 @@ public final class NettyReplicationSink {
     @Reference
     private ClusterSingletonServiceProvider singletonService;
 
-    private static final class Disabled extends AbstractRegistration {
-        @Override
-        protected void removeRegistration() {
-            // no-op
-        }
-    }
-
-    private NettyReplicationSink() {
+    private Registration reg;
 
+    public NettyReplicationSink() {
+        // Visible for DI
     }
 
     @Activate
@@ -78,10 +73,16 @@ public final class NettyReplicationSink {
         final Duration reconnectDelay = Duration.ofMillis(config.reconnectDelayMillis());
         final Duration keepaliveInterval = Duration.ofSeconds(config.keepAliveIntervalSeconds());
 
-        createSink(bootstrapSupport, dataBroker, singletonService, config.enabled(), sourceAddress,
+        reg = createSink(bootstrapSupport, dataBroker, singletonService, config.enabled(), sourceAddress,
                 config.sourcePort(), reconnectDelay, keepaliveInterval, config.maxMissedKeepalives());
     }
 
+    @Deactivate
+    void deactivate() {
+        reg.close();
+        reg = null;
+    }
+
     static Registration createSink(final BootstrapSupport bootstrap, final DOMDataBroker broker,
                                   final ClusterSingletonServiceProvider singleton, final boolean enabled,
                                   final InetAddress sourceAddress, final int sourcePort, final Duration reconnectDelay,
@@ -90,6 +91,6 @@ public final class NettyReplicationSink {
         checkArgument(maxMissedKeepalives > 0, "max-missed-keepalives %s must be greater than 0", maxMissedKeepalives);
         return enabled ? singleton.registerClusterSingletonService(new SinkSingletonService(bootstrap,
                 broker, new InetSocketAddress(sourceAddress, sourcePort), reconnectDelay, keepaliveInterval,
-                maxMissedKeepalives)) : new Disabled();
+                maxMissedKeepalives)) : new NoOpRegistration();
     }
 }
index f94a4717c6a49a297ea3416e8fb3bbb416a8ad52..dc17e792462fec00c48d83546fe09ba57b7f0224 100644 (file)
@@ -14,10 +14,10 @@ import java.time.Duration;
 import org.opendaylight.mdsal.dom.api.DOMDataBroker;
 import org.opendaylight.mdsal.dom.api.DOMDataTreeChangeService;
 import org.opendaylight.mdsal.singleton.common.api.ClusterSingletonServiceProvider;
-import org.opendaylight.yangtools.concepts.AbstractRegistration;
 import org.opendaylight.yangtools.concepts.Registration;
 import org.osgi.service.component.annotations.Activate;
 import org.osgi.service.component.annotations.Component;
+import org.osgi.service.component.annotations.Deactivate;
 import org.osgi.service.component.annotations.Reference;
 import org.osgi.service.metatype.annotations.AttributeDefinition;
 import org.osgi.service.metatype.annotations.Designate;
@@ -54,15 +54,10 @@ public final class NettyReplicationSource {
     @Reference
     private ClusterSingletonServiceProvider singletonService;
 
-    private static final class Disabled extends AbstractRegistration {
-        @Override
-        protected void removeRegistration() {
-            // no-op
-        }
-    }
-
-    private NettyReplicationSource() {
+    private Registration reg;
 
+    public NettyReplicationSource() {
+        // Visible for DI
     }
 
     @Activate
@@ -73,6 +68,12 @@ public final class NettyReplicationSource {
                 keepaliveInterval, config.maxMissedKeepalives());
     }
 
+    @Deactivate
+    void deactivate() {
+        reg.close();
+        reg = null;
+    }
+
     static Registration createSource(final BootstrapSupport bootstrap, final DOMDataBroker broker,
                                     final ClusterSingletonServiceProvider singleton, final boolean enabled,
                                     final int listenPort, final Duration keepaliveInterval,
@@ -82,6 +83,6 @@ public final class NettyReplicationSource {
         verify(dtcs != null, "Missing DOMDataTreeChangeService in broker %s", broker);
         checkArgument(maxMissedKeepalives > 0, "max-missed-keepalives %s must be greater than 0", maxMissedKeepalives);
         return enabled ? singleton.registerClusterSingletonService(new SourceSingletonService(bootstrap,
-                dtcs, listenPort, keepaliveInterval, maxMissedKeepalives)) : new Disabled();
+                dtcs, listenPort, keepaliveInterval, maxMissedKeepalives)) : new NoOpRegistration();
     }
 }
diff --git a/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/NoOpRegistration.java b/replicate/mdsal-replicate-netty/src/main/java/org/opendaylight/mdsal/replicate/netty/NoOpRegistration.java
new file mode 100644 (file)
index 0000000..1d32a3c
--- /dev/null
@@ -0,0 +1,17 @@
+/*
+ * Copyright (c) 2021 PANTHEON.tech, s.r.o. and others.  All rights reserved.
+ *
+ * This program and the accompanying materials are made available under the
+ * terms of the Eclipse Public License v1.0 which accompanies this distribution,
+ * and is available at http://www.eclipse.org/legal/epl-v10.html
+ */
+package org.opendaylight.mdsal.replicate.netty;
+
+import org.opendaylight.yangtools.concepts.AbstractRegistration;
+
+final class NoOpRegistration extends AbstractRegistration {
+    @Override
+    protected void removeRegistration() {
+        // no-op
+    }
+}
\ No newline at end of file
index 8019b9e18261e64ecb537c5d12eada9a4b9cb24d..067a057d1188f8c7e53c8ee44d300f81d1539d05 100644 (file)
@@ -17,7 +17,6 @@ import org.osgi.service.component.annotations.Deactivate;
 
 @Component(immediate = true, service = BootstrapSupport.class)
 public class OSGiBootstrapSupportProvider implements BootstrapSupport {
-
     private AbstractBootstrapSupport delegate = null;
 
     @Activate
@@ -26,7 +25,8 @@ public class OSGiBootstrapSupportProvider implements BootstrapSupport {
     }
 
     @Deactivate
-    void deactivate() {
+    void deactivate() throws InterruptedException {
+        delegate.close();
         delegate = null;
     }