Add thread safety to inner HashMap in ClusterDAO 20/5820/2
authorLorand Jakab <lojakab@cisco.com>
Mon, 31 Mar 2014 13:00:35 +0000 (16:00 +0300)
committerLorand Jakab <lojakab@cisco.com>
Mon, 31 Mar 2014 21:46:40 +0000 (00:46 +0300)
Needed by SMR patches

Change-Id: I7defd582dfa2d7af444ab322d1816072b5cd3fc8
Signed-off-by: Lorand Jakab <lojakab@cisco.com>
mappingservice/clusterdao/src/main/java/org/opendaylight/lispflowmapping/clusterdao/ClusterDAOService.java
mappingservice/integrationtest/src/test/java/org/opendaylight/lispflowmapping/integrationtest/MappingServiceIntegrationTest.java

index 0c89ac15ac28814330cfb23a92ec83c95633018e..8826f942368b575ff342ee86d5c5c4af23e0faee 100644 (file)
@@ -9,8 +9,8 @@
 package org.opendaylight.lispflowmapping.clusterdao;
 
 import java.util.EnumSet;
-import java.util.HashMap;
 import java.util.Map;
+import java.util.concurrent.ConcurrentHashMap;
 import java.util.concurrent.ConcurrentMap;
 import java.util.concurrent.Executors;
 import java.util.concurrent.ScheduledExecutorService;
@@ -31,7 +31,7 @@ public class ClusterDAOService implements ILispDAO {
 
     protected static final Logger logger = LoggerFactory.getLogger(ClusterDAOService.class);
     private IClusterContainerServices clusterContainerService = null;
-    private ConcurrentMap<Object, Map<String, Object>> data;
+    private ConcurrentMap<Object, ConcurrentMap<String, Object>> data;
     private final String CACHE_NAME = "mappingServiceCache";
     private TimeUnit timeUnit = TimeUnit.SECONDS;
     private int recordTimeOut = 240;
@@ -82,7 +82,7 @@ public class ClusterDAOService implements ILispDAO {
             return;
         }
         logger.trace("Retrieving cache for ClusterDAOService");
-        data = (ConcurrentMap<Object, Map<String, Object>>) this.clusterContainerService.getCache(CACHE_NAME);
+        data = (ConcurrentMap<Object, ConcurrentMap<String, Object>>) this.clusterContainerService.getCache(CACHE_NAME);
         if (data == null) {
             logger.warn("Cache couldn't be retrieved for ClusterDAOService");
         }
@@ -90,7 +90,7 @@ public class ClusterDAOService implements ILispDAO {
     }
 
     public void getAll(IRowVisitor visitor) {
-        for (Map.Entry<Object, Map<String, Object>> keyEntry : data.entrySet()) {
+        for (ConcurrentMap.Entry<Object, ConcurrentMap<String, Object>> keyEntry : data.entrySet()) {
             for (Map.Entry<String, Object> valueEntry : keyEntry.getValue().entrySet()) {
                 visitor.visitRow(keyEntry.getKey(), valueEntry.getKey(), valueEntry.getValue());
             }
@@ -99,7 +99,7 @@ public class ClusterDAOService implements ILispDAO {
 
     public void put(Object key, MappingEntry<?>... values) {
         if (!data.containsKey(key)) {
-            data.put(key, new HashMap<String, Object>());
+            data.put(key, new ConcurrentHashMap<String, Object>());
         }
         for (MappingEntry<?> entry : values) {
             data.get(key).put(entry.getKey(), entry.getValue());
index cdefc8b6a3a6fd220595e1b39c78878038e8d9f3..1d0c332a1bfc97565c0e8117bb0140d302a8c628 100644 (file)
@@ -436,10 +436,12 @@ public class MappingServiceIntegrationTest {
         LispAFIAddress rloc2Value = asIPAfiAddress("4.3.2.2");
         MapReply mapReply = sendMapRegisterTwiceWithDiffrentValues(eid, rloc1Value, rloc2Value);
         assertEquals(2, mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().size());
-        assertEquals(LispAFIConvertor.toContainer(rloc1Value), mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0)
-                .getLispAddressContainer());
-        assertEquals(LispAFIConvertor.toContainer(rloc2Value), mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(1)
-                .getLispAddressContainer());
+        LispAddressContainer rloc1ReturnValueContainer = mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(0).getLispAddressContainer();
+        LispAddressContainer rloc2ReturnValueContainer = mapReply.getEidToLocatorRecord().get(0).getLocatorRecord().get(1).getLispAddressContainer();
+        assertTrue((LispAFIConvertor.toContainer(rloc1Value).equals(rloc1ReturnValueContainer) &&
+                   LispAFIConvertor.toContainer(rloc2Value).equals(rloc2ReturnValueContainer)) ||
+                   (LispAFIConvertor.toContainer(rloc1Value).equals(rloc2ReturnValueContainer) &&
+                   LispAFIConvertor.toContainer(rloc2Value).equals(rloc1ReturnValueContainer)));
     }
 
     private MapReply sendMapRegisterTwiceWithDiffrentValues(LispAFIAddress eid, LispAFIAddress rloc1, LispAFIAddress rloc2)