Handle RT removal at different level 16/76716/1
authorClaudio D. Gasparini <claudio.gasparini@pantheon.tech>
Fri, 5 Oct 2018 19:50:28 +0000 (21:50 +0200)
committerClaudio David Gasparini <claudio.gasparini@pantheon.tech>
Fri, 5 Oct 2018 20:39:00 +0000 (20:39 +0000)
under eff-rib-in.

JIRA:BGPCEP-830

Change-Id: Id0539fe1334a03847c1cfeb66dfb074821e8b6ae
Signed-off-by: Claudio D. Gasparini <claudio.gasparini@pantheon.tech>
bgp/rib-impl/src/main/java/org/opendaylight/protocol/bgp/rib/impl/EffectiveRibInWriter.java

index 437136e8c00bae0df4925fb7ae9a26c760369daf..b5fdc3f02e23613c59c2b25b8968c3f2ca70b4bc 100644 (file)
@@ -247,7 +247,7 @@ final class EffectiveRibInWriter implements PrefixesReceivedCounters, PrefixesIn
                     break;
                 case DELETE:
                     final InstanceIdentifier<R> routeIID = ribSupport.createRouteIdentifier(tablePath, routeKey);
-                    tx.delete(LogicalDatastoreType.OPERATIONAL, routeIID);
+                    deleteRoutes(routeIID, routeChanged.getDataBefore(), tx);
                     break;
             }
         }
@@ -277,16 +277,22 @@ final class EffectiveRibInWriter implements PrefixesReceivedCounters, PrefixesIn
             tx.put(LogicalDatastoreType.OPERATIONAL, routeIID, route);
             tx.put(LogicalDatastoreType.OPERATIONAL, routeIID.child(Attributes.class), effAtt.get());
         } else {
-            final Optional<RouteTarget> rtMembership = RouteTargetMembeshipUtil.getRT(route);
-            if (rtMembership.isPresent()) {
-                if(PeerRole.Ebgp != this.peerImportParameters.getFromPeerRole()) {
-                    this.rtCache.uncacheRoute(route);
-                }
-                this.rtMemberships.remove(rtMembership.get());
-                this.rtMembershipsUpdated = true;
+            deleteRoutes(routeIID, route, tx);
+
+        }
+    }
+
+    private <R extends Route> void deleteRoutes(final InstanceIdentifier<R> routeIID,
+            final R route, final WriteTransaction tx) {
+        final Optional<RouteTarget> rtMembership = RouteTargetMembeshipUtil.getRT(route);
+        if (rtMembership.isPresent()) {
+            if(PeerRole.Ebgp != this.peerImportParameters.getFromPeerRole()) {
+                this.rtCache.uncacheRoute(route);
             }
-            tx.delete(LogicalDatastoreType.OPERATIONAL, routeIID);
+            this.rtMemberships.remove(rtMembership.get());
+            this.rtMembershipsUpdated = true;
         }
+        tx.delete(LogicalDatastoreType.OPERATIONAL, routeIID);
     }
 
     @SuppressWarnings("unchecked")