Author: jbellis
Date: Fri Apr 10 19:08:27 2009
New Revision: 764004
URL: http://svn.apache.org/viewvc?rev=764004&view=rev
Log:
fix getCompactionBuckets -- something is broken in NonBlockingHashMap when
removing and re-adding the same collection mid-iteration; it ends up with
multiple references to that collection. going back to ConcurrentHashMap fixes
the problem. (any additional overhead from CHM is negligible here.) patch by
jbellis; reviewed by Eric Evans for #57
Modified:
incubator/cassandra/trunk/src/org/apache/cassandra/db/ColumnFamilyStore.java
incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java
Modified:
incubator/cassandra/trunk/src/org/apache/cassandra/db/ColumnFamilyStore.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/src/org/apache/cassandra/db/ColumnFamilyStore.java?rev=764004&r1=764003&r2=764004&view=diff
==============================================================================
---
incubator/cassandra/trunk/src/org/apache/cassandra/db/ColumnFamilyStore.java
(original)
+++
incubator/cassandra/trunk/src/org/apache/cassandra/db/ColumnFamilyStore.java
Fri Apr 10 19:08:27 2009
@@ -30,6 +30,7 @@
import java.util.StringTokenizer;
import java.util.concurrent.ExecutionException;
import java.util.concurrent.Future;
+import java.util.concurrent.ConcurrentHashMap;
import java.util.concurrent.atomic.AtomicBoolean;
import java.util.concurrent.atomic.AtomicInteger;
import java.util.concurrent.atomic.AtomicReference;
@@ -50,7 +51,6 @@
import org.apache.cassandra.utils.BloomFilter;
import org.apache.cassandra.utils.FileUtils;
import org.apache.cassandra.utils.LogUtil;
-import org.cliffc.high_scale_lib.NonBlockingHashMap;
/**
* Author : Avinash Lakshman ( [email protected]) & Prashant Malik (
[email protected] )
@@ -694,7 +694,7 @@
*/
static Set<List<String>> getCompactionBuckets(List<String> files, long min)
{
- Map<List<String>, Long> buckets = new NonBlockingHashMap<List<String>,
Long>();
+ Map<List<String>, Long> buckets = new ConcurrentHashMap<List<String>,
Long>();
for(String fname : files)
{
File f = new File(fname);
Modified:
incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java
URL:
http://svn.apache.org/viewvc/incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java?rev=764004&r1=764003&r2=764004&view=diff
==============================================================================
---
incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java
(original)
+++
incubator/cassandra/trunk/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java
Fri Apr 10 19:08:27 2009
@@ -15,6 +15,7 @@
import java.util.concurrent.Future;
import org.apache.commons.lang.ArrayUtils;
+import org.apache.commons.lang.StringUtils;
import org.apache.cassandra.ServerTest;
import org.testng.annotations.Test;
@@ -285,8 +286,23 @@
}
Set<List<String>> buckets =
ColumnFamilyStore.getCompactionBuckets(all, 50);
- assert buckets.contains(small);
- assert buckets.contains(med);
+ assert buckets.size() == 2 : bucketString(buckets);
+ Iterator<List<String>> iter = buckets.iterator();
+ List<String> bucket1 = iter.next();
+ List<String> bucket2 = iter.next();
+ assert bucket1.size() + bucket2.size() == all.size() :
bucketString(buckets) + " does not match [" + StringUtils.join(all, ", ") + "]";
+ assert buckets.contains(small) : bucketString(buckets) + " does not
contain {" + StringUtils.join(small, ", ") + "}";
+ assert buckets.contains(med) : bucketString(buckets) + " does not
contain {" + StringUtils.join(med, ", ") + "}";
+ }
+
+ private static String bucketString(Set<List<String>> buckets)
+ {
+ ArrayList<String> pieces = new ArrayList<String>();
+ for (List<String> bucket : buckets)
+ {
+ pieces.add("[" + StringUtils.join(bucket, ", ") + "]");
+ }
+ return "{" + StringUtils.join(pieces, ", ") + "}";
}
private String createFile(int nBytes) throws IOException