Fix removal of expired mappings when merge on 79/50579/1
authorLorand Jakab <lojakab@cisco.com>
Tue, 17 Jan 2017 21:12:14 +0000 (23:12 +0200)
committerLorand Jakab <lojakab@cisco.com>
Tue, 17 Jan 2017 21:12:14 +0000 (23:12 +0200)
Change-Id: Ie1f1752471f72400788d28e81fd7f41ede6273f7
Signed-off-by: Lorand Jakab <lojakab@cisco.com>
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingSystem.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/util/DSBEInputUtil.java

index 08f924be716cc05257bf3d57fca6de724203b836..933474dafcff118966eecfaeb246eef0a68eb330 100644 (file)
@@ -197,15 +197,24 @@ public class MappingSystem implements IMappingSystem {
         }
     }
 
-    private void mergeMappings(Eid key) {
+    private MappingData mergeMappings(Eid key) {
         List<XtrId> expiredMappings = new ArrayList<>();
         Set<IpAddressBinary> sourceRlocs = new HashSet<>();
         MappingData mergedMappingData = MappingMergeUtil.mergeXtrIdMappings(smc.getAllXtrIdMappings(key),
                 expiredMappings, sourceRlocs);
         smc.removeXtrIdMappings(key, expiredMappings);
+        for (XtrId xtrId : expiredMappings) {
+            dsbe.removeXtrIdMapping(DSBEInputUtil.toXtrIdMapping(xtrId));
+        }
         if (mergedMappingData != null) {
             smc.addMapping(key, mergedMappingData, sourceRlocs);
+            dsbe.addMapping(DSBEInputUtil.toMapping(MappingOrigin.Southbound, key,
+                    mergedMappingData.getRecord().getSiteId(), mergedMappingData));
+        } else {
+            smc.removeMapping(key);
+            dsbe.removeMapping(DSBEInputUtil.toMapping(MappingOrigin.Southbound, key));
         }
+        return mergedMappingData;
     }
 
     @Override
@@ -282,8 +291,7 @@ 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)) {
-            removeExpiredMapping(dst, xtrId, mappingData);
-            return null;
+            return removeExpiredMapping(dst, xtrId, mappingData);
         } else {
             return mappingData;
         }
@@ -293,7 +301,10 @@ public class MappingSystem implements IMappingSystem {
      * This private method either removes the main mapping ONLY, or the xTR-ID mapping ONLY, based on xtrId being
      * null or non-null. Caller functions should take care of removing both when necessary.
      */
-    private void removeExpiredMapping(Eid key, XtrId xtrId, MappingData mappingData) {
+    private MappingData removeExpiredMapping(Eid key, XtrId xtrId, MappingData mappingData) {
+        if (mappingMerge && mappingData.isMergeEnabled()) {
+            return mergeMappings(key);
+        }
         if (xtrId == null) {
             smc.removeMapping(key);
             dsbe.removeMapping(DSBEInputUtil.toMapping(MappingOrigin.Southbound, mappingData.getRecord().getEid(),
@@ -301,10 +312,8 @@ public class MappingSystem implements IMappingSystem {
         } else {
             smc.removeMapping(key, xtrId);
             dsbe.removeXtrIdMapping(DSBEInputUtil.toXtrIdMapping(mappingData));
-            if (mappingMerge && mappingData.isMergeEnabled()) {
-                mergeMappings(key);
-            }
         }
+        return null;
     }
 
     @Override
index 2bd350211d27c6262fdaba3eb8d027caf9f84825..fc1e931292ac85acb920d3b0da1aa02438134e6e 100644 (file)
@@ -13,6 +13,7 @@ import java.util.List;
 import org.opendaylight.lispflowmapping.lisp.type.MappingData;
 import org.opendaylight.lispflowmapping.lisp.util.LispAddressStringifier;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.SiteId;
+import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.XtrId;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.eid.container.Eid;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.authkey.container.MappingAuthkey;
 import org.opendaylight.yang.gen.v1.urn.opendaylight.lfm.lisp.proto.rev151105.mapping.record.container.MappingRecord;
@@ -59,6 +60,10 @@ public final class DSBEInputUtil {
                 new XtrIdUri(LispAddressStringifier.getURIString(record.getXtrId()))).setMappingRecord(record).build();
     }
 
+    public static XtrIdMapping toXtrIdMapping(XtrId xtrId) {
+        return new XtrIdMappingBuilder().setXtrIdUri(new XtrIdUri(LispAddressStringifier.getURIString(xtrId))).build();
+    }
+
     public static AuthenticationKey toAuthenticationKey(Eid key, MappingAuthkey authKey) {
         AuthenticationKeyBuilder akb = new AuthenticationKeyBuilder();
         akb.setEidUri(new EidUri(LispAddressStringifier.getURIString(key)));