You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by te...@apache.org on 2011/11/13 22:17:36 UTC
svn commit: r1201516 - in /hbase/trunk/src:
main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java
main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java
Author: tedyu
Date: Sun Nov 13 21:17:35 2011
New Revision: 1201516
URL: http://svn.apache.org/viewvc?rev=1201516&view=rev
Log:
HBASE-4752 Don't create an unnecessary LinkedList when evicting from the BlockCache
Modified:
hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java
hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
hbase/trunk/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java?rev=1201516&r1=1201515&r2=1201516&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/CachedBlockQueue.java Sun Nov 13 21:17:35 2011
@@ -19,8 +19,7 @@
*/
package org.apache.hadoop.hbase.io.hfile;
-import java.util.LinkedList;
-import java.util.PriorityQueue;
+import com.google.common.collect.MinMaxPriorityQueue;
import org.apache.hadoop.hbase.io.HeapSize;
@@ -39,7 +38,7 @@ import org.apache.hadoop.hbase.io.HeapSi
*/
public class CachedBlockQueue implements HeapSize {
- private PriorityQueue<CachedBlock> queue;
+ private MinMaxPriorityQueue<CachedBlock> queue;
private long heapSize;
private long maxSize;
@@ -51,7 +50,7 @@ public class CachedBlockQueue implements
public CachedBlockQueue(long maxSize, long blockSize) {
int initialSize = (int)(maxSize / blockSize);
if(initialSize == 0) initialSize++;
- queue = new PriorityQueue<CachedBlock>(initialSize);
+ queue = MinMaxPriorityQueue.expectedSize(initialSize).create();
heapSize = 0;
this.maxSize = maxSize;
}
@@ -84,14 +83,19 @@ public class CachedBlockQueue implements
}
/**
- * @return a sorted List of all elements in this queue, in descending order
+ * @return The next element in this queue, or {@code null} if the queue is
+ * empty.
*/
- public LinkedList<CachedBlock> get() {
- LinkedList<CachedBlock> blocks = new LinkedList<CachedBlock>();
- while (!queue.isEmpty()) {
- blocks.addFirst(queue.poll());
- }
- return blocks;
+ public CachedBlock poll() {
+ return queue.poll();
+ }
+
+ /**
+ * @return The last element in this queue, or {@code null} if the queue is
+ * empty.
+ */
+ public CachedBlock pollLast() {
+ return queue.pollLast();
}
/**
Modified: hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java?rev=1201516&r1=1201515&r2=1201516&view=diff
==============================================================================
--- hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java (original)
+++ hbase/trunk/src/main/java/org/apache/hadoop/hbase/io/hfile/LruBlockCache.java Sun Nov 13 21:17:35 2011
@@ -24,7 +24,6 @@ import java.lang.ref.WeakReference;
import java.util.ArrayList;
import java.util.Collections;
import java.util.HashMap;
-import java.util.LinkedList;
import java.util.List;
import java.util.Map;
import java.util.PriorityQueue;
@@ -494,11 +493,11 @@ public class LruBlockCache implements Bl
}
public long free(long toFree) {
- LinkedList<CachedBlock> blocks = queue.get();
+ CachedBlock cb;
long freedBytes = 0;
- for(CachedBlock cb: blocks) {
+ while ((cb = queue.pollLast()) != null) {
freedBytes += evictBlock(cb);
- if(freedBytes >= toFree) {
+ if (freedBytes >= toFree) {
return freedBytes;
}
}
Modified: hbase/trunk/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java
URL: http://svn.apache.org/viewvc/hbase/trunk/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java?rev=1201516&r1=1201515&r2=1201516&view=diff
==============================================================================
--- hbase/trunk/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java (original)
+++ hbase/trunk/src/test/java/org/apache/hadoop/hbase/io/hfile/TestCachedBlockQueue.java Sun Nov 13 21:17:35 2011
@@ -63,17 +63,9 @@ public class TestCachedBlockQueue extend
assertEquals(queue.heapSize(), expectedSize);
- LinkedList<org.apache.hadoop.hbase.io.hfile.CachedBlock> blocks =
- queue.get();
- assertEquals(blocks.poll().getName(), "cb1");
- assertEquals(blocks.poll().getName(), "cb2");
- assertEquals(blocks.poll().getName(), "cb3");
- assertEquals(blocks.poll().getName(), "cb4");
- assertEquals(blocks.poll().getName(), "cb5");
- assertEquals(blocks.poll().getName(), "cb6");
- assertEquals(blocks.poll().getName(), "cb7");
- assertEquals(blocks.poll().getName(), "cb8");
-
+ for (int i = 1; i <= 8; i++) {
+ assertEquals(queue.pollLast().getName(), "cb"+i);
+ }
}
public void testQueueSmallBlockEdgeCase() throws Exception {
@@ -116,17 +108,9 @@ public class TestCachedBlockQueue extend
assertEquals(queue.heapSize(), expectedSize);
- LinkedList<org.apache.hadoop.hbase.io.hfile.CachedBlock> blocks = queue.get();
- assertEquals(blocks.poll().getName(), "cb0");
- assertEquals(blocks.poll().getName(), "cb1");
- assertEquals(blocks.poll().getName(), "cb2");
- assertEquals(blocks.poll().getName(), "cb3");
- assertEquals(blocks.poll().getName(), "cb4");
- assertEquals(blocks.poll().getName(), "cb5");
- assertEquals(blocks.poll().getName(), "cb6");
- assertEquals(blocks.poll().getName(), "cb7");
- assertEquals(blocks.poll().getName(), "cb8");
-
+ for (int i = 0; i <= 8; i++) {
+ assertEquals(queue.pollLast().getName(), "cb"+i);
+ }
}
private static class CachedBlock extends org.apache.hadoop.hbase.io.hfile.CachedBlock