You are viewing a plain text version of this content. The canonical link for it is here.
Posted to commits@hbase.apache.org by jd...@apache.org on 2010/04/28 19:52:43 UTC

svn commit: r939030 - in /hadoop/hbase/trunk: ./ core/src/main/java/org/apache/hadoop/hbase/regionserver/

Author: jdcryans
Date: Wed Apr 28 17:52:43 2010
New Revision: 939030

URL: http://svn.apache.org/viewvc?rev=939030&view=rev
Log:
HBASE-2496  Less ArrayList churn on the scan path

Modified:
    hadoop/hbase/trunk/CHANGES.txt
    hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ColumnCount.java
    hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java
    hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java

Modified: hadoop/hbase/trunk/CHANGES.txt
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/CHANGES.txt?rev=939030&r1=939029&r2=939030&view=diff
==============================================================================
--- hadoop/hbase/trunk/CHANGES.txt (original)
+++ hadoop/hbase/trunk/CHANGES.txt Wed Apr 28 17:52:43 2010
@@ -537,6 +537,7 @@ Release 0.21.0 - Unreleased
                (Todd Lipcon via Stack)
    HBASE-2393  ThriftServer instantiates a new HTable per request
                (Bogdan DRAGU via Stack)
+   HBASE-2496  Less ArrayList churn on the scan path
 
   NEW FEATURES
    HBASE-1961  HBase EC2 scripts

Modified: hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ColumnCount.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ColumnCount.java?rev=939030&r1=939029&r2=939030&view=diff
==============================================================================
--- hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ColumnCount.java (original)
+++ hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ColumnCount.java Wed Apr 28 17:52:43 2010
@@ -25,9 +25,9 @@ package org.apache.hadoop.hbase.regionse
  * NOT thread-safe because it is not used in a multi-threaded context, yet.
  */
 public class ColumnCount {
-  private byte [] bytes;
-  private int offset;
-  private int length;
+  private final byte [] bytes;
+  private final int offset;
+  private final int length;
   private int count;
   
   /**
@@ -97,6 +97,15 @@ public class ColumnCount {
   public int increment() {
     return ++count;
   }
+
+  /**
+   * Set the current count to a new count
+   * @param count new count to set
+   */
+  public void setCount(int count) {
+    this.count = count;
+  }  
+
   
   /**
    * Check to see if needed to fetch more versions

Modified: hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java?rev=939030&r1=939029&r2=939030&view=diff
==============================================================================
--- hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java (original)
+++ hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java Wed Apr 28 17:52:43 2010
@@ -46,11 +46,11 @@ import org.apache.hadoop.hbase.util.Byte
  */
 public class ExplicitColumnTracker implements ColumnTracker {
 
-  private int maxVersions;
-  private List<ColumnCount> columns;
+  private final int maxVersions;
+  private final List<ColumnCount> columns;
+  private final List<ColumnCount> columnsToReuse;
   private int index;
   private ColumnCount column;
-  private NavigableSet<byte[]> origColumns;
   
   /**
    * Default constructor.
@@ -59,7 +59,11 @@ public class ExplicitColumnTracker imple
    */
   public ExplicitColumnTracker(NavigableSet<byte[]> columns, int maxVersions) {
     this.maxVersions = maxVersions;
-    this.origColumns = columns;
+    this.columns = new ArrayList<ColumnCount>(columns.size());
+    this.columnsToReuse = new ArrayList<ColumnCount>(columns.size());
+    for(byte [] column : columns) {
+      this.columnsToReuse.add(new ColumnCount(column,maxVersions));
+    }
     reset();
   }
   
@@ -147,15 +151,16 @@ public class ExplicitColumnTracker imple
 
   // Called between every row.
   public void reset() {
-    buildColumnList(this.origColumns);
+    buildColumnList();
     this.index = 0;
     this.column = this.columns.get(this.index);
   }
 
-  private void buildColumnList(NavigableSet<byte[]> columns) {
-    this.columns = new ArrayList<ColumnCount>(columns.size());
-    for(byte [] column : columns) {
-      this.columns.add(new ColumnCount(column,maxVersions));
+  private void buildColumnList() {
+    this.columns.clear();
+    this.columns.addAll(this.columnsToReuse);
+    for(ColumnCount col : this.columns) {
+      col.setCount(this.maxVersions);
     }
   }
 }

Modified: hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java
URL: http://svn.apache.org/viewvc/hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java?rev=939030&r1=939029&r2=939030&view=diff
==============================================================================
--- hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (original)
+++ hadoop/hbase/trunk/core/src/main/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java Wed Apr 28 17:52:43 2010
@@ -1815,12 +1815,12 @@ public class HRegionServer implements HC
         throw e;
       }
       this.leases.renewLease(scannerName);
-      List<Result> results = new ArrayList<Result>();
+      List<Result> results = new ArrayList<Result>(nbRows);
       long currentScanResultSize = 0;
+      List<KeyValue> values = new ArrayList<KeyValue>();
       for (int i = 0; i < nbRows && currentScanResultSize < maxScannerResultSize; i++) {
         requestCount.incrementAndGet();
         // Collect values to be returned here
-        List<KeyValue> values = new ArrayList<KeyValue>();
         boolean moreRows = s.next(values);
         if (!values.isEmpty()) {
           for (KeyValue kv : values) {
@@ -1831,6 +1831,7 @@ public class HRegionServer implements HC
         if (!moreRows) {
           break;
         }
+        values.clear();
       }
       // Below is an ugly hack where we cast the InternalScanner to be a
       // HRegion.RegionScanner.  The alternative is to change InternalScanner