Fix race between BGP config topology DCN and topology-provider registration 76/80776/2
authorAjay Lele <ajayslele@gmail.com>
Sat, 9 Mar 2019 00:01:48 +0000 (16:01 -0800)
committerRobert Varga <nite@hq.sk>
Tue, 12 Mar 2019 20:02:49 +0000 (20:02 +0000)
Change-Id: I827aea0722d1fc97ed066eaeebc705b192f3beb0
Signed-off-by: Ajay Lele <ajayslele@gmail.com>
(cherry picked from commit add328eed9dc5b2b1d91f4dd083091adff2d96a5)

bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/AbstractBgpTopologyProvider.java
bgp/topology-provider/src/main/java/org/opendaylight/bgpcep/bgp/topology/provider/config/BgpTopologyDeployerImpl.java

index a6dcc65030aa4d092c48d0391f433dd4df2e0aa4..b78cf99f020ebfe02d84e5474affe4d8e5050dbc 100644 (file)
@@ -47,7 +47,7 @@ abstract class AbstractBgpTopologyProvider implements BgpTopologyProvider, AutoC
 
     @Override
     public final void onTopologyBuilderCreated(final Topology topology) {
-        LOG.debug("Cretaing topology builder instance {}", topology);
+        LOG.debug("Creating topology builder instance {}", topology);
         final TopologyReferenceSingletonService currentInstance = this.topologyBuilders.get(topology.getTopologyId());
         if (currentInstance == null || !currentInstance.getConfiguration().equals(topology)) {
             final TopologyReferenceSingletonService topologyBuilder = createInstance(topology);
index a8cdf85128430b76944d0229b301ff5ef90ccdbc..9267ecf388d35b2b1ff2052defe4dde5757b7138 100644 (file)
@@ -50,6 +50,8 @@ public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoC
 
     @GuardedBy("this")
     private final Set<BgpTopologyProvider> topologyProviders = new HashSet<>();
+    @GuardedBy("this")
+    private final Set<Topology> topologies = new HashSet<>();
     private final DataBroker dataBroker;
     private final BundleContext context;
     private final ClusterSingletonServiceProvider singletonProvider;
@@ -86,16 +88,20 @@ public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoC
                 case DELETE:
                     filterTopologyBuilders(dataBefore)
                             .forEach(provider -> provider.onTopologyBuilderRemoved(dataBefore));
+                    this.topologies.remove(dataBefore);
                     break;
                 case SUBTREE_MODIFIED:
                     filterTopologyBuilders(dataBefore).forEach(provider
                         -> provider.onTopologyBuilderRemoved(dataBefore));
+                    this.topologies.remove(dataBefore);
                     filterTopologyBuilders(dataAfter).forEach(provider
                         -> provider.onTopologyBuilderCreated(dataAfter));
+                    this.topologies.add(dataAfter);
                     break;
                 case WRITE:
                     filterTopologyBuilders(dataAfter).forEach(provider
                         -> provider.onTopologyBuilderCreated(dataAfter));
+                    this.topologies.add(dataAfter);
                     break;
                 default:
                     break;
@@ -105,11 +111,14 @@ public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoC
 
     @Override
     public synchronized AbstractRegistration registerTopologyProvider(final BgpTopologyProvider topologyBuilder) {
+        filterTopologies(topologyBuilder).forEach(topology -> topologyBuilder.onTopologyBuilderCreated(topology));
         this.topologyProviders.add(topologyBuilder);
         return new AbstractRegistration() {
             @Override
             protected void removeRegistration() {
                 synchronized (BgpTopologyDeployerImpl.this) {
+                    filterTopologies(topologyBuilder)
+                            .forEach(topology -> topologyBuilder.onTopologyBuilderRemoved(topology));
                     BgpTopologyDeployerImpl.this.topologyProviders.remove(topologyBuilder);
                 }
             }
@@ -163,6 +172,11 @@ public final class BgpTopologyDeployerImpl implements BgpTopologyDeployer, AutoC
                 .collect(Collectors.toList());
     }
 
+    private Iterable<Topology> filterTopologies(final BgpTopologyProvider topologyBuilder) {
+        return this.topologies.stream().filter(topology -> topologyBuilder.topologyTypeFilter(topology))
+                .collect(Collectors.toList());
+    }
+
     private ClusterSingletonServiceRegistration registerSingletonService(
             final ClusterSingletonService clusterSingletonService) {
         return ClusterSingletonServiceRegistrationHelper