From 50c1987265f8ddaf5032a7ace07b2462aba4f09b Mon Sep 17 00:00:00 2001 From: Jonathan Ellis Date: Fri, 10 Apr 2009 19:08:27 +0000 Subject: [PATCH] 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 git-svn-id: https://svn.apache.org/repos/asf/incubator/cassandra/trunk@764004 13f79535-47bb-0310-9956-ffa450edef68 --- .../cassandra/db/ColumnFamilyStore.java | 4 ++-- .../cassandra/db/ColumnFamilyStoreTest.java | 20 +++++++++++++++++-- 2 files changed, 20 insertions(+), 4 deletions(-) diff --git a/src/org/apache/cassandra/db/ColumnFamilyStore.java b/src/org/apache/cassandra/db/ColumnFamilyStore.java index c81a353f86..a1f286650c 100644 --- a/src/org/apache/cassandra/db/ColumnFamilyStore.java +++ b/src/org/apache/cassandra/db/ColumnFamilyStore.java @@ -30,6 +30,7 @@ import java.util.Set; 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.service.IPartitioner; 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 ( alakshman@facebook.com) & Prashant Malik ( pmalik@facebook.com ) @@ -694,7 +694,7 @@ public class ColumnFamilyStore */ static Set> getCompactionBuckets(List files, long min) { - Map, Long> buckets = new NonBlockingHashMap, Long>(); + Map, Long> buckets = new ConcurrentHashMap, Long>(); for(String fname : files) { File f = new File(fname); diff --git a/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java b/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java index 652cf2b32b..5089f45ef2 100644 --- a/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java +++ b/test/org/apache/cassandra/db/ColumnFamilyStoreTest.java @@ -15,6 +15,7 @@ import java.util.concurrent.ExecutionException; 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 @@ public class ColumnFamilyStoreTest extends ServerTest } Set> buckets = ColumnFamilyStore.getCompactionBuckets(all, 50); - assert buckets.contains(small); - assert buckets.contains(med); + assert buckets.size() == 2 : bucketString(buckets); + Iterator> iter = buckets.iterator(); + List bucket1 = iter.next(); + List 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> buckets) + { + ArrayList pieces = new ArrayList(); + for (List bucket : buckets) + { + pieces.add("[" + StringUtils.join(bucket, ", ") + "]"); + } + return "{" + StringUtils.join(pieces, ", ") + "}"; } private String createFile(int nBytes) throws IOException