ECMP groups not deleted after extra-routes rm 87/75787/4
authoreswanit <[email protected]>
Tue, 7 Aug 2018 12:11:22 +0000 (17:41 +0530)
committerSam Hague <[email protected]>
Mon, 17 Sep 2018 00:09:12 +0000 (00:09 +0000)
ECMP groups are not deleted after extra-routes removal

* For the last extra-route in a remote DPN, group was not
  getting removed wherein the group-id was getting released in
  CleanupVpnInterfaceWorker previously.
  Now calling this inside deleteFibEntries so that all the groups
  are removed properly after extra-route removal in remote DPN.

* Making jobKey independent of usedRDs

* Migrating to SyncRemoveGroup from RemoveGroup

Change-Id: I2d3c5c528c51492a0f1ed0c1c8a735ae10937325
Signed-off-by: eswanit <[email protected]>
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/NexthopManager.java
fibmanager/impl/src/main/java/org/opendaylight/netvirt/fibmanager/VrfEntryListener.java

index 40127361a8acc50f14c60b7064f3429fdb1be510..4bf3750db20036f5abcbefc8a84c38b077cb1e8a 100644 (file)
@@ -872,7 +872,7 @@ public class NexthopManager implements AutoCloseable {
             if (localBucketInfo.isEmpty() ^ remoteBucketInfo.isEmpty()) {
                 LOG.debug("Deleting local group {} since no local nhs present for "
                         + "prefix {}", localGroupEntity.getGroupId(), destPrefix);
-                mdsalApiManager.removeGroup(localGroupEntity);
+                mdsalApiManager.syncRemoveGroup(localGroupEntity);
             }
             return Collections.emptyList();
         });
@@ -888,10 +888,14 @@ public class NexthopManager implements AutoCloseable {
         if (localGroupId == FibConstants.INVALID_GROUP_ID) {
             LOG.error("Unable to allocate/retrieve local groupId for vpnId {} , prefix {}", parentVpnId, destPrefix);
         }
+        GroupEntity remoteGroupEntity = MDSALUtil.buildGroupEntity(
+                dpnId, remoteGroupId, destPrefix, GroupTypes.GroupSelect, Collections.emptyList());
+        GroupEntity localGroupEntity = MDSALUtil.buildGroupEntity(
+                dpnId, localGroupId, destPrefix, GroupTypes.GroupSelect, Collections.emptyList());
         String jobKey = FibUtil.getCreateLocalNextHopJobKey(parentVpnId, dpnId, destPrefix);
         jobCoordinator.enqueueJob(jobKey, () -> {
-            mdsalApiManager.removeGroup(dpnId, remoteGroupId);
-            mdsalApiManager.removeGroup(dpnId, localGroupId);
+            mdsalApiManager.syncRemoveGroup(remoteGroupEntity);
+            mdsalApiManager.syncRemoveGroup(localGroupEntity);
             if (LOG.isDebugEnabled()) {
                 LOG.debug("Finished removing GroupEntity with jobCoordinator key {} remoteGroupEntity.groupId {}"
                     + "localGroupEntity.groupId {}", jobKey, remoteGroupId, localGroupId);
index 66052410171d77ffcf874e68caf7a2df21510ce5..2fb3f8b910a3b025becbbab2ba5a8ce3617f2d49 100755 (executable)
@@ -1372,10 +1372,6 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                                         vrfEntry.getDestPrefix()));
                         txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, configTx ->
                             configTx.delete(VpnExtraRouteHelper.getUsedRdsIdentifier(vpnId, vrfEntry.getDestPrefix())));
-                        nextHopManager.removeNextHopPointer(nextHopManager
-                                .getRemoteSelectGroupKey(vpnId, vrfEntry.getDestPrefix()));
-                        nextHopManager.removeNextHopPointer(nextHopManager
-                                .getLocalSelectGroupKey(vpnId, vrfEntry.getDestPrefix()));
                     }
                 }
                 handleAdjacencyAndVpnOpInterfaceDeletion(vrfEntry, ifName, vpnName, tx);
@@ -1513,7 +1509,6 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
             Optional<Routes> extraRouteOptional;
             //Is this fib route an extra route? If yes, get the nexthop which would be an adjacency in the vpn
             if (usedRds != null && !usedRds.isEmpty()) {
-                jobKey = FibUtil.getJobKeyForRdPrefix(usedRds.get(0), vrfEntry.getDestPrefix());
                 if (usedRds.size() > 1) {
                     LOG.error("The extra route prefix is still present in some DPNs");
                     return ;
@@ -1524,11 +1519,10 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                             .getVpnExtraroutes(dataBroker, vpnName, usedRds.get(0), vrfEntry.getDestPrefix());
                 }
             } else {
-                jobKey = FibUtil.getJobKeyForRdPrefix(rd, vrfEntry.getDestPrefix());
                 extraRouteOptional = Optional.absent();
             }
 
-            jobCoordinator.enqueueJob(jobKey,
+            jobCoordinator.enqueueJob(FibUtil.getJobKeyForRdPrefix(rd, vrfEntry.getDestPrefix()),
                 () -> Collections.singletonList(txRunner.callWithNewWriteOnlyTransactionAndSubmit(CONFIGURATION, tx -> {
                     if (localDpnIdList.size() <= 0) {
                         for (VpnToDpnList curDpn : vpnToDpnList) {
@@ -1547,6 +1541,10 @@ public class VrfEntryListener extends AsyncDataTreeChangeListenerBase<VrfEntry,
                             }
                         }
                     }
+                    nextHopManager.removeNextHopPointer(nextHopManager
+                            .getRemoteSelectGroupKey(vpnInstance.getVpnId(), vrfEntry.getDestPrefix()));
+                    nextHopManager.removeNextHopPointer(nextHopManager
+                            .getLocalSelectGroupKey(vpnInstance.getVpnId(), vrfEntry.getDestPrefix()));
                 })), MAX_RETRIES);
         }