Index: src/java/org/apache/hadoop/hbase/regionserver/ColumnCount.java =================================================================== --- src/java/org/apache/hadoop/hbase/regionserver/ColumnCount.java (revision 937817) +++ src/java/org/apache/hadoop/hbase/regionserver/ColumnCount.java (working copy) @@ -97,6 +97,14 @@ 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 Index: src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java =================================================================== --- src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (revision 937817) +++ src/java/org/apache/hadoop/hbase/regionserver/HRegionServer.java (working copy) @@ -1898,12 +1898,12 @@ throw e; } this.leases.renewLease(scannerName); - List results = new ArrayList(); + List results = new ArrayList(nbRows); long currentScanResultSize = 0; + List values = new ArrayList(); for (int i = 0; i < nbRows && currentScanResultSize < maxScannerResultSize; i++) { requestCount.incrementAndGet(); // Collect values to be returned here - List values = new ArrayList(); boolean moreRows = s.next(values); if (!values.isEmpty()) { for (KeyValue kv : values) { @@ -1914,6 +1914,7 @@ 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 Index: src/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java =================================================================== --- src/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java (revision 937817) +++ src/java/org/apache/hadoop/hbase/regionserver/ExplicitColumnTracker.java (working copy) @@ -46,11 +46,11 @@ */ public class ExplicitColumnTracker implements ColumnTracker { - private int maxVersions; - private List columns; + private final int maxVersions; + private final List columns; + private final List columnsToReuse; private int index; private ColumnCount column; - private NavigableSet origColumns; /** * Default constructor. @@ -59,7 +59,11 @@ */ public ExplicitColumnTracker(NavigableSet columns, int maxVersions) { this.maxVersions = maxVersions; - this.origColumns = columns; + this.columns = new ArrayList(columns.size()); + this.columnsToReuse = new ArrayList(columns.size()); + for(byte [] column : columns) { + this.columnsToReuse.add(new ColumnCount(column,maxVersions)); + } reset(); } @@ -147,15 +151,16 @@ // 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 columns) { - this.columns = new ArrayList(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); } } }