BUG 6841: Few Remote flows not deleted on DPNs 60/46160/6
authorSuraj Ranjan <suraj.ranjan@ericsson.com>
Sat, 24 Sep 2016 09:12:19 +0000 (14:42 +0530)
committerSuraj Ranjan <suraj.ranjan@ericsson.com>
Wed, 5 Oct 2016 08:56:37 +0000 (14:26 +0530)
Few Remote flows not deleted on DPNs after migration from
internal to external VPN.
For a vpn associate/dissociate, the vpn interface update event wait was
getting accumulated for every interface across vpns. So, vpn manger was
getting removed before interfaces were cleaned.
A label of 0 was being used to create unique ids across vpn engine if
IdManager failed to return a valid label.
Java Synchronize has been replaced by LockManager to handle events
gracefully across PLs during simultaneous northbound and southbound
events for subnet routes.

Change-Id: I3cf1d1553bd6b6b025a9cedbc860b7af246f1afe
Signed-off-by: Suraj Ranjan <suraj.ranjan@ericsson.com>
vpnservice/vpnmanager/vpnmanager-impl/pom.xml
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnConstants.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnInterfaceManager.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnSubnetRouteHandler.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/VpnUtil.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/java/org/opendaylight/netvirt/vpnmanager/intervpnlink/InterVpnLinkListener.java
vpnservice/vpnmanager/vpnmanager-impl/src/main/resources/org/opendaylight/blueprint/vpnmanager.xml
vpnservice/vpnmanager/vpnmanager-impl/src/test/java/org/opendaylight/netvirt/vpnmanager/test/VpnSubnetRouteHandlerTest.java

index 475cd156d6a2ef052c6189d5cda3639b7377da42..1e4e621f162be5749a0b144cc737b7b09154b53f 100644 (file)
@@ -86,6 +86,11 @@ and is available at http://www.eclipse.org/legal/epl-v10.html
       <artifactId>natservice-api</artifactId>
       <version>${vpnservices.version}</version>
     </dependency>
+    <dependency>
+      <groupId>org.opendaylight.genius</groupId>
+      <artifactId>lockmanager-api</artifactId>
+      <version>${genius.version}</version>
+    </dependency>
     <dependency>
       <groupId>org.opendaylight.infrautils</groupId>
       <artifactId>counters-api</artifactId>
index 33861403a6a934622da0e481911fc22b0063a2ef..cebdcd6def443e45569827c79309b9e475c37780 100644 (file)
@@ -22,8 +22,9 @@ public class VpnConstants {
     public static final String FLOWID_PREFIX = "L3.";
     public static final long MIN_WAIT_TIME_IN_MILLISECONDS = 10000;
     public static final long MAX_WAIT_TIME_IN_MILLISECONDS = 180000;
-    public static final long PER_INTERFACE_MAX_WAIT_TIME_IN_MILLISECONDS = 20000;
+    public static final long PER_INTERFACE_MAX_WAIT_TIME_IN_MILLISECONDS = 50000;
     public static final int ELAN_GID_MIN = 200000;
+    public static final int INVALID_LABEL = 0;
 
     // An IdPool for Pseudo LPort tags, that is, lportTags that are no related to an interface.
     // These lportTags must be higher than 170000 to avoid collision with interface LportTags and
index 19dce728a38ab8dea3b6f640680c94a3883f5e5a..6963239076acda6a7c5863a4ad311d497872d819 100644 (file)
@@ -79,6 +79,7 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.arputil.rev160406.Se
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.servicebinding.rev160406.service.bindings.services.info.BoundServices;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockManagerService;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -587,6 +588,10 @@ public class VpnInterfaceManager extends AsyncDataTreeChangeListenerBase<VpnInte
                 long label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                         VpnUtil.getNextHopLabelKey((rd == null) ? vpnName
                                 : rd, prefix));
+                if (label == VpnConstants.INVALID_LABEL) {
+                    LOG.error("Unable to fetch label from Id Manager. Bailing out of processing add/update of vpn interface {} for vpn {}", interfaceName, vpnName);
+                    return;
+                }
                 List<String> adjNextHop = nextHop.getNextHopIpList();
                 value.add(new AdjacencyBuilder(nextHop).setLabel(label).setNextHopIpList(
                         (adjNextHop != null && !adjNextHop.isEmpty()) ? adjNextHop : Arrays.asList(nextHopIp))
index 5927f704f4c248fe728c80bf13356b77b31f8d11..83e74632c212be010484148b647838cdc9225e15 100644 (file)
@@ -224,6 +224,7 @@ public class VpnSubnetRouteHandler implements NeutronvpnListener {
         } catch (Exception e) {
             logger.error("Unable to handle subnet {} added to vpn {} {}", subnetIp, vpnName, e);
         }
+
     }
 
     @Override
index de0cfba81b8c203fe21d5a8eb213615547f9d935..72ccf64914fe44e5582f90b5f865909a330f4f2b 100644 (file)
@@ -59,7 +59,12 @@ import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.Interface;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.interfaces.rev140508.interfaces.InterfaceKey;
 import org.opendaylight.yang.gen.v1.urn.ietf.params.xml.ns.yang.ietf.yang.types.rev130715.Uuid;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.*;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockManagerService;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.TimeUnits;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.TryLockInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.TryLockInputBuilder;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.UnlockInput;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.UnlockInputBuilder;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.NodeId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.Nodes;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.inventory.rev130819.nodes.Node;
@@ -134,11 +139,6 @@ import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.por
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.Ports;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.ports.rev150712.ports.attributes.ports.Port;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.neutron.rev150712.Neutron;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinkStates;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.InterVpnLinks;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkState;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.link.states.InterVpnLinkStateKey;
-import org.opendaylight.yang.gen.v1.urn.opendaylight.params.xml.ns.yang.netvirt.inter.vpn.link.rev160311.inter.vpn.links.InterVpnLink;
 import org.opendaylight.yangtools.yang.binding.InstanceIdentifier;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.netvirt.neutronvpn.rev150602.RouterInterfacesMap;
 import org.opendaylight.yangtools.yang.common.RpcResult;
@@ -1309,17 +1309,16 @@ public class VpnUtil {
     public static void lockSubnet(LockManagerService lockManager, String subnetId) {
         TryLockInput input = new TryLockInputBuilder().setLockName(subnetId).setTime(3000L).setTimeUnit(TimeUnits.Milliseconds).build();
         Future<RpcResult<Void>> result = lockManager.tryLock(input);
+        String errMsg = "Unable to getLock for subnet " + subnetId;
         try {
             if ((result != null) && (result.get().isSuccessful())) {
-                if (LOG.isDebugEnabled()) {
                     LOG.debug("Acquired lock for {}", subnetId);
-                }
             } else {
-                throw new RuntimeException(String.format("Unable to getLock for subnet %s", subnetId));
+                throw new RuntimeException(errMsg);
             }
         } catch (InterruptedException | ExecutionException e) {
-            LOG.error("Unable to getLock for subnet {}", subnetId);
-            throw new RuntimeException(String.format("Unable to getLock for subnet %s", subnetId), e.getCause());
+            LOG.error(errMsg);
+            throw new RuntimeException(errMsg, e.getCause());
         }
     }
 
index 9000b28be242e063559e6b64018fddb2e24df7e5..1dd88b7fbe06313c76befde580199a2251acf6b0 100755 (executable)
@@ -241,13 +241,13 @@ public class InterVpnLinkListener extends AsyncDataTreeChangeListenerBase<InterV
         for ( VrfEntry vrfEntry : srcVpnRemoteVrfEntries ) {
             long label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                                              VpnUtil.getNextHopLabelKey(dstVpnRd, vrfEntry.getDestPrefix()));
-            if (label == 0) {
+            if (label == VpnConstants.INVALID_LABEL) {
                 LOG.error("Unable to fetch label from Id Manager. Bailing out of leaking routes for InterVpnLink {} rd {} prefix {}",
-                                vpnLink.getName(), dstVpnRd, vrfEntry.getDestPrefix());
+                        vpnLink.getName(), dstVpnRd, vrfEntry.getDestPrefix());
                 continue;
             }
             InterVpnLinkUtil.leakRoute(dataBroker, bgpManager, vpnLink, srcVpnUuid, dstVpnUuid,
-                                  vrfEntry.getDestPrefix(), label);
+                    vrfEntry.getDestPrefix(), label);
         }
     }
 
@@ -270,10 +270,9 @@ public class InterVpnLinkListener extends AsyncDataTreeChangeListenerBase<InterV
                 // BGP accordingly
                 long label = VpnUtil.getUniqueId(idManager, VpnConstants.VPN_IDPOOL_NAME,
                                                   VpnUtil.getNextHopLabelKey(vpn1Rd, vrfEntry.getDestPrefix()));
-
-                if (label == 0) {
+                if (label == VpnConstants.INVALID_LABEL) {
                     LOG.error("Unable to fetch label from Id Manager. Bailing out of leaking extra routes for InterVpnLink {} rd {} prefix {}",
-                                    vpnLink.getName(), vpn1Rd, vrfEntry.getDestPrefix());
+                            vpnLink.getName(), vpn1Rd, vrfEntry.getDestPrefix());
                     continue;
                 }
                 InterVpnLinkUtil.leakRoute(dataBroker, bgpManager, vpnLink, vpn2Uuid, vpn1Uuid, vrfEntry.getDestPrefix(),
index 7b09c1b0e30814265d5181c8be10477c947c0cb0..3b8828e49da6dfa7ea783fbd4535dd67d88479a1 100644 (file)
@@ -21,6 +21,8 @@
                    interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.idmanager.rev160406.IdManagerService" />
   <odl:rpc-service id="itmRpcService"
                    interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.itm.rpcs.rev160406.ItmRpcService" />
+  <odl:rpc-service id="lockManagerService"
+                   interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.lockmanager.rev160413.LockManagerService" />
   <odl:rpc-service id="odlInterfaceRpcService"
                    interface="org.opendaylight.yang.gen.v1.urn.opendaylight.genius.interfacemanager.rpcs.rev160406.OdlInterfaceRpcService" />
   <odl:rpc-service id="odlArputilService"
index fc61ec4504829435cfb683698a470f449c0a438c..1591b0df47dcdc39cc1e29e1cba6b7d77344c5ac 100644 (file)
@@ -181,6 +181,7 @@ public class VpnSubnetRouteHandlerTest {
     @Mock IdManagerService idManager;
     @Mock LockManagerService lockManager;
     @Mock SubnetOpDpnManager subnetOpDpnManager;
+    @Mock LockManagerService lockManagerService;
 
     VpnSubnetRouteHandler vpnSubnetRouteHandler;
 
@@ -208,7 +209,7 @@ public class VpnSubnetRouteHandlerTest {
         setupMocks();
 
         vpnSubnetRouteHandler = new VpnSubnetRouteHandler(dataBroker, subnetOpDpnManager, bgpManager,
-                vpnInterfaceManager, idManager, lockManager);
+                vpnInterfaceManager, idManager, lockManagerService);
         Future<RpcResult<AllocateIdOutput>> idOutputOptional =
                 RpcResultBuilder.success(allocateIdOutput).buildFuture();