Sprint-2 - Fixed linked hash map iterator bug found in IGNITE-264.

Project: http://git-wip-us.apache.org/repos/asf/incubator-ignite/repo
Commit: http://git-wip-us.apache.org/repos/asf/incubator-ignite/commit/23ea8789
Tree: http://git-wip-us.apache.org/repos/asf/incubator-ignite/tree/23ea8789
Diff: http://git-wip-us.apache.org/repos/asf/incubator-ignite/diff/23ea8789

Branch: refs/heads/ignite-424
Commit: 23ea87896063c5776aae0cf2499f402000b1630b
Parents: e60f86a
Author: Alexey Goncharuk <agoncha...@gridgain.com>
Authored: Thu Mar 26 19:17:41 2015 -0700
Committer: Alexey Goncharuk <agoncha...@gridgain.com>
Committed: Thu Mar 26 19:17:41 2015 -0700

----------------------------------------------------------------------
 .../java/org/jsr166/ConcurrentLinkedHashMap.java   |  9 +++++++++
 .../utils/GridConcurrentLinkedHashMapSelfTest.java | 17 +++++++++++++++++
 2 files changed, 26 insertions(+)
----------------------------------------------------------------------


http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/23ea8789/modules/core/src/main/java/org/jsr166/ConcurrentLinkedHashMap.java
----------------------------------------------------------------------
diff --git a/modules/core/src/main/java/org/jsr166/ConcurrentLinkedHashMap.java 
b/modules/core/src/main/java/org/jsr166/ConcurrentLinkedHashMap.java
index 2eb27a1..1de7cc1 100644
--- a/modules/core/src/main/java/org/jsr166/ConcurrentLinkedHashMap.java
+++ b/modules/core/src/main/java/org/jsr166/ConcurrentLinkedHashMap.java
@@ -695,6 +695,15 @@ public class ConcurrentLinkedHashMap<K, V> extends 
AbstractMap<K, V> implements
                     if (!onlyIfAbsent) {
                         e.val = val;
 
+                        ConcurrentLinkedDeque8.Node node = e.node;
+
+                        if (node != null) {
+                            HashEntry<K, V> qEntry = (HashEntry<K, 
V>)node.item();
+
+                            if (qEntry != null && qEntry != e)
+                                qEntry.val = val;
+                        }
+
                         modified = true;
                     }
                 }

http://git-wip-us.apache.org/repos/asf/incubator-ignite/blob/23ea8789/modules/core/src/test/java/org/apache/ignite/lang/utils/GridConcurrentLinkedHashMapSelfTest.java
----------------------------------------------------------------------
diff --git 
a/modules/core/src/test/java/org/apache/ignite/lang/utils/GridConcurrentLinkedHashMapSelfTest.java
 
b/modules/core/src/test/java/org/apache/ignite/lang/utils/GridConcurrentLinkedHashMapSelfTest.java
index b583cf8..ffc9e05 100644
--- 
a/modules/core/src/test/java/org/apache/ignite/lang/utils/GridConcurrentLinkedHashMapSelfTest.java
+++ 
b/modules/core/src/test/java/org/apache/ignite/lang/utils/GridConcurrentLinkedHashMapSelfTest.java
@@ -176,6 +176,23 @@ public class GridConcurrentLinkedHashMapSelfTest extends 
GridCommonAbstractTest
     }
 
     /**
+     * @throws Exception If failed.
+     */
+    public void testRehash() throws Exception {
+        Map<Integer, Date> map = new ConcurrentLinkedHashMap<>(10);
+
+        for (int i = 0; i < 100; i++)
+            // Will initiate rehash in the middle.
+            map.put(i, new Date(0));
+
+        for (int i = 0; i < 100; i++)
+            map.put(i, new Date(1));
+
+        for (Date date : map.values())
+            assertEquals(1L, date.getTime());
+    }
+
+    /**
      *
      */
     public void testDescendingMethods() {

Reply via email to