Merge activation by Map-Register flag 33/38333/1
authorLorand Jakab <lojakab@cisco.com>
Tue, 3 May 2016 13:36:21 +0000 (16:36 +0300)
committerLorand Jakab <lojakab@cisco.com>
Tue, 3 May 2016 13:36:21 +0000 (16:36 +0300)
In addition to user configuration, use the merge-enabled flag in
Map-Register messages to activate mapping merging. Only when both are
enabled will merging happen.

Change-Id: I81fc7657111902478490ed7a01c88f736e4cb7dc
Signed-off-by: Lorand Jakab <lojakab@cisco.com>
16 files changed:
integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MappingServiceIntegrationTest.java
integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MultiSiteScenario.java
mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IMapCache.java
mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mapcache/IMappingSystem.java
mappingservice/api/src/main/java/org/opendaylight/lispflowmapping/interfaces/mappingservice/IMappingService.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingService.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/MappingSystem.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/lisp/MapServer.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/mapcache/FlatMapCache.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/mapcache/MultiTableMapCache.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/mapcache/SimpleMapCache.java
mappingservice/implementation/src/main/java/org/opendaylight/lispflowmapping/implementation/mdsal/MappingDataListener.java
mappingservice/implementation/src/test/java/org/opendaylight/lispflowmapping/implementation/lisp/MapServerTest.java
mappingservice/implementation/src/test/java/org/opendaylight/lispflowmapping/implementation/lisp/MappingServiceTest.java
mappingservice/implementation/src/test/java/org/opendaylight/lispflowmapping/implementation/mapcache/FlatMapCacheTest.java
mappingservice/implementation/src/test/java/org/opendaylight/lispflowmapping/implementation/mapcache/MultiTableMapCacheTest.java

index 842790e2d9440c3f4086bb43c5f9c97072f9490b..cb5fe4eeffb290d0152df18ea5d25422922b7dd1 100644 (file)
@@ -417,7 +417,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
         final SocketReader socketReader = SocketReader.startReadingInStandaloneThread(socket);
 
         //TEST CASE 1
-        multiSiteScenario.storeSouthboundMappings(SITE_A, SITE_B, SITE_C, SITE_D4, SITE_D5);
+        multiSiteScenario.storeSouthboundMappings(false, SITE_A, SITE_B, SITE_C, SITE_D4, SITE_D5);
         multiSiteScenario.storeNorthMappingSrcDst(SITE_B, SITE_C);
         multiSiteScenario.storeNorthMappingNegative(SITE_C, Action.Drop);
         sleepForSeconds(2);
@@ -545,7 +545,7 @@ public class MappingServiceIntegrationTest extends AbstractMdsalTestBase {
         mapService.setMappingOverwrite(false);
 
         //TEST CASE 1
-        multiSiteScenario.storeSouthboundMappings(SITE_A_SB, SITE_B_SB, SITE_C_WP_100_1_SB, SITE_D_WP_100_1_SB,
+        multiSiteScenario.storeSouthboundMappings(true, SITE_A_SB, SITE_B_SB, SITE_C_WP_100_1_SB, SITE_D_WP_100_1_SB,
                 SITE_E_SB);
         multiSiteScenario.storeNorthMappingIpPrefix(SITE_A_SB);
         multiSiteScenario.storeNorthMappingIpPrefix(SITE_B_SB);
index 42097f6937e0b6510dbe951e899c018cb60cd912..ee2baa8ae9ec71aa19bc8b84083ae214f81536d0 100644 (file)
@@ -121,8 +121,9 @@ class MultiSiteScenario {
         return mappingRecord;
     }
 
-    private void emitMapRegisterMessage(final Site dstSite) {
+    private void emitMapRegisterMessage(final Site dstSite, final boolean merge) {
         final MapRegisterBuilder mapRegisterBuilder = new MapRegisterBuilder();
+        mapRegisterBuilder.setMergeEnabled(merge);
         final MappingRecordItemBuilder mappingRecordItemBuilder = new MappingRecordItemBuilder();
         mappingRecordItemBuilder.setMappingRecordItemId(MAP_RECORD_A);
 
@@ -180,7 +181,8 @@ class MultiSiteScenario {
         mrbNegative.setEid(eidAsIpv4Prefix);
         mrbNegative.setAction(action);
 
-        mapService.addMapping(MappingOrigin.Northbound, eidAsIpv4Prefix, dstSite.getSiteId(), mrbNegative.build());
+        mapService.addMapping(MappingOrigin.Northbound, eidAsIpv4Prefix, dstSite.getSiteId(), mrbNegative.build(),
+                false);
     }
 
     void deleteNorthMappingNegative(final Site dstSite) {
@@ -193,16 +195,16 @@ class MultiSiteScenario {
     void storeNorthMappingSrcDst(final Site srcSite, final Site ... dstSite) {
         final MappingRecordBuilder mrb = prepareMappingRecord(EidType.EID_SRC_DST, srcSite,
                 dstSite);
-        mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build());
+        mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build(), false);
     }
 
     void storeNorthMappingIpPrefix(final Site... dstSite) {
         final MappingRecordBuilder mrb = prepareMappingRecord(EidType.EID_WITH_PREFIX, null, dstSite);
-        mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build());
+        mapService.addMapping(MappingOrigin.Northbound, mrb.getEid(), dstSite[0].getSiteId(), mrb.build(), false);
     }
 
-    private void storeDestinationSiteMappingViaSouthbound(final Site dstSite) {
-        emitMapRegisterMessage(dstSite);
+    private void storeDestinationSiteMappingViaSouthbound(final Site dstSite, final boolean merge) {
+        emitMapRegisterMessage(dstSite, merge);
     }
 
     private MappingRecordBuilder prepareMappingRecordGeneral(final EidType eidType,
@@ -287,13 +289,13 @@ class MultiSiteScenario {
     }
 
     void deleteSouthboundMappings(final Site dstSite) {
-        emitMapRegisterMessage(dstSite);
+        emitMapRegisterMessage(dstSite, false);
 
     }
 
-    void storeSouthboundMappings(final Site ... sites) {
+    void storeSouthboundMappings(final boolean merge, final Site ... sites) {
         for (Site site : sites) {
-            storeDestinationSiteMappingViaSouthbound(site);
+            storeDestinationSiteMappingViaSouthbound(site, merge);
         }
     }
 
index 4b5634ad980064c97e924b3a22ec9965c49e684e..1d4c6a87f2d00dfb6e1b526afa0562c35cd3a678 100644 (file)
@@ -28,8 +28,10 @@ public interface IMapCache {
      *            Value to be stored
      * @param shouldOverwrite
      *            Select if mappings with the same key are overwritten
+     * @param merge
+     *            Select if mappings with the same key are merged
      */
-    void addMapping(Eid key, Object data, boolean shouldOverwrite);
+    void addMapping(Eid key, Object data, boolean shouldOverwrite, boolean merge);
 
     /**
      * Retrieves mapping for the provided srcKey and dstKey.
index 5f8179784d2e8468350fe3cdc58305f8c62aa8b0..457d28bf0981ff134d2d8039ece4df31a38eeeac 100644 (file)
@@ -29,8 +29,10 @@ public interface IMappingSystem {
      *            Key of the mapping
      * @param data
      *            Value to be stored
+     * @param merge
+     *            Select if mappings with the same key are merged
      */
-    void addMapping(MappingOrigin origin, Eid key, Object data);
+    void addMapping(MappingOrigin origin, Eid key, Object data, boolean merge);
 
     /**
      * Retrieves mapping for the provided src and dst key.
index 8e99fd8a19388c55f15010937b68680eb154b89d..5d2c60bb276e035711474281ba44bd9b89c51a4b 100644 (file)
@@ -36,8 +36,10 @@ public interface IMappingService {
      *            Site that stores the mapping
      * @param data
      *            Value to be stored
+     * @param merge
+     *            Select if mappings with the same key are merged
      */
-    void addMapping(MappingOrigin origin, Eid key, SiteId siteId, Object data);
+    void addMapping(MappingOrigin origin, Eid key, SiteId siteId, Object data, boolean merge);
 
     /**
      * Retrieves mapping with given origin for the provided key. The lookup policy for the key is defined in the Mapping
index 04c43af2c541f288a9c04331446d262155747ec9..905ac02e931becca8825b35f0c8fdda629835583 100644 (file)
@@ -361,12 +361,12 @@ public class MappingService implements OdlMappingserviceService, IMappingService
     }
 
     @Override
-    public void addMapping(MappingOrigin origin, Eid key, SiteId siteId, Object data) {
+    public void addMapping(MappingOrigin origin, Eid key, SiteId siteId, Object data, boolean merge) {
         // SB registrations are first written to the MappingSystem and only afterwards are persisted to the datastore
         if (origin.equals(MappingOrigin.Southbound)) {
             // Store data first in MapCache and only afterwards persist to datastore. This should be used only for SB
             // registrations
-            mappingSystem.addMapping(origin, key, data);
+            mappingSystem.addMapping(origin, key, data, merge);
             dsbe.addMapping(DSBEInputUtil.toMapping(origin, key, siteId, (MappingRecord) data));
             if (((MappingRecord) data).getXtrId() != null) {
                 dsbe.addXtrIdMapping(DSBEInputUtil.toXtrIdMapping((MappingRecord) data));
index 9045b9e906589bde88895c6dc97d022e2008b5cb..52edce1a326af2123f61c47016e1a4d4be28d3e2 100644 (file)
@@ -108,8 +108,8 @@ public class MappingSystem implements IMappingSystem {
         tableMap.put(MappingOrigin.Southbound, smc);
     }
 
-    public void addMapping(MappingOrigin origin, Eid key, Object value) {
-        tableMap.get(origin).addMapping(key, value, origin == MappingOrigin.Southbound ? overwrite : true);
+    public void addMapping(MappingOrigin origin, Eid key, Object value, boolean merge) {
+        tableMap.get(origin).addMapping(key, value, origin == MappingOrigin.Southbound ? overwrite : true, merge);
     }
 
     public void updateMappingRegistration(MappingOrigin origin, Eid key) {
@@ -302,7 +302,7 @@ public class MappingSystem implements IMappingSystem {
                 expiredMappings++;
                 continue;
             }
-            addMapping(mapping.getOrigin(), mapping.getMappingRecord().getEid(), mapping.getMappingRecord());
+            addMapping(mapping.getOrigin(), mapping.getMappingRecord().getEid(), mapping.getMappingRecord(), false);
         }
         LOG.info("{} mappings were expired and were not restored", expiredMappings);
 
index 313d7a89b6070919ad9edbdde8de79270298ecce..adf81a0ba1c14c65d03d2ea732f42cf48bda81c1 100644 (file)
@@ -102,6 +102,7 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener {
     public void handleMapRegister(MapRegister mapRegister) {
         boolean authFailed = false;
         boolean mappingUpdated = false;
+        boolean merge = ConfigIni.getInstance().mappingMergeIsSet() && mapRegister.isMergeEnabled();
         MappingAuthkey authkey = null;
         Set<SubscriberRLOC> subscribers = null;
         MappingRecord oldMapping;
@@ -117,10 +118,10 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener {
             }
 
             oldMapping = (MappingRecord) mapService.getMapping(MappingOrigin.Southbound, mapping.getEid());
-            mapService.addMapping(MappingOrigin.Southbound, mapping.getEid(), getSiteId(mapRegister), mapping);
+            mapService.addMapping(MappingOrigin.Southbound, mapping.getEid(), getSiteId(mapRegister), mapping, merge);
 
             if (subscriptionService) {
-                MappingRecord newMapping = ConfigIni.getInstance().mappingMergeIsSet() ?
+                MappingRecord newMapping = merge ?
                         (MappingRecord) mapService.getMapping(MappingOrigin.Southbound, mapping.getEid()) : mapping;
 
                 if (mappingChanged(oldMapping, newMapping)) {
@@ -138,7 +139,7 @@ public class MapServer implements IMapServerAsync, OdlMappingserviceListener {
             LOG.trace("MapRegister wants MapNotify");
             MapNotifyBuilder builder = new MapNotifyBuilder();
             List<TransportAddress> rlocs = null;
-            if (ConfigIni.getInstance().mappingMergeIsSet()) {
+            if (merge) {
                 Set<IpAddress> notifyRlocs = new HashSet<IpAddress>();
                 List<MappingRecordItem> mergedMappings = new ArrayList<MappingRecordItem>();
                 for (MappingRecordItem record : mapRegister.getMappingRecordItem()) {
index 0da27846eafdab2bb84cf7755ff30fe56f10fc95..a7427736d560742edf1460dab3e98b6ea964e933 100644 (file)
@@ -35,7 +35,7 @@ public class FlatMapCache implements IMapCache {
     }
 
     @Override
-    public void addMapping(Eid eid, Object data, boolean shouldOverwrite) {
+    public void addMapping(Eid eid, Object data, boolean shouldOverwrite, boolean shouldMerge) {
         Eid key = MaskUtil.normalize(eid);
         dao.put(key, new MappingEntry<>(SubKeys.REGDATE, new Date(System.currentTimeMillis())));
         dao.put(key, new MappingEntry<>(SubKeys.RECORD, data));
index 2f8ffb07f83a8eb029689d380deddbe36cf06636..9eebb3d817ccb1df7a3289a0984c73a1584c1ef8 100644 (file)
@@ -64,7 +64,7 @@ public class MultiTableMapCache implements IMapCache {
         return table;
     }
 
-    public void addMapping(Eid key, Object value, boolean shouldOverwrite) {
+    public void addMapping(Eid key, Object value, boolean shouldOverwrite, boolean shouldMerge) {
         Eid eid = MaskUtil.normalize(key);
         ILispDAO table = getOrInstantiateVniTable(key);
 
index cff40c8abb29f881378ffade5d98e5f69dfd04d0..605bf1cb3db608795edf90e4385918670b88cdea 100644 (file)
@@ -16,7 +16,6 @@ import java.util.List;
 import java.util.Map;
 import java.util.Set;
 
-import org.opendaylight.lispflowmapping.implementation.config.ConfigIni;
 import org.opendaylight.lispflowmapping.implementation.util.MappingMergeUtil;
 import org.opendaylight.lispflowmapping.interfaces.dao.ILispDAO;
 import org.opendaylight.lispflowmapping.interfaces.dao.IRowVisitor;
@@ -92,7 +91,7 @@ public class SimpleMapCache implements IMapCache {
         }
     }
 
-    public void addMapping(Eid key, Object value, boolean shouldOverwrite) {
+    public void addMapping(Eid key, Object value, boolean shouldOverwrite, boolean shouldMerge) {
         if (value == null) {
             LOG.warn("addMapping() called with null 'value', ignoring");
             return;
@@ -104,7 +103,7 @@ public class SimpleMapCache implements IMapCache {
         }
 
         MappingRecord record = (MappingRecord) value;
-        if (record.getXtrId() == null && !shouldOverwrite && ConfigIni.getInstance().mappingMergeIsSet()) {
+        if (record.getXtrId() == null && !shouldOverwrite && shouldMerge) {
             LOG.warn("addMapping() called will null xTR-ID in MappingRecord, while merge is set, ignoring");
             return;
         }
@@ -119,7 +118,7 @@ public class SimpleMapCache implements IMapCache {
             xtrIdDao.put(record.getXtrId(), new MappingEntry<>(SubKeys.RECORD, value));
         }
 
-        if (ConfigIni.getInstance().mappingMergeIsSet()) {
+        if (shouldMerge) {
             List<XtrId> expiredMappings = new ArrayList<XtrId>();
             Set<IpAddress> sourceRlocs = new HashSet<IpAddress>();
             MappingRecord mergedEntry = MappingMergeUtil.mergeXtrIdMappings(getXtrIdMappingList(xtrIdDao),
index 976713dfd8079ea98f2aa44d4733a6b3b6c54d7b..b58212833d42bd549bc1fb6643b7d7f96652599d 100644 (file)
@@ -105,7 +105,7 @@ public class MappingDataListener extends NewAbstractDataListener<Mapping> {
                 LOG.trace("Value: {}", mapping);
 
                 mapSystem.addMapping(mapping.getOrigin(), mapping.getMappingRecord().getEid(),
-                        mapping.getMappingRecord());
+                        mapping.getMappingRecord(), false);
 
                 try {
                     // The notifications are used for sending SMR.
index b2ac1f19a569b6567b6bcc1a918d5335d56ebb40..d55109d2c626c9f587bdd066fdf47f37669d83a6 100644 (file)
@@ -158,7 +158,7 @@ public class MapServerTest {
 
         mapServer.handleMapRegister(mapRegister);
         Mockito.verify(mapService).addMapping(MappingOrigin.Southbound, IPV4_EID_1, mapRegister.getSiteId(),
-                mapRegister.getMappingRecordItem().iterator().next().getMappingRecord());
+                mapRegister.getMappingRecordItem().iterator().next().getMappingRecord(), false);
         Mockito.verify(mapService).addData(MappingOrigin.Southbound, IPV4_EID_1, SubKeys.SUBSCRIBERS,
                 subscriberSetMock_1);
         Mockito.verify(notifyHandler).handleMapNotify(getDefaultMapNotifyBuilder(mapRegister).build(), null);
@@ -184,7 +184,7 @@ public class MapServerTest {
 
         mapServer.handleMapRegister(mapRegister);
         Mockito.verify(mapService).addMapping(MappingOrigin.Southbound, IPV4_EID_1, mapRegister.getSiteId(),
-                mapRegister.getMappingRecordItem().iterator().next().getMappingRecord());
+                mapRegister.getMappingRecordItem().iterator().next().getMappingRecord(), true);
         Mockito.verify(notifyHandler).handleMapNotify(mapNotifyBuilder.build(), null);
     }
 
index 097140f2a76acc26738a312183dc78680de374fe..becf95c3762b3b7d6c31d8ba92efa5b6b9a437ca 100644 (file)
@@ -400,9 +400,9 @@ public class MappingServiceTest {
         final MappingRecord data = getDefaultMappingRecordBuilder()
                 .setXtrId(XTR_ID).build();
 
-        mappingService.addMapping(MappingOrigin.Southbound, IPV4_EID, SITE_ID, data);
+        mappingService.addMapping(MappingOrigin.Southbound, IPV4_EID, SITE_ID, data, false);
 
-        Mockito.verify(mappingSystem).addMapping(MappingOrigin.Southbound, IPV4_EID, data);
+        Mockito.verify(mappingSystem).addMapping(MappingOrigin.Southbound, IPV4_EID, data, false);
         Mockito.verify(dsbe).addMapping(DSBEInputUtil.toMapping(MappingOrigin.Southbound, IPV4_EID, SITE_ID, data));
         Mockito.verify(dsbe).addXtrIdMapping(DSBEInputUtil.toXtrIdMapping(data));
     }
@@ -420,7 +420,7 @@ public class MappingServiceTest {
         final MappingRecord data = getDefaultMappingRecordBuilder()
                 .setXtrId(XTR_ID).build();
 
-        mappingService.addMapping(origin, IPV4_EID, SITE_ID, data);
+        mappingService.addMapping(origin, IPV4_EID, SITE_ID, data, false);
         Mockito.verify(dsbe).addMapping(DSBEInputUtil.toMapping(origin, IPV4_EID, SITE_ID, data));
         Mockito.verifyZeroInteractions(mappingSystem);
         Mockito.verifyNoMoreInteractions(dsbe);
index a127379b4c1825ee102a26bcf5c3de40120dcfec..2b50b08df5012d589d128461d024d84477a51e45 100644 (file)
@@ -57,7 +57,7 @@ public class FlatMapCacheTest {
      */
     @Test
     public void addMappingTest() {
-        flatMapCache.addMapping(EID_TEST, DUMMY_OBJECT, false);
+        flatMapCache.addMapping(EID_TEST, DUMMY_OBJECT, true, false);
         verify(daoMock, atMost(2)).put(NORMALIZED_EID, new MappingEntry<>(anyString(), any(Date.class)));
         verify(daoMock).put(NORMALIZED_EID, new MappingEntry<>(SubKeys.RECORD, DUMMY_OBJECT));
     }
index cfe10a781969a0959a36157767a16c76b43f0d13..dcbcc09bb723c530362ea542f67fc615622f1e62 100644 (file)
@@ -102,7 +102,7 @@ public class MultiTableMapCacheTest {
         when(daoMock.getSpecific(VNI, SubKeys.VNI)).thenReturn(tableDaoMock);
         when(tableDaoMock.getSpecific(dstKey, SubKeys.LCAF_SRCDST)).thenReturn(srcDstDaoMock);
 
-        multiTableMapCache.addMapping(EID_SOURCE_DEST_KEY_TYPE, DUMMY_OBJECT, true);
+        multiTableMapCache.addMapping(EID_SOURCE_DEST_KEY_TYPE, DUMMY_OBJECT, true, false);
         verify(srcDstDaoMock, times(2)).put(srcKey, new MappingEntry<>(anyString(), any(Date.class)));
         verify(srcDstDaoMock).put(srcKey, new MappingEntry<>(SubKeys.RECORD, DUMMY_OBJECT));
     }
@@ -118,7 +118,7 @@ public class MultiTableMapCacheTest {
 
         when(daoMock.getSpecific(VNI, SubKeys.VNI)).thenReturn(tableDaoMock);
 
-        multiTableMapCache.addMapping(eid_ipv4Type, DUMMY_OBJECT, true);
+        multiTableMapCache.addMapping(eid_ipv4Type, DUMMY_OBJECT, true, false);
         verify(tableDaoMock, times(2)).put(normalized_Eid, new MappingEntry<>(anyString(), any(Date.class)));
         verify(tableDaoMock).put(normalized_Eid, new MappingEntry<>(SubKeys.RECORD, DUMMY_OBJECT));
     }