NETVIRT-1030 Unbinding elan service during interface state change 04/64804/7
authoreceghkl <manu.b@ericsson.com>
Fri, 27 Oct 2017 12:06:56 +0000 (17:36 +0530)
committerSam Hague <shague@redhat.com>
Mon, 4 Dec 2017 21:30:37 +0000 (21:30 +0000)
*Issue: Unbind was not called during interface state change.
Interfacemanager used to handle unbind during state change. Recently,
other apps started unbinding itself during state change. Due to this
stale entries are coming in table 17 for elan

*Fix: Unbind the elan service during interface state change

Change-Id: I1422f3690fac7d7587930a04207d93361a29bea0
Signed-off-by: eceghkl <manu.b@ericsson.com>
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInstanceManager.java
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceManager.java
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/ElanInterfaceStateChangeListener.java
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElan.java
vpnservice/elanmanager/elanmanager-impl/src/main/java/org/opendaylight/netvirt/elan/internal/InterfaceRemoveWorkerOnElanInterface.java

index 98ec2aa1d0b398579cbb267af11c4f93b775ea3b..b196d2b573fb17b2b5d1b2bfb100de20c67110c2 100644 (file)
@@ -88,7 +88,7 @@ public class ElanInstanceManager extends AsyncDataTreeChangeListenerBase<ElanIns
                     InstanceIdentifier<ElanInterface> elanInterfaceId = ElanUtils
                             .getElanInterfaceConfigurationDataPathId(elanInterfaceName);
                     InterfaceInfo interfaceInfo = interfaceManager.getInterfaceInfo(elanInterfaceName);
-                    elanInterfaceManager.removeElanInterface(deletedElan, elanInterfaceName, interfaceInfo, false);
+                    elanInterfaceManager.removeElanInterface(deletedElan, elanInterfaceName, interfaceInfo);
                     ElanUtils.delete(broker, LogicalDatastoreType.CONFIGURATION,
                             elanInterfaceId);
                 }
index 9c02e77a6f5ec69f7e42273db1b07cf08d7ae7d1..762b3d98869dcba8696eca7aacfb40d06eee4dd5 100644 (file)
@@ -218,12 +218,12 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         }
         String elanInstanceName = elanInfo.getElanInstanceName();
         InterfaceRemoveWorkerOnElan configWorker = new InterfaceRemoveWorkerOnElan(elanInstanceName, elanInfo,
-                interfaceName, interfaceInfo, false, this);
+                interfaceName, interfaceInfo, this);
         jobCoordinator.enqueueJob(elanInstanceName, configWorker, ElanConstants.JOB_MAX_RETRIES);
     }
 
     public List<ListenableFuture<Void>> removeElanInterface(ElanInstance elanInfo, String interfaceName,
-            InterfaceInfo interfaceInfo, boolean isInterfaceStateRemoved) {
+            InterfaceInfo interfaceInfo) {
         String elanName = elanInfo.getElanInstanceName();
         boolean isLastElanInterface = false;
         boolean isLastInterfaceOnDpn = false;
@@ -281,7 +281,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
             setElanAndEtreeBCGrouponOtherDpns(elanInfo, dpId);
         }
         InterfaceRemoveWorkerOnElanInterface removeInterfaceWorker = new InterfaceRemoveWorkerOnElanInterface(
-                interfaceName, elanInfo, interfaceInfo, isInterfaceStateRemoved, this, isLastElanInterface);
+                interfaceName, elanInfo, interfaceInfo, this, isLastElanInterface);
         jobCoordinator.enqueueJob(ElanUtils.getElanInterfaceJobKey(interfaceName), removeInterfaceWorker,
                 ElanConstants.JOB_MAX_RETRIES);
 
@@ -379,7 +379,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
     }
 
     List<ListenableFuture<Void>> removeEntriesForElanInterface(ElanInstance elanInfo, InterfaceInfo
-            interfaceInfo, String interfaceName, boolean isInterfaceStateRemoved, boolean isLastElanInterface) {
+            interfaceInfo, String interfaceName, boolean isLastElanInterface) {
         String elanName = elanInfo.getElanInstanceName();
         WriteTransaction interfaceTx = broker.newWriteOnlyTransaction();
         WriteTransaction flowTx = broker.newWriteOnlyTransaction();
@@ -434,9 +434,7 @@ public class ElanInterfaceManager extends AsyncDataTreeChangeListenerBase<ElanIn
         if (existingElanInterfaceMac.isPresent()) {
             interfaceTx.delete(LogicalDatastoreType.OPERATIONAL, elanInterfaceId);
         }
-        if (!isInterfaceStateRemoved) {
-            unbindService(interfaceName, interfaceTx);
-        }
+        unbindService(interfaceName, interfaceTx);
         deleteElanInterfaceFromConfigDS(interfaceName, interfaceTx);
         List<ListenableFuture<Void>> futures = new ArrayList<>();
         futures.add(ElanUtils.waitForTransactionToComplete(interfaceTx));
index ff82ba1fe3a4820d1d615bc4cec65dead536cccd..ffd1c373738ce3ccb0024e637a1221bf2a8c8664 100644 (file)
@@ -73,7 +73,7 @@ public class ElanInterfaceStateChangeListener
             return;
         }
         InterfaceRemoveWorkerOnElan removeWorker = new InterfaceRemoveWorkerOnElan(elanInstanceName, elanInstance,
-                interfaceName, interfaceInfo, true, elanInterfaceManager);
+                interfaceName, interfaceInfo, elanInterfaceManager);
         jobCoordinator.enqueueJob(elanInstanceName, removeWorker, ElanConstants.JOB_MAX_RETRIES);
     }
 
index 539f7f7b0e501591748c3de76139c0f741d0b59f..3a50196fc5c8925951562e3cb8bba3018afec33d 100644 (file)
@@ -26,16 +26,14 @@ public class InterfaceRemoveWorkerOnElan implements Callable<List<ListenableFutu
     private final ElanInstance elanInfo;
     private final String interfaceName;
     private final InterfaceInfo interfaceInfo;
-    private final boolean isInterfaceStateRemoved;
     private final ElanInterfaceManager dataChangeListener;
 
     public InterfaceRemoveWorkerOnElan(String key, ElanInstance elanInfo, String interfaceName,
-            InterfaceInfo interfaceInfo, boolean isInterfaceStateRemoved, ElanInterfaceManager dataChangeListener) {
+            InterfaceInfo interfaceInfo, ElanInterfaceManager dataChangeListener) {
         this.key = key;
         this.elanInfo = elanInfo;
         this.interfaceName = interfaceName;
         this.interfaceInfo = interfaceInfo;
-        this.isInterfaceStateRemoved = isInterfaceStateRemoved;
         this.dataChangeListener = dataChangeListener;
     }
 
@@ -51,8 +49,7 @@ public class InterfaceRemoveWorkerOnElan implements Callable<List<ListenableFutu
     public List<ListenableFuture<Void>> call() throws Exception {
         List<ListenableFuture<Void>> futures = new ArrayList<>();
         try {
-            futures.addAll(dataChangeListener.removeElanInterface(elanInfo, interfaceName, interfaceInfo,
-                    isInterfaceStateRemoved));
+            futures.addAll(dataChangeListener.removeElanInterface(elanInfo, interfaceName, interfaceInfo));
         } catch (RuntimeException e) {
             LOG.error("Error while processing key {} for elan interface {} and elan {}",
                     key, interfaceName, elanInfo, e);
index 7d0ae59279d614d2245fc271fa36e9d9dd8a7d2a..57a1dda30285bb5968c7bde91e9f99cf9fd80383 100644 (file)
@@ -25,17 +25,14 @@ public class InterfaceRemoveWorkerOnElanInterface implements Callable<List<Liste
     private final String interfaceName;
     private final ElanInstance elanInfo;
     private final InterfaceInfo interfaceInfo;
-    private final boolean isInterfaceStateRemoved;
     private final ElanInterfaceManager dataChangeListener;
     private final boolean isLastElanInterface;
 
     public InterfaceRemoveWorkerOnElanInterface(String interfaceName, ElanInstance elanInfo,
-            InterfaceInfo interfaceInfo, boolean isInterfaceStateRemoved, ElanInterfaceManager dataChangeListener,
-            boolean isLastElanInterface) {
+            InterfaceInfo interfaceInfo, ElanInterfaceManager dataChangeListener, boolean isLastElanInterface) {
         this.interfaceName = interfaceName;
         this.elanInfo = elanInfo;
         this.interfaceInfo = interfaceInfo;
-        this.isInterfaceStateRemoved = isInterfaceStateRemoved;
         this.dataChangeListener = dataChangeListener;
         this.isLastElanInterface = isLastElanInterface;
     }
@@ -43,8 +40,7 @@ public class InterfaceRemoveWorkerOnElanInterface implements Callable<List<Liste
     @Override
     public String toString() {
         return "InterfaceRemoveWorkerOnElanInterface [key=" + interfaceName + ", elanInfo=" + elanInfo
-                + ", interfaceInfo=" + interfaceInfo + ", isInterfaceStateRemoved=" + isInterfaceStateRemoved
-                + ", isLastElanInterface=" + isLastElanInterface + "]";
+                + ", interfaceInfo=" + interfaceInfo + ", isLastElanInterface=" + isLastElanInterface + "]";
     }
 
     @Override
@@ -53,7 +49,7 @@ public class InterfaceRemoveWorkerOnElanInterface implements Callable<List<Liste
         List<ListenableFuture<Void>> futures = new ArrayList<>();
         try {
             futures.addAll(dataChangeListener.removeEntriesForElanInterface(elanInfo, interfaceInfo, interfaceName,
-                    isInterfaceStateRemoved, isLastElanInterface));
+                    isLastElanInterface));
         } catch (RuntimeException e) {
             LOG.error("Error while processing for interface {} and elan {}", interfaceName, elanInfo, e);
             ElanUtils.addToListenableFutureIfTxException(e, futures);