Bug 9171: Fix lookup when first result is expired 01/66001/3
authorLorand Jakab <lojakab@cisco.com>
Tue, 28 Nov 2017 10:36:08 +0000 (12:36 +0200)
committerLorand Jakab <lojakab@cisco.com>
Thu, 7 Dec 2017 15:57:44 +0000 (17:57 +0200)
When looking up southbound mappings, we check if they are expired, in
which case we remove them and return null. This patch keeps looking up
mappings after deletion, since a valid non-expired mapping matching the
lookup key may still exist.

JIRA: LISPMAP-168

Change-Id: I73550275cc27215296dd7b51c1708e6c7a5f8791
Signed-off-by: Lorand Jakab <lojakab@cisco.com>
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingSystem.java
mappingservice/implementation/src/test/java/org/opendaylight/lispflowmapping/implementation/MappingSystemTest.java

index 922659bba43b4a8f40b97b541555819fcb72fed9..1647d6d9cc3568e8a668a367a47c77c77debf9bb 100644 (file)
@@ -498,11 +498,17 @@ public class MappingSystem implements IMappingSystem {
 
     private MappingData getSbMappingWithExpiration(Eid src, Eid dst, XtrId xtrId) {
         MappingData mappingData = (MappingData) smc.getMapping(dst, xtrId);
-        if (mappingData != null && MappingMergeUtil.mappingIsExpired(mappingData)) {
-            return handleSbExpiredMapping(dst, xtrId, mappingData);
-        } else {
-            return mappingData;
+        while (mappingData != null && MappingMergeUtil.mappingIsExpired(mappingData)) {
+            // If the mappingData is expired, handleSbExpiredMapping() will run merge for it if merge is enabled,
+            // otherwise it will remove the expired mapping, returning null.
+            MappingData mergedMappingData = handleSbExpiredMapping(dst, xtrId, mappingData);
+            if (mergedMappingData != null) {
+                return mergedMappingData;
+            }
+            // If the expired mapping was removed, we look up the original query again
+            mappingData = (MappingData) smc.getMapping(dst, xtrId);
         }
+        return mappingData;
     }
 
     public MappingData handleSbExpiredMapping(Eid key, XtrId xtrId, MappingData mappingData) {
index 9e7e85ce6502eaca9e5d163eb3c6b1257cfb98e3..494aabde10f019bbf33b4249faf738eca3619425 100644 (file)
@@ -171,7 +171,7 @@ public class MappingSystemTest {
         final MappingData mappingData = getDefaultMappingData();
         mappingData.setTimestamp(EXPIRED_DATE);
         Mockito.when(pmcMock.getMapping(EID_IPV4_SRC, EID_IPV4_DST)).thenReturn(null);
-        Mockito.when(smcMock.getMapping(EID_IPV4_DST, (XtrId) null)).thenReturn(mappingData);
+        Mockito.when(smcMock.getMapping(EID_IPV4_DST, (XtrId) null)).thenReturn(mappingData, null);
 
         final Mapping mapping = new MappingBuilder()
                 .setEidUri(new EidUri("ipv4:" + IPV4_DST))
@@ -343,7 +343,7 @@ public class MappingSystemTest {
         sbMappingData.setTimestamp(EXPIRED_DATE);
 
         Mockito.when(pmcMock.getMapping(EID_IPV4_SRC, EID_IPV4_DST)).thenReturn(nbMappingData);
-        Mockito.when(smcMock.getMapping(EID_IPV4_DST, (XtrId) null)).thenReturn(sbMappingData);
+        Mockito.when(smcMock.getMapping(EID_IPV4_DST, (XtrId) null)).thenReturn(sbMappingData, null);
 
         final Mapping mapping = new MappingBuilder()
                 .setEidUri(new EidUri("ipv4:" + IPV4_DST))