diff --git a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.java b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.java index faa8724..127e923 100644 --- a/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.java +++ b/hbase-server/src/main/java/org/apache/hadoop/hbase/io/hfile/bucket/BucketAllocator.java @@ -21,9 +21,11 @@ package org.apache.hadoop.hbase.io.hfile.bucket; import java.util.Arrays; +import java.util.HashSet; import java.util.LinkedList; import java.util.List; import java.util.Map; +import java.util.Set; import java.util.concurrent.atomic.AtomicLong; import org.apache.commons.logging.Log; @@ -173,13 +175,13 @@ public final class BucketAllocator { final class BucketSizeInfo { // Free bucket means it has space to allocate a block; // Completely free bucket means it has no block. - private List bucketList, freeBuckets, completelyFreeBuckets; + private Set bucketList, freeBuckets, completelyFreeBuckets; private int sizeIndex; BucketSizeInfo(int sizeIndex) { - bucketList = new LinkedList(); - freeBuckets = new LinkedList(); - completelyFreeBuckets = new LinkedList(); + bucketList = new HashSet(); + freeBuckets = new HashSet(); + completelyFreeBuckets = new HashSet(); this.sizeIndex = sizeIndex; } @@ -201,8 +203,10 @@ public final class BucketAllocator { */ public long allocateBlock() { Bucket b = null; - if (freeBuckets.size() > 0) // Use up an existing one first... - b = freeBuckets.get(freeBuckets.size() - 1); + if (freeBuckets.size() > 0) { + // Use up an existing one first... + b = freeBuckets.iterator().next(); + } if (b == null) { b = grabGlobalCompletelyFreeBucket(); if (b != null) instantiateBucket(b); @@ -227,7 +231,7 @@ public final class BucketAllocator { } if (completelyFreeBuckets.size() > 0) { - b = completelyFreeBuckets.get(0); + b = completelyFreeBuckets.iterator().next(); removeBucket(b); } return b;