Subnet route is not advertised to FIB table... 22/83222/18
authorSurendar Raju <surendar.raju@ericsson.com>
Wed, 24 Jul 2019 06:56:13 +0000 (12:26 +0530)
committerKarthikeyan Krishnan <karthikeyangceb007@gmail.com>
Wed, 12 Feb 2020 08:49:46 +0000 (08:49 +0000)
Issue:In this there is vm present in vpn.While
deleting this type of vpn, the entire vrf entry
is removed before the actual vpn is deleted.
Hence transcation commit failure happens,
which results in breakoff inbetween.

Solution:This scenario is expected, but to
avoid the break-off we had added fix to
handle the exception, which results in flow
continuous.

Change-Id: I959cfc12d3490210235cf853d03fe2562c27be47
Signed-off-by: Surendar Raju <surendar.raju@ericsson.com>
fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java
natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java
vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java

index dda1bf17486c997e61c1ae0add1db6a63557233d..6baba30b54a260e644889d503c85f7855085f76c 100644 (file)
@@ -67,7 +67,8 @@ public interface IFibManager {
     void removeOrUpdateFibEntry(String rd, String prefix, String nextHopToRemove,
                                 TypedWriteTransaction<Configuration> writeConfigTxn);
 
-    void removeFibEntry(String rd, String prefix, @Nullable TypedWriteTransaction<Configuration> writeConfigTxn);
+    void removeFibEntry(String rd, String prefix, String eventSource,
+                        @Nullable TypedWriteTransaction<Configuration> writeConfigTxn);
 
     void updateRoutePathForFibEntry(String rd, String prefix, String nextHop,
                                     Uint32 label, boolean nextHopAdd, WriteTransaction writeConfigTxn);
index 13edd188c4dee7d6ec58ab12d6c4227619dd2180..9befcc857bd71c86b3bb3dd2a5a59326dc713727 100755 (executable)
@@ -158,8 +158,9 @@ public class FibManagerImpl implements IFibManager {
     }
 
     @Override
-    public void removeFibEntry(String rd, String prefix, TypedWriteTransaction<Configuration> writeConfigTxn) {
-        fibUtil.removeFibEntry(rd, prefix, writeConfigTxn);
+    public void removeFibEntry(String rd, String prefix, String eventSource,
+                               TypedWriteTransaction<Configuration> writeConfigTxn) {
+        fibUtil.removeFibEntry(rd, prefix, eventSource, writeConfigTxn);
     }
 
     @Override
index 95f0f1977bb2714e33d150716c757add8f2968ef..342fb785b25d2b9f020e7a776c753f0964442f6e 100644 (file)
@@ -372,25 +372,34 @@ public class FibUtil {
         builder.setRoutePaths(routePaths);
     }
 
-    public void removeFibEntry(String rd, String prefix, TypedWriteTransaction<Configuration> writeConfigTxn) {
+    @SuppressWarnings("checkstyle:IllegalCatch")
+    public void removeFibEntry(String rd, String prefix, String eventSource,
+                               TypedWriteTransaction<Configuration> writeConfigTxn) {
 
         if (rd == null || rd.isEmpty()) {
             LOG.error("Prefix {} not associated with vpn", prefix);
             return;
         }
-        LOG.debug("removeFibEntry: Removing fib entry with destination prefix {} from vrf table for rd {}",
-                prefix, rd);
-
-        InstanceIdentifier.InstanceIdentifierBuilder<VrfEntry> idBuilder =
-            InstanceIdentifier.builder(FibEntries.class)
-                .child(VrfTables.class, new VrfTablesKey(rd)).child(VrfEntry.class, new VrfEntryKey(prefix));
-        InstanceIdentifier<VrfEntry> vrfEntryId = idBuilder.build();
-        if (writeConfigTxn != null) {
-            writeConfigTxn.delete(vrfEntryId);
-        } else {
-            MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+        try {
+            LOG.debug("removeFibEntry: Removing fib entry with destination prefix {} from vrf table for rd {}",
+                    prefix, rd);
+
+            InstanceIdentifier.InstanceIdentifierBuilder<VrfEntry> idBuilder =
+                    InstanceIdentifier.builder(FibEntries.class)
+                            .child(VrfTables.class, new VrfTablesKey(rd)).child(VrfEntry.class,
+                            new VrfEntryKey(prefix));
+            InstanceIdentifier<VrfEntry> vrfEntryId = idBuilder.build();
+            if (writeConfigTxn != null) {
+                writeConfigTxn.delete(vrfEntryId);
+            } else {
+                MDSALUtil.syncDelete(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
+            }
+            LOG.error("removeFibEntry: Removed Fib Entry rd {} prefix {} source {} ",
+                    rd, prefix, eventSource);
+        } catch (RuntimeException e) {
+            LOG.error("removeFibEntry: Unable to remove Fib Entry for rd {} prefix {} source {} ",
+                    rd, prefix, eventSource);
         }
-        LOG.info("removeFibEntry: Removed Fib Entry rd {} prefix {}",rd, prefix);
     }
 
     /**
@@ -403,7 +412,6 @@ public class FibUtil {
      */
     public void removeOrUpdateFibEntry(String rd, String prefix, String nextHopToRemove,
             TypedWriteTransaction<Configuration> writeConfigTxn) {
-
         LOG.debug("Removing fib entry with destination prefix {} from vrf table for rd {} nextHop {}", prefix, rd,
                 nextHopToRemove);
 
index e6fff99f9763079797e035f1f8d7454d0a903375..d50b7310bd63fd4e802992e2f16d9bb6b2c2f001 100644 (file)
@@ -415,7 +415,7 @@ public abstract class AbstractSnatService implements SnatServiceListener {
         NatUtil.removeFlow(confTx, mdsalManager, dpnId, NwConstants.L3_FIB_TABLE, flowRef);
         String rd = NatUtil.getVpnRd(dataBroker, subNetId);
         String ipPrefix = externalIp + "/32";
-        fibManager.removeFibEntry(rd, ipPrefix, confTx);
+        fibManager.removeFibEntry(rd, ipPrefix, null, confTx);
         NatUtil.deletePrefixToInterface(dataBroker, NatUtil.getVpnId(dataBroker, subNetId), ipPrefix);
     }
 
index 3caca65175198d26409700c5ffa7e64fdecb2bc1..9b07e4f99c3d469f76d762748bfca46e5cbf368a 100644 (file)
@@ -440,7 +440,7 @@ public class NaptSwitchHA {
                             String rd = NatUtil.getVpnRd(dataBroker, vpnName);
                             for (String externalIp : externalIpsCache) {
                                 LOG.debug("isNaptSwitchDown : Removing Fib entry rd {} prefix {}", rd, externalIp);
-                                fibManager.removeFibEntry(rd, externalIp, null);
+                                fibManager.removeFibEntry(rd, externalIp, null, null);
                             }
                         }
                     } else {
@@ -1056,7 +1056,7 @@ public class NaptSwitchHA {
         Optional<VrfEntry> ent = MDSALUtil.read(dataBroker, LogicalDatastoreType.CONFIGURATION, vrfEntryId);
         if (ent.isPresent()) {
             LOG.debug("removeFibEntry : Removing Fib entry rd {} prefix {}", rd, prefix);
-            fibManager.removeFibEntry(rd, prefix, null);
+            fibManager.removeFibEntry(rd, prefix, null, null);
         }
     }
 
index 3d216b1a60b311f9cd31420d418bb7fcfea9dd77..ee8daa1119e8d5ca0a4039fc3a41868f22de2141 100644 (file)
@@ -529,7 +529,7 @@ public class NatTunnelInterfaceStateListener
         for (String externalIp : externalIps) {
             String rd = NatUtil.getVpnRd(dataBroker, externalVpnName);
             LOG.debug("hndlTepAddOnNaptSwitch : Removing Fib entry rd {} prefix {}", rd, externalIp);
-            fibManager.removeFibEntry(rd, externalIp, null);
+            fibManager.removeFibEntry(rd, externalIp, null, null);
         }
 
         /*
index 991d44ff6f621c20f7ac4e4a3b89039d2abffa6d..9a27f8d1c0c79675d672b2d918bfd967fa21c57f 100644 (file)
@@ -1008,7 +1008,7 @@ public final class NatUtil {
                                            String rd, String prefix, String vpnName) {
         try {
             LOG.debug("removePrefixFromBGP: Removing Fib entry rd {} prefix {}", rd, prefix);
-            fibManager.removeFibEntry(rd, prefix, null);
+            fibManager.removeFibEntry(rd, prefix, null, null);
             if (rd != null && !rd.equalsIgnoreCase(vpnName)) {
                 bgpManager.withdrawPrefix(rd, prefix);
             }
index ac63cae8f6c3e97cc6a55b72fff6cc40bec661ff..0daf6fd97348dd7e129e367d630b2a94fcb5893f 100755 (executable)
@@ -1409,7 +1409,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                         LOG.info("removeAdjacenciesFromVpn: Removing PNF FIB entry rd {} prefix {}",
                                 nextHop.getSubnetId().getValue(), nextHop.getIpAddress());
                         fibManager.removeFibEntry(nextHop.getSubnetId().getValue(), nextHop.getIpAddress(),
-                                null/*writeCfgTxn*/);
+                                null, null/*writeCfgTxn*/);
                     } else {
                         String rd = nextHop.getVrfId();
                         List<String> nhList;
@@ -1439,7 +1439,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                                             + " interface {}", nextHop.getIpAddress(), rd,
                                     nextHop.getAdjacencyType().toString(), interfaceName);
                             bgpManager.withdrawPrefixIfPresent(rd, nextHop.getIpAddress());
-                            fibManager.removeFibEntry(primaryRd, nextHop.getIpAddress(), writeConfigTxn);
+                            fibManager.removeFibEntry(primaryRd, nextHop.getIpAddress(), null, writeConfigTxn);
                         }
                     }
                     String ip = nextHop.getIpAddress().split("/")[0];
@@ -1846,7 +1846,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                                             LOG.debug("update: remove prefix {} from the FIB and BGP entry "
                                                 + "for the Vpn-Rd {} ", adj.getIpAddress(), vpnRd);
                                             //remove BGP entry
-                                            fibManager.removeFibEntry(vpnRd, adj.getIpAddress(), confTx);
+                                            fibManager.removeFibEntry(vpnRd, adj.getIpAddress(), null, confTx);
                                             if (vpnRd != null && !vpnRd.equalsIgnoreCase(newVpnName)) {
                                                 bgpManager.withdrawPrefix(vpnRd, adj.getIpAddress());
                                             }
@@ -2104,7 +2104,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                                     LOG.info("delAdjFromVpnInterface: deleting PNF adjacency prefix {} subnet {}",
                                             adj.getIpAddress(), adj.getSubnetId());
                                     fibManager.removeFibEntry(adj.getSubnetId().getValue(), adj.getIpAddress(),
-                                            writeConfigTxn);
+                                            null, writeConfigTxn);
                                 }
                                 break;
                             }
@@ -2198,7 +2198,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                 if (adj.getAdjacencyType() == AdjacencyType.PrimaryAdjacency) {
                     String primaryInterfaceIp = adj.getIpAddress();
                     String prefix = VpnUtil.getIpPrefix(primaryInterfaceIp);
-                    fibManager.removeFibEntry(rd, prefix, writeConfigTxn);
+                    fibManager.removeFibEntry(rd, prefix, null, writeConfigTxn);
                     LOG.info("deleteFibEntryForRouterInterface: FIB for router interface {} deleted for vpn {} rd {}"
                             + " prefix {}", vpnInterface.getName(), vpnName, rd, prefix);
                 }
index a0eeedbbd5224b9f49e8f297f33ab89121d31fbb..9a209feb814dc068f5ac2209325854eef1a00a88 100644 (file)
@@ -64,6 +64,7 @@ import org.slf4j.LoggerFactory;
 public class VpnSubnetRouteHandler {
     private static final Logger LOG = LoggerFactory.getLogger(VpnSubnetRouteHandler.class);
     private static final String LOGGING_PREFIX = "SUBNETROUTE:";
+    private static final String VPN_EVENT_SOURCE_SUBNET_ROUTE = "vpnSubnetRouteEvent";
     private final DataBroker dataBroker;
     private final SubnetOpDpnManager subOpDpnManager;
     private final IBgpManager bgpManager;
@@ -928,11 +929,11 @@ public class VpnSubnetRouteHandler {
     }
 
     public void deleteSubnetRouteFibEntryFromDS(String rd, String prefix, String vpnName) {
-        fibManager.removeFibEntry(rd, prefix, null);
+        fibManager.removeFibEntry(rd, prefix, VPN_EVENT_SOURCE_SUBNET_ROUTE, null);
         List<VpnInstanceOpDataEntry> vpnsToImportRoute = vpnUtil.getVpnsImportingMyRoute(vpnName);
         for (VpnInstanceOpDataEntry vpnInstance : vpnsToImportRoute) {
             String importingRd = vpnInstance.getVrfId();
-            fibManager.removeFibEntry(importingRd, prefix, null);
+            fibManager.removeFibEntry(importingRd, prefix, VPN_EVENT_SOURCE_SUBNET_ROUTE, null);
             LOG.info("SUBNETROUTE: deleteSubnetRouteFibEntryFromDS: Deleted imported subnet route rd {} prefix {}"
                     + " from vpn {} importingRd {}", rd, prefix, vpnInstance.getVpnInstanceName(), importingRd);
         }
index 401689f756307ce85b02061195cc541f28887e43..a412914ee1354a567c95389d8c86d355d8bd2cc7 100755 (executable)
@@ -154,7 +154,7 @@ public class IVpnLinkServiceImpl implements IVpnLinkService, AutoCloseable {
             }
         } else {
             LOG.debug("Removing leaked route to {} from VPN {}", prefix, dstVpnName);
-            fibManager.removeFibEntry(dstVpnRd, prefix, null /*writeConfigTxn*/);
+            fibManager.removeFibEntry(dstVpnRd, prefix, null, null /*writeConfigTxn*/);
             bgpManager.withdrawPrefix(dstVpnRd, prefix);
         }
     }