[infinispan-commits] Infinispan SVN: r444 - trunk/core/src/main/java/org/infinispan/container.

infinispan-commits at lists.jboss.org infinispan-commits at lists.jboss.org
Fri Jun 12 07:00:44 EDT 2009


Author: manik.surtani at jboss.com
Date: 2009-06-12 07:00:44 -0400 (Fri, 12 Jun 2009)
New Revision: 444

Modified:
   trunk/core/src/main/java/org/infinispan/container/SimpleDataContainer.java
Log:
Order of keyset

Modified: trunk/core/src/main/java/org/infinispan/container/SimpleDataContainer.java
===================================================================
--- trunk/core/src/main/java/org/infinispan/container/SimpleDataContainer.java	2009-06-12 10:59:33 UTC (rev 443)
+++ trunk/core/src/main/java/org/infinispan/container/SimpleDataContainer.java	2009-06-12 11:00:44 UTC (rev 444)
@@ -131,7 +131,7 @@
    public Set<Object> keySet() {
       return new KeySet();
    }
-   
+
    public Collection<Object> values() {
       return new Values();
    }
@@ -189,7 +189,11 @@
       Iterator<Object> currentIterator;
 
       private KeyIterator(Iterator<Object> immortalIterator, Iterator<Object> mortalIterator) {
-         metaIterator = Arrays.asList(immortalIterator, mortalIterator).iterator();
+         // this order is imperative.  We need to iterate through mortal entries before the immortal ones
+         // since some access patterns (Dist rehashing) iterate through the key set and move entries from
+         // being immortal to mortal.  If you iterate through immortal entries first you could
+         // see the same key twice, breaking Set semantics.
+         metaIterator = Arrays.asList(mortalIterator, immortalIterator).iterator();
          if (metaIterator.hasNext()) currentIterator = metaIterator.next();
       }
 
@@ -211,7 +215,7 @@
          throw new UnsupportedOperationException();
       }
    }
-   
+
    private class EntrySet extends AbstractSet<Map.Entry> {
       public Iterator<Map.Entry> iterator() {
          return new ImmutableEntryIterator(immortalEntries.values().iterator(), mortalEntries.values().iterator());
@@ -246,45 +250,45 @@
          throw new UnsupportedOperationException();
       }
    }
-   
+
    private class EntryIterator extends MortalInmortalIterator implements Iterator<InternalCacheEntry> {
       private EntryIterator(Iterator<InternalCacheEntry> immortalIterator, Iterator<InternalCacheEntry> mortalIterator) {
          super(immortalIterator, mortalIterator);
       }
-      
+
       @SuppressWarnings("unchecked")
       public InternalCacheEntry next() {
          return currentIterator.next();
       }
    }
-   
+
    private class ImmutableEntryIterator extends MortalInmortalIterator implements Iterator<Map.Entry> {
       private ImmutableEntryIterator(Iterator<InternalCacheEntry> immortalIterator, Iterator<InternalCacheEntry> mortalIterator) {
          super(immortalIterator, mortalIterator);
       }
-      
+
       public Map.Entry next() {
          return Immutables.immutableEntry(currentIterator.next());
       }
    }
-   
+
    private class Values extends AbstractCollection<Object> {
       @Override
-      public Iterator<Object> iterator() {         
+      public Iterator<Object> iterator() {
          return new ValueIterator(immortalEntries.values().iterator(), mortalEntries.values().iterator());
       }
 
       @Override
       public int size() {
          return immortalEntries.size() + mortalEntries.size();
-      }      
+      }
    }
-   
+
    private class ValueIterator extends MortalInmortalIterator implements Iterator<Object> {
       private ValueIterator(Iterator<InternalCacheEntry> immortalIterator, Iterator<InternalCacheEntry> mortalIterator) {
          super(immortalIterator, mortalIterator);
       }
-      
+
       public Object next() {
          return currentIterator.next().getValue();
       }




More information about the infinispan-commits mailing list