From d6412fd121985fc4753fe1092aa4e0236d673101 Mon Sep 17 00:00:00 2001 From: Surendar Raju Date: Wed, 24 Jul 2019 12:26:13 +0530 Subject: [PATCH] Subnet route is not advertised to FIB table... 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 --- .../netvirt/fibmanager/api/IFibManager.java | 3 +- .../netvirt/fibmanager/FibManagerImpl.java | 5 +-- .../netvirt/fibmanager/FibUtil.java | 36 +++++++++++-------- .../internal/AbstractSnatService.java | 2 +- .../natservice/internal/NaptSwitchHA.java | 4 +-- .../NatTunnelInterfaceStateListener.java | 2 +- .../netvirt/natservice/internal/NatUtil.java | 2 +- .../vpnmanager/VpnInterfaceManager.java | 10 +++--- .../vpnmanager/VpnSubnetRouteHandler.java | 5 +-- .../intervpnlink/IVpnLinkServiceImpl.java | 2 +- 10 files changed, 41 insertions(+), 30 deletions(-) diff --git a/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java b/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java index dda1bf1748..6baba30b54 100644 --- a/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java +++ b/fibmanager/api/src/main/java/org/opendaylight/netvirt/fibmanager/api/IFibManager.java @@ -67,7 +67,8 @@ public interface IFibManager { void removeOrUpdateFibEntry(String rd, String prefix, String nextHopToRemove, TypedWriteTransaction writeConfigTxn); - void removeFibEntry(String rd, String prefix, @Nullable TypedWriteTransaction writeConfigTxn); + void removeFibEntry(String rd, String prefix, String eventSource, + @Nullable TypedWriteTransaction writeConfigTxn); void updateRoutePathForFibEntry(String rd, String prefix, String nextHop, Uint32 label, boolean nextHopAdd, WriteTransaction writeConfigTxn); diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java index 13edd188c4..9befcc857b 100755 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibManagerImpl.java @@ -158,8 +158,9 @@ public class FibManagerImpl implements IFibManager { } @Override - public void removeFibEntry(String rd, String prefix, TypedWriteTransaction writeConfigTxn) { - fibUtil.removeFibEntry(rd, prefix, writeConfigTxn); + public void removeFibEntry(String rd, String prefix, String eventSource, + TypedWriteTransaction writeConfigTxn) { + fibUtil.removeFibEntry(rd, prefix, eventSource, writeConfigTxn); } @Override diff --git a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java index 95f0f1977b..342fb785b2 100644 --- a/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java +++ b/fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/FibUtil.java @@ -372,25 +372,34 @@ public class FibUtil { builder.setRoutePaths(routePaths); } - public void removeFibEntry(String rd, String prefix, TypedWriteTransaction writeConfigTxn) { + @SuppressWarnings("checkstyle:IllegalCatch") + public void removeFibEntry(String rd, String prefix, String eventSource, + TypedWriteTransaction 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 idBuilder = - InstanceIdentifier.builder(FibEntries.class) - .child(VrfTables.class, new VrfTablesKey(rd)).child(VrfEntry.class, new VrfEntryKey(prefix)); - InstanceIdentifier 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 idBuilder = + InstanceIdentifier.builder(FibEntries.class) + .child(VrfTables.class, new VrfTablesKey(rd)).child(VrfEntry.class, + new VrfEntryKey(prefix)); + InstanceIdentifier 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 writeConfigTxn) { - LOG.debug("Removing fib entry with destination prefix {} from vrf table for rd {} nextHop {}", prefix, rd, nextHopToRemove); diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java index e6fff99f97..d50b7310bd 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/AbstractSnatService.java @@ -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); } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java index 3caca65175..9b07e4f99c 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NaptSwitchHA.java @@ -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 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); } } diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java index 3d216b1a60..ee8daa1119 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatTunnelInterfaceStateListener.java @@ -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); } /* diff --git a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java index 991d44ff6f..9a27f8d1c0 100644 --- a/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java +++ b/natservice/impl/src/main/java/org/opendaylight/netvirt/natservice/internal/NatUtil.java @@ -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); } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java index ac63cae8f6..0daf6fd973 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java @@ -1409,7 +1409,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase nhList; @@ -1439,7 +1439,7 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase 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); } diff --git a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java index 401689f756..a412914ee1 100755 --- a/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java +++ b/vpnmanager/impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/IVpnLinkServiceImpl.java @@ -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); } } -- 2.36.6