[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